diff options
3 files changed, 22 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 2e3096265b53..f7482c7e673a 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -1582,13 +1582,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A if (newParent != null && isState(RESUMED)) { newParent.setResumedActivity(this, "onParentChanged"); - if (mStartingWindow != null && mStartingData != null - && mStartingData.mAssociatedTask == null && newParent.isEmbedded()) { - // The starting window should keep covering its task when the activity is - // reparented to a task fragment that may not fill the task bounds. - associateStartingDataWithTask(); - attachStartingSurfaceToAssociatedTask(); - } mImeInsetsFrozenUntilStartInput = false; } @@ -2679,14 +2672,17 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } } + /** Called when the starting window is added to this activity. */ void attachStartingWindow(@NonNull WindowState startingWindow) { startingWindow.mStartingData = mStartingData; mStartingWindow = startingWindow; + // The snapshot type may have called associateStartingDataWithTask(). if (mStartingData != null && mStartingData.mAssociatedTask != null) { attachStartingSurfaceToAssociatedTask(); } } + /** Makes starting window always fill the associated task. */ private void attachStartingSurfaceToAssociatedTask() { // Associate the configuration of starting window with the task. overrideConfigurationPropagation(mStartingWindow, mStartingData.mAssociatedTask); @@ -2694,6 +2690,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A mStartingData.mAssociatedTask.mSurfaceControl); } + /** Called when the starting window is not added yet but its data is known to fill the task. */ private void associateStartingDataWithTask() { mStartingData.mAssociatedTask = task; task.forAllActivities(r -> { @@ -2703,6 +2700,16 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A }); } + /** Associates and attaches an added starting window to the current task. */ + void associateStartingWindowWithTaskIfNeeded() { + if (mStartingWindow == null || mStartingData == null + || mStartingData.mAssociatedTask != null) { + return; + } + associateStartingDataWithTask(); + attachStartingSurfaceToAssociatedTask(); + } + void removeStartingWindow() { boolean prevEligibleForLetterboxEducation = isEligibleForLetterboxEducation(); diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 75552e079575..90946a73bade 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -1433,6 +1433,13 @@ class Task extends TaskFragment { final TaskFragment childTaskFrag = child.asTaskFragment(); if (childTaskFrag != null && childTaskFrag.asTask() == null) { childTaskFrag.setMinDimensions(mMinWidth, mMinHeight); + + // The starting window should keep covering its task when a pure TaskFragment is added + // because its bounds may not fill the task. + final ActivityRecord top = getTopMostActivity(); + if (top != null) { + top.associateStartingWindowWithTaskIfNeeded(); + } } } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 8b350f4d0ac7..aa5d9156dce2 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -2868,6 +2868,7 @@ public class ActivityRecordTests extends WindowTestsBase { mAtm, null /* fragmentToken */, false /* createdByOrganizer */); fragmentSetup.accept(taskFragment1, new Rect(0, 0, width / 2, height)); task.addChild(taskFragment1, POSITION_TOP); + assertEquals(task, activity1.mStartingData.mAssociatedTask); final TaskFragment taskFragment2 = new TaskFragment( mAtm, null /* fragmentToken */, false /* createdByOrganizer */); @@ -2889,7 +2890,6 @@ public class ActivityRecordTests extends WindowTestsBase { eq(task.mSurfaceControl)); assertEquals(activity1.mStartingData, startingWindow.mStartingData); assertEquals(task.mSurfaceControl, startingWindow.getAnimationLeashParent()); - assertEquals(task, activity1.mStartingData.mAssociatedTask); assertEquals(taskFragment1.getBounds(), activity1.getBounds()); // The activity was resized by task fragment, but starting window must still cover the task. assertEquals(taskBounds, activity1.mStartingWindow.getBounds()); @@ -2897,7 +2897,6 @@ public class ActivityRecordTests extends WindowTestsBase { // The starting window is only removed when all embedded activities are drawn. final WindowState activityWindow = mock(WindowState.class); activity1.onFirstWindowDrawn(activityWindow); - assertNotNull(activity1.mStartingWindow); activity2.onFirstWindowDrawn(activityWindow); assertNull(activity1.mStartingWindow); } |