From 7baaa82e0ac169d0781c1b7d1e674ed113b31783 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Fri, 17 May 2024 08:04:42 +0000 Subject: Fix snapshot window jump due to top window has another cutout mode That jumping is because the WindowFrame of top fullscreen window isn't align with app main window. In core there only check app main window's cutout for layout, so for snapshot starting window, it should use app's main window's cutout instead of top opaque window. Another reason there doesn't need to use getTopFullscreenOpaqueWindow is because core won't ask to create snapshot starting window if the size/orientation of snapshot isn't align with the window configuration, so the SnapshotDrawerUtils will not needs to draw background and bars, since the aspectRatioMismatch should always return false. Bug: 341020277 Test: manual, create a second window for an activity, verify snapshot starting window won't jump when hot launch the app from background. Change-Id: I4c6b0ccacc79730552cbf9b4928b5c842f4feb1e --- .../android/server/wm/AbsAppSnapshotController.java | 12 ++++++------ .../java/com/android/server/wm/ActivityRecord.java | 14 -------------- .../server/wm/StartingSurfaceController.java | 14 +++----------- services/core/java/com/android/server/wm/Task.java | 9 ++++----- .../com/android/server/wm/ActivityRecordTests.java | 21 +-------------------- 5 files changed, 14 insertions(+), 56 deletions(-) diff --git a/services/core/java/com/android/server/wm/AbsAppSnapshotController.java b/services/core/java/com/android/server/wm/AbsAppSnapshotController.java index fd4b06148c5f..0e0b78fb3206 100644 --- a/services/core/java/com/android/server/wm/AbsAppSnapshotController.java +++ b/services/core/java/com/android/server/wm/AbsAppSnapshotController.java @@ -466,17 +466,17 @@ abstract class AbsAppSnapshotController= 0; i--) { - final WindowState win = mChildren.get(i); - if (win != null && win.mAttrs.isFullscreen() && !win.isFullyTransparent()) { - return win; - } - } - return null; - } - WindowState findMainWindow() { return findMainWindow(true); } diff --git a/services/core/java/com/android/server/wm/StartingSurfaceController.java b/services/core/java/com/android/server/wm/StartingSurfaceController.java index 05eeeb381d8a..cff40c768381 100644 --- a/services/core/java/com/android/server/wm/StartingSurfaceController.java +++ b/services/core/java/com/android/server/wm/StartingSurfaceController.java @@ -140,23 +140,15 @@ public class StartingSurfaceController { } StartingSurface createTaskSnapshotSurface(ActivityRecord activity, TaskSnapshot taskSnapshot) { - final WindowState topFullscreenOpaqueWindow; final Task task = activity.getTask(); if (task == null) { Slog.w(TAG, "TaskSnapshotSurface.create: Failed to find task for activity=" + activity); return null; } - final ActivityRecord topFullscreenActivity = task.getTopFullscreenActivity(); - if (topFullscreenActivity == null) { - Slog.w(TAG, "TaskSnapshotSurface.create: Failed to find top fullscreen for task=" - + task); - return null; - } - topFullscreenOpaqueWindow = topFullscreenActivity.getTopFullscreenOpaqueWindow(); - if (topFullscreenOpaqueWindow == null) { - Slog.w(TAG, "TaskSnapshotSurface.create: no opaque window in " - + topFullscreenActivity); + final WindowState mainWindow = activity.findMainWindow(false); + if (mainWindow == null) { + Slog.w(TAG, "TaskSnapshotSurface.create: no main window in " + activity); return null; } if (activity.mDisplayContent.getRotation() != taskSnapshot.getRotation()) { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index a555388ab233..e8025276df85 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3626,12 +3626,11 @@ class Task extends TaskFragment { info.taskInfo.configuration.setTo(activity.getConfiguration()); final ActivityRecord topFullscreenActivity = getTopFullscreenActivity(); if (topFullscreenActivity != null) { - final WindowState topFullscreenOpaqueWindow = - topFullscreenActivity.getTopFullscreenOpaqueWindow(); - if (topFullscreenOpaqueWindow != null) { + final WindowState mainWindow = topFullscreenActivity.findMainWindow(false); + if (mainWindow != null) { info.topOpaqueWindowInsetsState = - topFullscreenOpaqueWindow.getInsetsStateWithVisibilityOverride(); - info.topOpaqueWindowLayoutParams = topFullscreenOpaqueWindow.getAttrs(); + mainWindow.getInsetsStateWithVisibilityOverride(); + info.topOpaqueWindowLayoutParams = mainWindow.getAttrs(); } } return info; 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 70319754253b..4a9760bc3317 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -2057,7 +2057,7 @@ public class ActivityRecordTests extends WindowTestsBase { final ActivityRecord activity = createActivityWithTask(); // TaskSnapshotSurface requires a fullscreen opaque window. final WindowManager.LayoutParams params = new WindowManager.LayoutParams( - WindowManager.LayoutParams.TYPE_APPLICATION_STARTING); + TYPE_BASE_APPLICATION); params.width = params.height = WindowManager.LayoutParams.MATCH_PARENT; final TestWindowState w = new TestWindowState( mAtm.mWindowManager, getTestSession(), new TestIWindow(), params, activity); @@ -2504,25 +2504,6 @@ public class ActivityRecordTests extends WindowTestsBase { activity.removeImmediately(); } - @Test - @Presubmit - public void testGetTopFullscreenOpaqueWindow() { - final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); - assertNull(activity.getTopFullscreenOpaqueWindow()); - - final WindowState window1 = createWindow(null, TYPE_BASE_APPLICATION, activity, "window1"); - final WindowState window11 = createWindow(null, TYPE_APPLICATION, activity, "window11"); - final WindowState window12 = createWindow(null, TYPE_APPLICATION, activity, "window12"); - assertEquals(window12, activity.getTopFullscreenOpaqueWindow()); - window12.mAttrs.width = 500; - assertEquals(window11, activity.getTopFullscreenOpaqueWindow()); - window11.mAttrs.width = 500; - assertEquals(window1, activity.getTopFullscreenOpaqueWindow()); - window1.mAttrs.alpha = 0f; - assertNull(activity.getTopFullscreenOpaqueWindow()); - activity.removeImmediately(); - } - @SetupWindows(addWindows = W_ACTIVITY) @Test public void testLandscapeSeascapeRotationByApp() { -- cgit v1.2.3-59-g8ed1b