script-astra/Android/Sdk/sources/android-35/android/window/TaskFragmentCreationParams.java

381 lines
14 KiB
Java
Raw Normal View History

2025-01-20 15:15:20 +00:00
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.window;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static android.app.WindowConfiguration.WindowingMode;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.TestApi;
import android.content.pm.ActivityInfo.ScreenOrientation;
import android.graphics.Rect;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Data object for options to create TaskFragment with.
* @hide
*/
@TestApi
public final class TaskFragmentCreationParams implements Parcelable {
/** The organizer that will organize this TaskFragment. */
@NonNull
private final TaskFragmentOrganizerToken mOrganizer;
/**
* Unique token assigned from the client organizer to identify the {@link TaskFragmentInfo} when
* a new TaskFragment is created with this option.
*/
@NonNull
private final IBinder mFragmentToken;
/**
* Activity token used to identify the leaf Task to create the TaskFragment in. It has to belong
* to the same app as the root Activity of the target Task.
*/
@NonNull
private final IBinder mOwnerToken;
/**
* The initial relative bounds of the TaskFragment in parent coordinate.
* Fills parent if empty.
*/
@NonNull
private final Rect mInitialRelativeBounds = new Rect();
/** The initial windowing mode of the TaskFragment. Inherits from parent if not set. */
@WindowingMode
private final int mWindowingMode;
/**
* The fragment token of the paired primary TaskFragment.
* When it is set, the new TaskFragment will be positioned right above the paired TaskFragment.
* Otherwise, the new TaskFragment will be positioned on the top of the Task by default.
*
* This is different from {@link WindowContainerTransaction#setAdjacentTaskFragments} as we may
* set this when the pair of TaskFragments are stacked, while adjacent is only set on the pair
* of TaskFragments that are in split.
*
* This is needed in case we need to launch a placeholder Activity to split below a transparent
* always-expand Activity.
*
* This should not be used with {@link #mPairedActivityToken}.
*/
@Nullable
private final IBinder mPairedPrimaryFragmentToken;
/**
* The Activity token to place the new TaskFragment on top of.
* When it is set, the new TaskFragment will be positioned right above the target Activity.
* Otherwise, the new TaskFragment will be positioned on the top of the Task by default.
*
* This is needed in case we need to place an Activity into TaskFragment to launch placeholder
* below a transparent always-expand Activity, or when there is another Intent being started in
* a TaskFragment above.
*
* This should not be used with {@link #mPairedPrimaryFragmentToken}.
*/
@Nullable
private final IBinder mPairedActivityToken;
/**
* If {@code true}, transitions are allowed even if the TaskFragment is empty. If
* {@code false}, transitions will wait until the TaskFragment becomes non-empty or other
* conditions are met. Default to {@code false}.
*/
private final boolean mAllowTransitionWhenEmpty;
/**
* The override orientation for the TaskFragment. This is effective only for a system organizer.
* The value is ignored otherwise. Default to {@code SCREEN_ORIENTATION_UNSPECIFIED}.
*
* @see TaskFragmentOrganizer#registerOrganizer(boolean)
*/
private final @ScreenOrientation int mOverrideOrientation;
private TaskFragmentCreationParams(
@NonNull TaskFragmentOrganizerToken organizer, @NonNull IBinder fragmentToken,
@NonNull IBinder ownerToken, @NonNull Rect initialRelativeBounds,
@WindowingMode int windowingMode, @Nullable IBinder pairedPrimaryFragmentToken,
@Nullable IBinder pairedActivityToken, boolean allowTransitionWhenEmpty,
@ScreenOrientation int overrideOrientation) {
if (pairedPrimaryFragmentToken != null && pairedActivityToken != null) {
throw new IllegalArgumentException("pairedPrimaryFragmentToken and"
+ " pairedActivityToken should not be set at the same time.");
}
mOrganizer = organizer;
mFragmentToken = fragmentToken;
mOwnerToken = ownerToken;
mInitialRelativeBounds.set(initialRelativeBounds);
mWindowingMode = windowingMode;
mPairedPrimaryFragmentToken = pairedPrimaryFragmentToken;
mPairedActivityToken = pairedActivityToken;
mAllowTransitionWhenEmpty = allowTransitionWhenEmpty;
mOverrideOrientation = overrideOrientation;
}
@NonNull
public TaskFragmentOrganizerToken getOrganizer() {
return mOrganizer;
}
@NonNull
public IBinder getFragmentToken() {
return mFragmentToken;
}
@NonNull
public IBinder getOwnerToken() {
return mOwnerToken;
}
@NonNull
public Rect getInitialRelativeBounds() {
return mInitialRelativeBounds;
}
@WindowingMode
public int getWindowingMode() {
return mWindowingMode;
}
/**
* TODO(b/232476698): remove the hide with adding CTS for this in next release.
* @hide
*/
@Nullable
public IBinder getPairedPrimaryFragmentToken() {
return mPairedPrimaryFragmentToken;
}
/**
* TODO(b/232476698): remove the hide with adding CTS for this in next release.
* @hide
*/
@Nullable
public IBinder getPairedActivityToken() {
return mPairedActivityToken;
}
/** @hide */
public boolean getAllowTransitionWhenEmpty() {
return mAllowTransitionWhenEmpty;
}
/** @hide */
public @ScreenOrientation int getOverrideOrientation() {
return mOverrideOrientation;
}
private TaskFragmentCreationParams(Parcel in) {
mOrganizer = TaskFragmentOrganizerToken.CREATOR.createFromParcel(in);
mFragmentToken = in.readStrongBinder();
mOwnerToken = in.readStrongBinder();
mInitialRelativeBounds.readFromParcel(in);
mWindowingMode = in.readInt();
mPairedPrimaryFragmentToken = in.readStrongBinder();
mPairedActivityToken = in.readStrongBinder();
mAllowTransitionWhenEmpty = in.readBoolean();
mOverrideOrientation = in.readInt();
}
/** @hide */
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
mOrganizer.writeToParcel(dest, flags);
dest.writeStrongBinder(mFragmentToken);
dest.writeStrongBinder(mOwnerToken);
mInitialRelativeBounds.writeToParcel(dest, flags);
dest.writeInt(mWindowingMode);
dest.writeStrongBinder(mPairedPrimaryFragmentToken);
dest.writeStrongBinder(mPairedActivityToken);
dest.writeBoolean(mAllowTransitionWhenEmpty);
dest.writeInt(mOverrideOrientation);
}
@NonNull
public static final Creator<TaskFragmentCreationParams> CREATOR =
new Creator<TaskFragmentCreationParams>() {
@Override
public TaskFragmentCreationParams createFromParcel(Parcel in) {
return new TaskFragmentCreationParams(in);
}
@Override
public TaskFragmentCreationParams[] newArray(int size) {
return new TaskFragmentCreationParams[size];
}
};
@Override
public String toString() {
return "TaskFragmentCreationParams{"
+ " organizer=" + mOrganizer
+ " fragmentToken=" + mFragmentToken
+ " ownerToken=" + mOwnerToken
+ " initialRelativeBounds=" + mInitialRelativeBounds
+ " windowingMode=" + mWindowingMode
+ " pairedFragmentToken=" + mPairedPrimaryFragmentToken
+ " pairedActivityToken=" + mPairedActivityToken
+ " allowTransitionWhenEmpty=" + mAllowTransitionWhenEmpty
+ " overrideOrientation=" + mOverrideOrientation
+ "}";
}
/** @hide */
@Override
public int describeContents() {
return 0;
}
/** Builder to construct the options to create TaskFragment with. */
public static final class Builder {
@NonNull
private final TaskFragmentOrganizerToken mOrganizer;
@NonNull
private final IBinder mFragmentToken;
@NonNull
private final IBinder mOwnerToken;
@NonNull
private final Rect mInitialRelativeBounds = new Rect();
@WindowingMode
private int mWindowingMode = WINDOWING_MODE_UNDEFINED;
@Nullable
private IBinder mPairedPrimaryFragmentToken;
@Nullable
private IBinder mPairedActivityToken;
private boolean mAllowTransitionWhenEmpty;
private @ScreenOrientation int mOverrideOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
public Builder(@NonNull TaskFragmentOrganizerToken organizer,
@NonNull IBinder fragmentToken, @NonNull IBinder ownerToken) {
mOrganizer = organizer;
mFragmentToken = fragmentToken;
mOwnerToken = ownerToken;
}
/**
* Sets the initial relative bounds for the TaskFragment in parent coordinate.
* Set to empty to fill parent.
*/
@NonNull
public Builder setInitialRelativeBounds(@NonNull Rect bounds) {
mInitialRelativeBounds.set(bounds);
return this;
}
/** Sets the initial windowing mode for the TaskFragment. */
@NonNull
public Builder setWindowingMode(@WindowingMode int windowingMode) {
mWindowingMode = windowingMode;
return this;
}
/**
* Sets the fragment token of the paired primary TaskFragment.
* When it is set, the new TaskFragment will be positioned right above the paired
* TaskFragment. Otherwise, the new TaskFragment will be positioned on the top of the Task
* by default.
*
* This is needed in case we need to launch a placeholder Activity to split below a
* transparent always-expand Activity.
*
* This should not be used with {@link #setPairedActivityToken}.
*
* TODO(b/232476698): remove the hide with adding CTS for this in next release.
* @hide
*/
@NonNull
public Builder setPairedPrimaryFragmentToken(@Nullable IBinder fragmentToken) {
mPairedPrimaryFragmentToken = fragmentToken;
return this;
}
/**
* Sets the Activity token to place the new TaskFragment on top of.
* When it is set, the new TaskFragment will be positioned right above the target Activity.
* Otherwise, the new TaskFragment will be positioned on the top of the Task by default.
*
* This is needed in case we need to place an Activity into TaskFragment to launch
* placeholder below a transparent always-expand Activity, or when there is another Intent
* being started in a TaskFragment above.
*
* This should not be used with {@link #setPairedPrimaryFragmentToken}.
*
* TODO(b/232476698): remove the hide with adding CTS for this in next release.
* @hide
*/
@NonNull
public Builder setPairedActivityToken(@Nullable IBinder activityToken) {
mPairedActivityToken = activityToken;
return this;
}
/**
* Sets whether transitions are allowed when the TaskFragment is empty. If {@code true},
* transitions are allowed when the TaskFragment is empty. If {@code false}, transitions
* will wait until the TaskFragment becomes non-empty or other conditions are met. Default
* to {@code false}.
*
* @hide
*/
@NonNull
public Builder setAllowTransitionWhenEmpty(boolean allowTransitionWhenEmpty) {
mAllowTransitionWhenEmpty = allowTransitionWhenEmpty;
return this;
}
/**
* Sets the override orientation for the TaskFragment. This is effective only for a system
* organizer. The value is ignored otherwise. Default to
* {@code SCREEN_ORIENTATION_UNSPECIFIED}.
*
* @see TaskFragmentOrganizer#registerOrganizer(boolean)
*
* @hide
*/
@RequiresPermission(value = android.Manifest.permission.MANAGE_ACTIVITY_TASKS)
@NonNull
public Builder setOverrideOrientation(@ScreenOrientation int overrideOrientation) {
mOverrideOrientation = overrideOrientation;
return this;
}
/** Constructs the options to create TaskFragment with. */
@NonNull
public TaskFragmentCreationParams build() {
return new TaskFragmentCreationParams(mOrganizer, mFragmentToken, mOwnerToken,
mInitialRelativeBounds, mWindowingMode, mPairedPrimaryFragmentToken,
mPairedActivityToken, mAllowTransitionWhenEmpty, mOverrideOrientation);
}
}
}