diff options
5 files changed, 20 insertions, 9 deletions
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl index fe75dd302beb..dc6825c85705 100644 --- a/core/java/android/app/IActivityTaskManager.aidl +++ b/core/java/android/app/IActivityTaskManager.aidl @@ -263,9 +263,12 @@ interface IActivityTaskManager { * @param taskId the id of the task to retrieve the sAutoapshots for * @param isLowResolution if set, if the snapshot needs to be loaded from disk, this will load * a reduced resolution of it, which is much faster + * @param takeSnapshotIfNeeded if set, call {@link #takeTaskSnapshot} to trigger the snapshot + if no cache exists. * @return a graphic buffer representing a screenshot of a task */ - android.window.TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution); + android.window.TaskSnapshot getTaskSnapshot( + int taskId, boolean isLowResolution, boolean takeSnapshotIfNeeded); /** * @param taskId the id of the task to take a snapshot of diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUtils.java index dc60bcf742ce..29434f73e84b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUtils.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/PipUtils.java @@ -116,7 +116,7 @@ public class PipUtils { if (taskId <= 0) return null; try { return ActivityTaskManager.getService().getTaskSnapshot( - taskId, isLowResolution); + taskId, isLowResolution, false /* takeSnapshotIfNeeded */); } catch (RemoteException e) { Log.e(TAG, "Failed to get task snapshot, taskId=" + taskId, e); return null; diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java index be3dfdcf05d5..c5beaa7ee0b1 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java @@ -137,12 +137,14 @@ public class ActivityManagerWrapper { } /** - * @return the task snapshot for the given {@param taskId}. + * @return a {@link ThumbnailData} with {@link TaskSnapshot} for the given {@param taskId}. + * The snapshot will be triggered if no cached {@link TaskSnapshot} exists. */ public @NonNull ThumbnailData getTaskThumbnail(int taskId, boolean isLowResolution) { TaskSnapshot snapshot = null; try { - snapshot = getService().getTaskSnapshot(taskId, isLowResolution); + snapshot = getService().getTaskSnapshot(taskId, isLowResolution, + true /* takeSnapshotIfNeeded */); } catch (RemoteException e) { Log.w(TAG, "Failed to retrieve task snapshot", e); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 7bc551b2aacc..5ae0f4722a20 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -3668,7 +3668,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } @Override - public TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution) { + public TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution, + boolean takeSnapshotIfNeeded) { mAmInternal.enforceCallingPermission(READ_FRAME_BUFFER, "getTaskSnapshot()"); final long ident = Binder.clearCallingIdentity(); try { @@ -3682,8 +3683,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } // Don't call this while holding the lock as this operation might hit the disk. - return mWindowManager.mTaskSnapshotController.getSnapshot(taskId, task.mUserId, - true /* restoreFromDisk */, isLowResolution); + TaskSnapshot taskSnapshot = mWindowManager.mTaskSnapshotController.getSnapshot(taskId, + task.mUserId, true /* restoreFromDisk */, isLowResolution); + if (taskSnapshot == null && takeSnapshotIfNeeded) { + taskSnapshot = takeTaskSnapshot(taskId); + } + return taskSnapshot; } finally { Binder.restoreCallingIdentity(ident); } @@ -6656,7 +6661,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public TaskSnapshot getTaskSnapshotBlocking( int taskId, boolean isLowResolution) { - return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution); + return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution, + false /* takeSnapshotIfNeeded */); } @Override diff --git a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java index 1708ed7d4686..83f375f85fa3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/RecentTasksTest.java @@ -1332,7 +1332,7 @@ public class RecentTasksTest extends WindowTestsBase { }); assertSecurityException(expectCallable, () -> mAtm.startActivityFromRecents(0, new Bundle())); - assertSecurityException(expectCallable, () -> mAtm.getTaskSnapshot(0, true)); + assertSecurityException(expectCallable, () -> mAtm.getTaskSnapshot(0, true, false)); assertSecurityException(expectCallable, () -> mAtm.registerTaskStackListener(null)); assertSecurityException(expectCallable, () -> mAtm.unregisterTaskStackListener(null)); |