summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author wilsonshih <wilsonshih@google.com> 2024-02-06 13:14:24 +0800
committer wilsonshih <wilsonshih@google.com> 2024-02-22 11:02:21 +0000
commite0138fc3e5b09c7887a59f6a2ba317d58837aae9 (patch)
tree99f3d3a807dbfdef3b84296472076a131e5c1666
parent12e867a96d0d1b4efb580b8c43e51f2b7afff557 (diff)
Start activity under screenshot.
Provides an internal API for start activity with initially under screenshot, the screenshot will be removed either when transition start or abort. Bug: 326143814 Test: try launch app with internal api, verify screenshot will occur before transition ready. Change-Id: Ia96dfc71974ca20cd760c0412aa875284de9b71e
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java20
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java13
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java18
3 files changed, 51 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index cfd049508e65..641d33cc4b61 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -414,6 +414,7 @@ class ActivityStarter {
int filterCallingUid;
PendingIntentRecord originatingPendingIntent;
BackgroundStartPrivileges forcedBalByPiSender;
+ boolean freezeScreen;
final StringBuilder logMessage = new StringBuilder();
@@ -477,6 +478,7 @@ class ActivityStarter {
filterCallingUid = UserHandle.USER_NULL;
originatingPendingIntent = null;
forcedBalByPiSender = BackgroundStartPrivileges.NONE;
+ freezeScreen = false;
errorCallbackToken = null;
}
@@ -520,6 +522,7 @@ class ActivityStarter {
filterCallingUid = request.filterCallingUid;
originatingPendingIntent = request.originatingPendingIntent;
forcedBalByPiSender = request.forcedBalByPiSender;
+ freezeScreen = request.freezeScreen;
errorCallbackToken = request.errorCallbackToken;
}
@@ -1520,6 +1523,18 @@ class ActivityStarter {
Transition newTransition = transitionController.isShellTransitionsEnabled()
? transitionController.createAndStartCollecting(TRANSIT_OPEN) : null;
RemoteTransition remoteTransition = r.takeRemoteTransition();
+ // Create a display snapshot as soon as possible.
+ if (newTransition != null && mRequest.freezeScreen) {
+ final TaskDisplayArea tda = mLaunchParams.hasPreferredTaskDisplayArea()
+ ? mLaunchParams.mPreferredTaskDisplayArea
+ : mRootWindowContainer.getDefaultTaskDisplayArea();
+ final DisplayContent dc = mRootWindowContainer.getDisplayContentOrCreate(
+ tda.getDisplayId());
+ if (dc != null) {
+ transitionController.collect(dc);
+ transitionController.collectVisibleChange(dc);
+ }
+ }
try {
mService.deferWindowLayout();
transitionController.collect(r);
@@ -3263,6 +3278,11 @@ class ActivityStarter {
return this;
}
+ ActivityStarter setFreezeScreen(boolean freezeScreen) {
+ mRequest.freezeScreen = freezeScreen;
+ return this;
+ }
+
ActivityStarter setErrorCallbackToken(@Nullable IBinder errorCallbackToken) {
mRequest.errorCallbackToken = errorCallbackToken;
return this;
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
index ed556a55010e..4a5b2211800c 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java
@@ -275,6 +275,19 @@ public abstract class ActivityTaskManagerInternal {
int startFlags, @Nullable Bundle options, int userId);
/**
+ * Start activity {@code intent} with initially under screenshot. The screen of launching
+ * display will be frozen before transition occur.
+ *
+ * - DO NOT call it with the calling UID cleared.
+ * - The caller must do the calling user ID check.
+ *
+ * @return error codes used by {@link IActivityManager#startActivity} and its siblings.
+ */
+ public abstract int startActivityWithScreenshot(@NonNull Intent intent,
+ @NonNull String callingPackage, int callingUid, int callingPid,
+ @Nullable IBinder resultTo, @Nullable Bundle options, int userId);
+
+ /**
* Called after virtual display Id is updated by
* {@link com.android.server.vr.Vr2dDisplay} with a specific
* {@param vr2dDisplayId}.
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index adbe800634c4..ed05767c7b37 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -6013,6 +6013,24 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
false /*validateIncomingUser*/);
}
+ @Override
+ public int startActivityWithScreenshot(@NonNull Intent intent,
+ @NonNull String callingPackage, int callingUid, int callingPid,
+ @Nullable IBinder resultTo, @Nullable Bundle options, int userId) {
+ return getActivityStartController()
+ .obtainStarter(intent, "startActivityWithScreenshot")
+ .setCallingUid(callingUid)
+ .setCallingPid(callingPid)
+ .setCallingPackage(callingPackage)
+ .setResultTo(resultTo)
+ .setActivityOptions(createSafeActivityOptionsWithBalAllowed(options))
+ .setRealCallingUid(Binder.getCallingUid())
+ .setUserId(userId)
+ .setBackgroundStartPrivileges(BackgroundStartPrivileges.ALLOW_BAL)
+ .setFreezeScreen(true)
+ .execute();
+ }
+
/**
* Called after virtual display Id is updated by
* {@link com.android.server.vr.Vr2dDisplay} with a specific