summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Evan Rosky <erosky@google.com> 2022-03-30 23:52:15 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-03-30 23:52:15 +0000
commitb4749ccefa2aead6a298417a3346df9ddd618bd3 (patch)
tree549bb4db847a913ee117232b6cc3a3e89cc868fc
parent79373ac5ca4bf48ccef943d7c35aed59de4361d9 (diff)
parentda6af4048d82412b9edfca9514415703a72db6d8 (diff)
Merge "Hook up shell-transitions screenshotting for recents" into tm-dev
-rw-r--r--core/java/android/app/IActivityTaskManager.aidl6
-rw-r--r--packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java12
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java43
-rw-r--r--services/core/java/com/android/server/wm/Task.java11
4 files changed, 46 insertions, 26 deletions
diff --git a/core/java/android/app/IActivityTaskManager.aidl b/core/java/android/app/IActivityTaskManager.aidl
index 87b2417af53f..201473f4957e 100644
--- a/core/java/android/app/IActivityTaskManager.aidl
+++ b/core/java/android/app/IActivityTaskManager.aidl
@@ -268,6 +268,12 @@ interface IActivityTaskManager {
android.window.TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution);
/**
+ * @param taskId the id of the task to take a snapshot of
+ * @return a graphic buffer representing a screenshot of a task
+ */
+ android.window.TaskSnapshot takeTaskSnapshot(int taskId);
+
+ /**
* Return the user id of last resumed activity.
*/
int getLastResumedActivityUserId();
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
index 4894c498ec58..120b09a2ad31 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/RemoteTransitionCompat.java
@@ -47,6 +47,7 @@ import android.window.IRemoteTransition;
import android.window.IRemoteTransitionFinishedCallback;
import android.window.PictureInPictureSurfaceTransaction;
import android.window.RemoteTransition;
+import android.window.TaskSnapshot;
import android.window.TransitionFilter;
import android.window.TransitionInfo;
import android.window.WindowContainerToken;
@@ -322,7 +323,16 @@ public class RemoteTransitionCompat implements Parcelable {
}
@Override public ThumbnailData screenshotTask(int taskId) {
- return mWrapped != null ? mWrapped.screenshotTask(taskId) : null;
+ try {
+ final TaskSnapshot snapshot =
+ ActivityTaskManager.getService().takeTaskSnapshot(taskId);
+ if (snapshot != null) {
+ return new ThumbnailData(snapshot);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to screenshot task", e);
+ }
+ return null;
}
@Override public void setInputConsumerEnabled(boolean enabled) {
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 9267f2f6f921..14436bc4ed66 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -3599,25 +3599,41 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
mAmInternal.enforceCallingPermission(READ_FRAME_BUFFER, "getTaskSnapshot()");
final long ident = Binder.clearCallingIdentity();
try {
- return getTaskSnapshot(taskId, isLowResolution, true /* restoreFromDisk */);
+ final Task task;
+ synchronized (mGlobalLock) {
+ task = mRootWindowContainer.anyTaskForId(taskId,
+ MATCH_ATTACHED_TASK_OR_RECENT_TASKS);
+ if (task == null) {
+ Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found");
+ return null;
+ }
+ }
+ // 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);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
- private TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution,
- boolean restoreFromDisk) {
- final Task task;
- synchronized (mGlobalLock) {
- task = mRootWindowContainer.anyTaskForId(taskId,
- MATCH_ATTACHED_TASK_OR_RECENT_TASKS);
- if (task == null) {
- Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found");
- return null;
+ @Override
+ public TaskSnapshot takeTaskSnapshot(int taskId) {
+ mAmInternal.enforceCallingPermission(READ_FRAME_BUFFER, "takeTaskSnapshot()");
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mGlobalLock) {
+ final Task task = mRootWindowContainer.anyTaskForId(taskId,
+ MATCH_ATTACHED_TASK_OR_RECENT_TASKS);
+ if (task == null || !task.isVisible()) {
+ Slog.w(TAG, "takeTaskSnapshot: taskId=" + taskId + " not found or not visible");
+ return null;
+ }
+ return mWindowManager.mTaskSnapshotController.captureTaskSnapshot(
+ task, false /* snapshotHome */);
}
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
- // Don't call this while holding the lock as this operation might hit the disk.
- return task.getSnapshot(isLowResolution, restoreFromDisk);
}
/** Return the user id of the last resumed activity. */
@@ -6559,8 +6575,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
@Override
public TaskSnapshot getTaskSnapshotBlocking(
int taskId, boolean isLowResolution) {
- return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution,
- true /* restoreFromDisk */);
+ return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution);
}
@Override
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 5918a88d5736..6ab3916425f9 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -967,17 +967,6 @@ class Task extends TaskFragment {
|| targetWindowingMode == WINDOWING_MODE_FREEFORM;
}
- /**
- * DO NOT HOLD THE ACTIVITY MANAGER LOCK WHEN CALLING THIS METHOD!
- */
- TaskSnapshot getSnapshot(boolean isLowResolution, boolean restoreFromDisk) {
-
- // TODO: Move this to {@link TaskWindowContainerController} once recent tasks are more
- // synchronized between AM and WM.
- return mAtmService.mWindowManager.getTaskSnapshot(mTaskId, mUserId, isLowResolution,
- restoreFromDisk);
- }
-
void touchActiveTime() {
lastActiveTime = SystemClock.elapsedRealtime();
}