Merge "Associate starting window with task once a TF is added" into tm-qpr-dev am: e99311a44a am: 6e58190477

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/19733103

Change-Id: I8fed9722d4b18afae890a68b38c5b3bef4f00bb8
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Riddle Hsu
2022-08-30 15:14:23 +00:00
committed by Automerger Merge Worker
3 changed files with 22 additions and 9 deletions

View File

@@ -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();

View File

@@ -1436,6 +1436,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();
}
}
}

View File

@@ -2869,6 +2869,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 */);
@@ -2890,7 +2891,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());
@@ -2898,7 +2898,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);
}