diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java index 6c4554646e6e3..31ccf3530fb99 100644 --- a/services/core/java/com/android/server/am/ActivityStartController.java +++ b/services/core/java/com/android/server/am/ActivityStartController.java @@ -350,7 +350,8 @@ public class ActivityStartController { "FLAG_CANT_SAVE_STATE not supported here"); } - final SafeActivityOptions checkedOptions = i == intents.length - 1 + final boolean top = i == intents.length - 1; + final SafeActivityOptions checkedOptions = top ? options : null; final int res = obtainStarter(intent, reason) @@ -367,6 +368,10 @@ public class ActivityStartController { .setActivityOptions(checkedOptions) .setComponentSpecified(componentSpecified) .setOutActivity(outActivity) + + // Top activity decides on animation being run, so we allow only for the + // top one as otherwise an activity below might consume it. + .setAllowPendingRemoteAnimationRegistryLookup(top /* allowLookup*/) .execute(); if (res < 0) { diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index fb89e6711a182..7ff7d9a9b6c47 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -313,6 +313,12 @@ class ActivityStarter { int userId; WaitResult waitResult; + /** + * If set to {@code true}, allows this activity start to look into + * {@link PendingRemoteAnimationRegistry} + */ + boolean allowPendingRemoteAnimationRegistryLookup; + /** * Indicates that we should wait for the result of the start request. This flag is set when * {@link ActivityStarter#setMayWait(int)} is called. @@ -360,6 +366,7 @@ class ActivityStarter { waitResult = null; mayWait = false; avoidMoveToFront = false; + allowPendingRemoteAnimationRegistryLookup = true; } /** @@ -395,6 +402,8 @@ class ActivityStarter { waitResult = request.waitResult; mayWait = request.mayWait; avoidMoveToFront = request.avoidMoveToFront; + allowPendingRemoteAnimationRegistryLookup + = request.allowPendingRemoteAnimationRegistryLookup; } } @@ -477,7 +486,8 @@ class ActivityStarter { mRequest.resultWho, mRequest.requestCode, mRequest.startFlags, mRequest.profilerInfo, mRequest.waitResult, mRequest.globalConfig, mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.userId, - mRequest.inTask, mRequest.reason); + mRequest.inTask, mRequest.reason, + mRequest.allowPendingRemoteAnimationRegistryLookup); } else { return startActivity(mRequest.caller, mRequest.intent, mRequest.ephemeralIntent, mRequest.resolvedType, mRequest.activityInfo, mRequest.resolveInfo, @@ -486,7 +496,8 @@ class ActivityStarter { mRequest.callingUid, mRequest.callingPackage, mRequest.realCallingPid, mRequest.realCallingUid, mRequest.startFlags, mRequest.activityOptions, mRequest.ignoreTargetSecurity, mRequest.componentSpecified, - mRequest.outActivity, mRequest.inTask, mRequest.reason); + mRequest.outActivity, mRequest.inTask, mRequest.reason, + mRequest.allowPendingRemoteAnimationRegistryLookup); } } finally { onExecutionComplete(); @@ -517,7 +528,8 @@ class ActivityStarter { IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int realCallingPid, int realCallingUid, int startFlags, SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, - ActivityRecord[] outActivity, TaskRecord inTask, String reason) { + ActivityRecord[] outActivity, TaskRecord inTask, String reason, + boolean allowPendingRemoteAnimationRegistryLookup) { if (TextUtils.isEmpty(reason)) { throw new IllegalArgumentException("Need to specify a reason."); @@ -530,7 +542,7 @@ class ActivityStarter { aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord, - inTask); + inTask, allowPendingRemoteAnimationRegistryLookup); if (outActivity != null) { // mLastStartActivityRecord[0] is set in the call to startActivity above. @@ -560,7 +572,7 @@ class ActivityStarter { String callingPackage, int realCallingPid, int realCallingUid, int startFlags, SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, - TaskRecord inTask) { + TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup) { int err = ActivityManager.START_SUCCESS; // Pull the optional Ephemeral Installer-only bundle out of the options early. final Bundle verificationBundle @@ -709,8 +721,11 @@ class ActivityStarter { ActivityOptions checkedOptions = options != null ? options.getOptions(intent, aInfo, callerApp, mSupervisor) : null; - checkedOptions = mService.getActivityStartController().getPendingRemoteAnimationRegistry() - .overrideOptionsIfNeeded(callingPackage, checkedOptions); + if (allowPendingRemoteAnimationRegistryLookup) { + checkedOptions = mService.getActivityStartController() + .getPendingRemoteAnimationRegistry() + .overrideOptionsIfNeeded(callingPackage, checkedOptions); + } if (mService.mController != null) { try { // The Intent we give to the watcher has the extra data @@ -928,7 +943,8 @@ class ActivityStarter { IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, WaitResult outResult, Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity, - int userId, TaskRecord inTask, String reason) { + int userId, TaskRecord inTask, String reason, + boolean allowPendingRemoteAnimationRegistryLookup) { // Refuse possible leaked file descriptors if (intent != null && intent.hasFileDescriptors()) { throw new IllegalArgumentException("File descriptors passed in Intent"); @@ -1070,7 +1086,8 @@ class ActivityStarter { int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options, - ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason); + ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason, + allowPendingRemoteAnimationRegistryLookup); Binder.restoreCallingIdentity(origId); @@ -2567,6 +2584,11 @@ class ActivityStarter { return this; } + ActivityStarter setAllowPendingRemoteAnimationRegistryLookup(boolean allowLookup) { + mRequest.allowPendingRemoteAnimationRegistryLookup = allowLookup; + return this; + } + void dump(PrintWriter pw, String prefix) { prefix = prefix + " "; pw.print(prefix);