diff options
| author | 2023-05-19 07:06:33 +0000 | |
|---|---|---|
| committer | 2023-05-19 07:06:33 +0000 | |
| commit | 02503f1111050f3bf314a018d37e2892dd8ff5ff (patch) | |
| tree | 8ef0623b7c57fed9cb874c68fc28ce5ecb20fcd1 | |
| parent | 429962dd902761f4fd9f1be5ebc006c451c3fa6a (diff) | |
| parent | 041a5abbd5ac8b0d279cde5e330dd4e56ab1b4d1 (diff) | |
Merge "Skip snapshot task when finishing activity for shell transition" into udc-dev
4 files changed, 24 insertions, 47 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index acfa30cb004e..d84c01309286 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -3560,7 +3560,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A // Note that RecentsAnimation will handle task snapshot while switching apps with // the best capture timing (e.g. IME window capture), // No need additional task capture while task is controlled by RecentsAnimation. - if (mAtmService.mWindowManager.mTaskSnapshotController != null + if (!mTransitionController.isShellTransitionsEnabled() && !task.isAnimatingByRecents()) { final ArraySet<Task> tasks = Sets.newArraySet(task); mAtmService.mWindowManager.mTaskSnapshotController.snapshotTasks(tasks); diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index 20ef0171358b..7e20b3bbe396 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -28,6 +28,7 @@ import android.graphics.Rect; import android.os.Environment; import android.os.Handler; import android.util.ArraySet; +import android.util.IntArray; import android.util.Slog; import android.view.Display; import android.window.ScreenCapture; @@ -37,8 +38,6 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.server.policy.WindowManagerPolicy.ScreenOffListener; import com.android.server.wm.BaseAppSnapshotPersister.PersistInfoProvider; -import com.google.android.collect.Sets; - import java.util.Set; /** @@ -58,7 +57,7 @@ class TaskSnapshotController extends AbsAppSnapshotController<Task, TaskSnapshot static final String SNAPSHOTS_DIRNAME = "snapshots"; private final TaskSnapshotPersister mPersister; - private final ArraySet<Task> mSkipClosingAppSnapshotTasks = new ArraySet<>(); + private final IntArray mSkipClosingAppSnapshotTasks = new IntArray(); private final ArraySet<Task> mTmpTasks = new ArraySet<>(); private final Handler mHandler = new Handler(); @@ -135,26 +134,6 @@ class TaskSnapshotController extends AbsAppSnapshotController<Task, TaskSnapshot } /** - * Called when the visibility of an app changes outside of the regular app transition flow. - */ - void notifyAppVisibilityChanged(ActivityRecord appWindowToken, boolean visible) { - if (!visible) { - handleClosingApps(Sets.newArraySet(appWindowToken)); - } - } - - private void handleClosingApps(ArraySet<ActivityRecord> closingApps) { - if (shouldDisableSnapshots()) { - return; - } - // We need to take a snapshot of the task if and only if all activities of the task are - // either closing or hidden. - getClosingTasks(closingApps, mTmpTasks); - snapshotTasks(mTmpTasks); - mSkipClosingAppSnapshotTasks.clear(); - } - - /** * Adds the given {@param tasks} to the list of tasks which should not have their snapshots * taken upon the next processing of the set of closing apps. The caller is responsible for * calling {@link #snapshotTasks} to ensure that the task has an up-to-date snapshot. @@ -164,7 +143,9 @@ class TaskSnapshotController extends AbsAppSnapshotController<Task, TaskSnapshot if (shouldDisableSnapshots()) { return; } - mSkipClosingAppSnapshotTasks.addAll(tasks); + for (Task task : tasks) { + mSkipClosingAppSnapshotTasks.add(task.mTaskId); + } } void snapshotTasks(ArraySet<Task> tasks) { @@ -272,31 +253,16 @@ class TaskSnapshotController extends AbsAppSnapshotController<Task, TaskSnapshot return source.getTaskDescription(); } - /** - * Retrieves all closing tasks based on the list of closing apps during an app transition. - */ - @VisibleForTesting - void getClosingTasks(ArraySet<ActivityRecord> closingApps, ArraySet<Task> outClosingTasks) { - outClosingTasks.clear(); - for (int i = closingApps.size() - 1; i >= 0; i--) { - final ActivityRecord activity = closingApps.valueAt(i); - final Task task = activity.getTask(); - if (task == null) continue; - - getClosingTasksInner(task, outClosingTasks); - } - } - void getClosingTasksInner(Task task, ArraySet<Task> outClosingTasks) { // Since RecentsAnimation will handle task snapshot while switching apps with the // best capture timing (e.g. IME window capture), // No need additional task capture while task is controlled by RecentsAnimation. if (isAnimatingByRecents(task)) { - mSkipClosingAppSnapshotTasks.add(task); + mSkipClosingAppSnapshotTasks.add(task.mTaskId); } // If the task of the app is not visible anymore, it means no other app in that task // is opening. Thus, the task is closing. - if (!task.isVisible() && !mSkipClosingAppSnapshotTasks.contains(task)) { + if (!task.isVisible() && mSkipClosingAppSnapshotTasks.indexOf(task.mTaskId) < 0) { outClosingTasks.add(task); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java index 7092b0b5ac34..6e52af1b4e7d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentsAnimationControllerTest.java @@ -298,8 +298,6 @@ public class RecentsAnimationControllerTest extends WindowTestsBase { assertTrue(mController.isAnimatingTask(activity.getTask())); spyOn(mWm.mTaskSnapshotController); - doNothing().when(mWm.mTaskSnapshotController).notifyAppVisibilityChanged(any(), - anyBoolean()); doReturn(mMockTaskSnapshot).when(mWm.mTaskSnapshotController).getSnapshot(anyInt(), anyInt(), eq(false) /* restoreFromDisk */, eq(false) /* isLowResolution */); mController.setDeferredCancel(true /* deferred */, true /* screenshot */); diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java index 4c7b0aa0714e..91256ee8a1c4 100644 --- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java @@ -75,7 +75,7 @@ public class TaskSnapshotControllerTest extends WindowTestsBase { final ArraySet<ActivityRecord> closingApps = new ArraySet<>(); closingApps.add(closingWindow.mActivityRecord); final ArraySet<Task> closingTasks = new ArraySet<>(); - mWm.mTaskSnapshotController.getClosingTasks(closingApps, closingTasks); + getClosingTasks(closingApps, closingTasks); assertEquals(1, closingTasks.size()); assertEquals(closingWindow.mActivityRecord.getTask(), closingTasks.valueAt(0)); } @@ -93,7 +93,7 @@ public class TaskSnapshotControllerTest extends WindowTestsBase { final ArraySet<ActivityRecord> closingApps = new ArraySet<>(); closingApps.add(closingWindow.mActivityRecord); final ArraySet<Task> closingTasks = new ArraySet<>(); - mWm.mTaskSnapshotController.getClosingTasks(closingApps, closingTasks); + getClosingTasks(closingApps, closingTasks); assertEquals(0, closingTasks.size()); } @@ -108,10 +108,23 @@ public class TaskSnapshotControllerTest extends WindowTestsBase { final ArraySet<Task> closingTasks = new ArraySet<>(); mWm.mTaskSnapshotController.addSkipClosingAppSnapshotTasks( Sets.newArraySet(closingWindow.mActivityRecord.getTask())); - mWm.mTaskSnapshotController.getClosingTasks(closingApps, closingTasks); + getClosingTasks(closingApps, closingTasks); assertEquals(0, closingTasks.size()); } + /** Retrieves all closing tasks based on the list of closing apps during an app transition. */ + private void getClosingTasks(ArraySet<ActivityRecord> closingApps, + ArraySet<Task> outClosingTasks) { + outClosingTasks.clear(); + for (int i = closingApps.size() - 1; i >= 0; i--) { + final ActivityRecord activity = closingApps.valueAt(i); + final Task task = activity.getTask(); + if (task == null) continue; + + mWm.mTaskSnapshotController.getClosingTasksInner(task, outClosingTasks); + } + } + @Test public void testGetSnapshotMode() { final WindowState disabledWindow = createWindow(null, |