Loading core/java/android/window/TaskFragmentInfo.java +19 −2 Original line number Diff line number Diff line Loading @@ -102,6 +102,8 @@ public final class TaskFragmentInfo implements Parcelable { @NonNull private final Point mMinimumDimensions = new Point(); private final boolean mIsTopNonFishingChild; /** @hide */ public TaskFragmentInfo( @NonNull IBinder fragmentToken, @NonNull WindowContainerToken token, Loading @@ -110,7 +112,7 @@ public final class TaskFragmentInfo implements Parcelable { @NonNull List<IBinder> inRequestedTaskFragmentActivities, @NonNull Point positionInParent, boolean isTaskClearedForReuse, boolean isTaskFragmentClearedForPip, boolean isClearedForReorderActivityToFront, @NonNull Point minimumDimensions) { @NonNull Point minimumDimensions, boolean isTopNonFinishingChild) { mFragmentToken = requireNonNull(fragmentToken); mToken = requireNonNull(token); mConfiguration.setTo(configuration); Loading @@ -123,6 +125,7 @@ public final class TaskFragmentInfo implements Parcelable { mIsTaskFragmentClearedForPip = isTaskFragmentClearedForPip; mIsClearedForReorderActivityToFront = isClearedForReorderActivityToFront; mMinimumDimensions.set(minimumDimensions); mIsTopNonFishingChild = isTopNonFinishingChild; } @NonNull Loading Loading @@ -211,6 +214,16 @@ public final class TaskFragmentInfo implements Parcelable { return mMinimumDimensions.y; } /** * Indicates that this TaskFragment is the top non-finishing child of its parent container * among all Activities and TaskFragment siblings. * * @hide */ public boolean isTopNonFinishingChild() { return mIsTopNonFishingChild; } /** * Returns {@code true} if the parameters that are important for task fragment organizers are * equal between this {@link TaskFragmentInfo} and {@param that}. Loading @@ -236,7 +249,8 @@ public final class TaskFragmentInfo implements Parcelable { && mIsTaskClearedForReuse == that.mIsTaskClearedForReuse && mIsTaskFragmentClearedForPip == that.mIsTaskFragmentClearedForPip && mIsClearedForReorderActivityToFront == that.mIsClearedForReorderActivityToFront && mMinimumDimensions.equals(that.mMinimumDimensions); && mMinimumDimensions.equals(that.mMinimumDimensions) && mIsTopNonFishingChild == that.mIsTopNonFishingChild; } private TaskFragmentInfo(Parcel in) { Loading @@ -252,6 +266,7 @@ public final class TaskFragmentInfo implements Parcelable { mIsTaskFragmentClearedForPip = in.readBoolean(); mIsClearedForReorderActivityToFront = in.readBoolean(); mMinimumDimensions.readFromParcel(in); mIsTopNonFishingChild = in.readBoolean(); } /** @hide */ Loading @@ -269,6 +284,7 @@ public final class TaskFragmentInfo implements Parcelable { dest.writeBoolean(mIsTaskFragmentClearedForPip); dest.writeBoolean(mIsClearedForReorderActivityToFront); mMinimumDimensions.writeToParcel(dest, flags); dest.writeBoolean(mIsTopNonFishingChild); } @NonNull Loading Loading @@ -299,6 +315,7 @@ public final class TaskFragmentInfo implements Parcelable { + " isTaskFragmentClearedForPip=" + mIsTaskFragmentClearedForPip + " mIsClearedForReorderActivityToFront=" + mIsClearedForReorderActivityToFront + " minimumDimensions=" + mMinimumDimensions + " isTopNonFinishingChild=" + mIsTopNonFishingChild + "}"; } Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +1 −3 Original line number Diff line number Diff line Loading @@ -2759,9 +2759,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen // in the same task, the overlay will be dismissed in case an activity above // the overlay is dismissed and the overlay is shown unexpectedly. for (final TaskFragmentContainer overlayContainer : overlayContainers) { final boolean isTopNonFinishingOverlay = overlayContainer.equals( overlayContainer.getTaskContainer().getTopNonFinishingTaskFragmentContainer( true /* includePin */, true /* includeOverlay */)); final boolean isTopNonFinishingOverlay = overlayContainer.isTopNonFinishingChild(); final boolean areInSameTask = taskId == overlayContainer.getTaskId(); final boolean haveSameTag = overlayTag.equals(overlayContainer.getOverlayTag()); if (!associateLaunchingActivity && overlayContainer.isAlwaysOnTopOverlay() Loading libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentContainer.java +7 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,13 @@ class TaskFragmentContainer { return mInfo != null && mInfo.isVisible(); } /** * See {@link TaskFragmentInfo#isTopNonFinishingChild()} */ boolean isTopNonFinishingChild() { return mInfo != null && mInfo.isTopNonFinishingChild(); } /** Whether the TaskFragment is in an intermediate state waiting for the server update.*/ boolean isInIntermediateState() { if (mInfo == null) { Loading libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/EmbeddingTestUtils.java +23 −1 Original line number Diff line number Diff line Loading @@ -163,12 +163,14 @@ public class EmbeddingTestUtils { } /** Creates a mock TaskFragmentInfo for the given TaskFragment. */ @NonNull static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container, @NonNull Activity activity) { return createMockTaskFragmentInfo(container, activity, true /* isVisible */); } /** Creates a mock TaskFragmentInfo for the given TaskFragment. */ @NonNull static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container, @NonNull Activity activity, boolean isVisible) { return new TaskFragmentInfo(container.getTaskFragmentToken(), Loading @@ -182,7 +184,27 @@ public class EmbeddingTestUtils { false /* isTaskClearedForReuse */, false /* isTaskFragmentClearedForPip */, false /* isClearedForReorderActivityToFront */, new Point()); new Point(), false /* isTopChild */); } /** Creates a mock TaskFragmentInfo for the given TaskFragment. */ @NonNull static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container, @NonNull Activity activity, boolean isVisible, boolean isOnTop) { return new TaskFragmentInfo(container.getTaskFragmentToken(), mock(WindowContainerToken.class), new Configuration(), 1, isVisible, Collections.singletonList(activity.getActivityToken()), new ArrayList<>(), new Point(), false /* isTaskClearedForReuse */, false /* isTaskFragmentClearedForPip */, false /* isClearedForReorderActivityToFront */, new Point(), isOnTop); } static ActivityInfo createActivityInfoWithMinDimensions() { Loading libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizerTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ public class JetpackTaskFragmentOrganizerTest { mock(WindowContainerToken.class), new Configuration(), 0 /* runningActivityCount */, false /* isVisible */, new ArrayList<>(), new ArrayList<>(), new Point(), false /* isTaskClearedForReuse */, false /* isTaskFragmentClearedForPip */, false /* isClearedForReorderActivityToFront */, new Point()); false /* isClearedForReorderActivityToFront */, new Point(), false /* isTopChild */); } } Loading
core/java/android/window/TaskFragmentInfo.java +19 −2 Original line number Diff line number Diff line Loading @@ -102,6 +102,8 @@ public final class TaskFragmentInfo implements Parcelable { @NonNull private final Point mMinimumDimensions = new Point(); private final boolean mIsTopNonFishingChild; /** @hide */ public TaskFragmentInfo( @NonNull IBinder fragmentToken, @NonNull WindowContainerToken token, Loading @@ -110,7 +112,7 @@ public final class TaskFragmentInfo implements Parcelable { @NonNull List<IBinder> inRequestedTaskFragmentActivities, @NonNull Point positionInParent, boolean isTaskClearedForReuse, boolean isTaskFragmentClearedForPip, boolean isClearedForReorderActivityToFront, @NonNull Point minimumDimensions) { @NonNull Point minimumDimensions, boolean isTopNonFinishingChild) { mFragmentToken = requireNonNull(fragmentToken); mToken = requireNonNull(token); mConfiguration.setTo(configuration); Loading @@ -123,6 +125,7 @@ public final class TaskFragmentInfo implements Parcelable { mIsTaskFragmentClearedForPip = isTaskFragmentClearedForPip; mIsClearedForReorderActivityToFront = isClearedForReorderActivityToFront; mMinimumDimensions.set(minimumDimensions); mIsTopNonFishingChild = isTopNonFinishingChild; } @NonNull Loading Loading @@ -211,6 +214,16 @@ public final class TaskFragmentInfo implements Parcelable { return mMinimumDimensions.y; } /** * Indicates that this TaskFragment is the top non-finishing child of its parent container * among all Activities and TaskFragment siblings. * * @hide */ public boolean isTopNonFinishingChild() { return mIsTopNonFishingChild; } /** * Returns {@code true} if the parameters that are important for task fragment organizers are * equal between this {@link TaskFragmentInfo} and {@param that}. Loading @@ -236,7 +249,8 @@ public final class TaskFragmentInfo implements Parcelable { && mIsTaskClearedForReuse == that.mIsTaskClearedForReuse && mIsTaskFragmentClearedForPip == that.mIsTaskFragmentClearedForPip && mIsClearedForReorderActivityToFront == that.mIsClearedForReorderActivityToFront && mMinimumDimensions.equals(that.mMinimumDimensions); && mMinimumDimensions.equals(that.mMinimumDimensions) && mIsTopNonFishingChild == that.mIsTopNonFishingChild; } private TaskFragmentInfo(Parcel in) { Loading @@ -252,6 +266,7 @@ public final class TaskFragmentInfo implements Parcelable { mIsTaskFragmentClearedForPip = in.readBoolean(); mIsClearedForReorderActivityToFront = in.readBoolean(); mMinimumDimensions.readFromParcel(in); mIsTopNonFishingChild = in.readBoolean(); } /** @hide */ Loading @@ -269,6 +284,7 @@ public final class TaskFragmentInfo implements Parcelable { dest.writeBoolean(mIsTaskFragmentClearedForPip); dest.writeBoolean(mIsClearedForReorderActivityToFront); mMinimumDimensions.writeToParcel(dest, flags); dest.writeBoolean(mIsTopNonFishingChild); } @NonNull Loading Loading @@ -299,6 +315,7 @@ public final class TaskFragmentInfo implements Parcelable { + " isTaskFragmentClearedForPip=" + mIsTaskFragmentClearedForPip + " mIsClearedForReorderActivityToFront=" + mIsClearedForReorderActivityToFront + " minimumDimensions=" + mMinimumDimensions + " isTopNonFinishingChild=" + mIsTopNonFishingChild + "}"; } Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +1 −3 Original line number Diff line number Diff line Loading @@ -2759,9 +2759,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen // in the same task, the overlay will be dismissed in case an activity above // the overlay is dismissed and the overlay is shown unexpectedly. for (final TaskFragmentContainer overlayContainer : overlayContainers) { final boolean isTopNonFinishingOverlay = overlayContainer.equals( overlayContainer.getTaskContainer().getTopNonFinishingTaskFragmentContainer( true /* includePin */, true /* includeOverlay */)); final boolean isTopNonFinishingOverlay = overlayContainer.isTopNonFinishingChild(); final boolean areInSameTask = taskId == overlayContainer.getTaskId(); final boolean haveSameTag = overlayTag.equals(overlayContainer.getOverlayTag()); if (!associateLaunchingActivity && overlayContainer.isAlwaysOnTopOverlay() Loading
libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentContainer.java +7 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,13 @@ class TaskFragmentContainer { return mInfo != null && mInfo.isVisible(); } /** * See {@link TaskFragmentInfo#isTopNonFinishingChild()} */ boolean isTopNonFinishingChild() { return mInfo != null && mInfo.isTopNonFinishingChild(); } /** Whether the TaskFragment is in an intermediate state waiting for the server update.*/ boolean isInIntermediateState() { if (mInfo == null) { Loading
libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/EmbeddingTestUtils.java +23 −1 Original line number Diff line number Diff line Loading @@ -163,12 +163,14 @@ public class EmbeddingTestUtils { } /** Creates a mock TaskFragmentInfo for the given TaskFragment. */ @NonNull static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container, @NonNull Activity activity) { return createMockTaskFragmentInfo(container, activity, true /* isVisible */); } /** Creates a mock TaskFragmentInfo for the given TaskFragment. */ @NonNull static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container, @NonNull Activity activity, boolean isVisible) { return new TaskFragmentInfo(container.getTaskFragmentToken(), Loading @@ -182,7 +184,27 @@ public class EmbeddingTestUtils { false /* isTaskClearedForReuse */, false /* isTaskFragmentClearedForPip */, false /* isClearedForReorderActivityToFront */, new Point()); new Point(), false /* isTopChild */); } /** Creates a mock TaskFragmentInfo for the given TaskFragment. */ @NonNull static TaskFragmentInfo createMockTaskFragmentInfo(@NonNull TaskFragmentContainer container, @NonNull Activity activity, boolean isVisible, boolean isOnTop) { return new TaskFragmentInfo(container.getTaskFragmentToken(), mock(WindowContainerToken.class), new Configuration(), 1, isVisible, Collections.singletonList(activity.getActivityToken()), new ArrayList<>(), new Point(), false /* isTaskClearedForReuse */, false /* isTaskFragmentClearedForPip */, false /* isClearedForReorderActivityToFront */, new Point(), isOnTop); } static ActivityInfo createActivityInfoWithMinDimensions() { Loading
libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/JetpackTaskFragmentOrganizerTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -114,6 +114,7 @@ public class JetpackTaskFragmentOrganizerTest { mock(WindowContainerToken.class), new Configuration(), 0 /* runningActivityCount */, false /* isVisible */, new ArrayList<>(), new ArrayList<>(), new Point(), false /* isTaskClearedForReuse */, false /* isTaskFragmentClearedForPip */, false /* isClearedForReorderActivityToFront */, new Point()); false /* isClearedForReorderActivityToFront */, new Point(), false /* isTopChild */); } }