diff options
6 files changed, 52 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 39eda044a5b3..1344727ab36d 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -120,6 +120,7 @@ import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_FOCUS; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SAVED_STATE; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_STATES; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH; +import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_TRANSITION; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION; import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_FOCUS; @@ -1631,6 +1632,7 @@ final class ActivityRecord extends ConfigurationContainer { void updateOptionsLocked(ActivityOptions options) { if (options != null) { + if (DEBUG_TRANSITION) Slog.i(TAG, "Update options for " + this); if (pendingOptions != null) { pendingOptions.abort(); } @@ -1641,6 +1643,7 @@ final class ActivityRecord extends ConfigurationContainer { void applyOptionsLocked() { if (pendingOptions != null && pendingOptions.getAnimationType() != ANIM_SCENE_TRANSITION) { + if (DEBUG_TRANSITION) Slog.i(TAG, "Applying options for " + this); applyOptionsLocked(pendingOptions, intent); if (task == null) { clearOptionsLocked(false /* withAbort */); @@ -1762,9 +1765,19 @@ final class ActivityRecord extends ConfigurationContainer { pendingOptions = null; } - ActivityOptions takeOptionsLocked() { + ActivityOptions takeOptionsLocked(boolean fromClient) { + if (DEBUG_TRANSITION) Slog.i(TAG, "Taking options for " + this + " callers=" + + Debug.getCallers(6)); ActivityOptions opts = pendingOptions; - pendingOptions = null; + + // If we are trying to take activity options from the client, do not null it out if it's a + // remote animation as the client doesn't need it ever. This is a workaround when client is + // faster to take the options than we are to resume the next activity. + // TODO (b/132432864): Fix the root cause of these transition preparing/applying options + // timing somehow + if (!fromClient || opts == null || opts.getRemoteAnimationAdapter() == null) { + pendingOptions = null; + } return opts; } diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java index fe99fd20b855..ba415861acc6 100644 --- a/services/core/java/com/android/server/wm/ActivityStack.java +++ b/services/core/java/com/android/server/wm/ActivityStack.java @@ -3379,7 +3379,7 @@ class ActivityStack extends ConfigurationContainer { canMoveOptions = false; if (noOptions && topOptions == null) { - topOptions = p.takeOptionsLocked(); + topOptions = p.takeOptionsLocked(false /* fromClient */); if (topOptions != null) { noOptions = false; } @@ -3418,7 +3418,7 @@ class ActivityStack extends ConfigurationContainer { } canMoveOptions = false; if (noOptions && topOptions == null) { - topOptions = p.takeOptionsLocked(); + topOptions = p.takeOptionsLocked(false /* fromClient */); if (topOptions != null) { noOptions = false; } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index a8b56d3ccbed..205bcf1a06fa 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -2934,7 +2934,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { synchronized (mGlobalLock) { final ActivityRecord r = ActivityRecord.isInStackLocked(token); if (r != null) { - final ActivityOptions activityOptions = r.takeOptionsLocked(); + final ActivityOptions activityOptions = r.takeOptionsLocked( + true /* fromClient */); return activityOptions == null ? null : activityOptions.toBundle(); } return null; diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 0915caedd6bc..ddd5c0aa7dc0 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -1909,6 +1909,8 @@ public class AppTransition implements Dump { } void overridePendingAppTransitionRemote(RemoteAnimationAdapter remoteAnimationAdapter) { + if (DEBUG_APP_TRANSITIONS) Slog.i(TAG, "Override pending remote transitionSet=" + + isTransitionSet() + " adapter=" + remoteAnimationAdapter); if (isTransitionSet()) { clear(); mNextAppTransitionType = NEXT_TRANSIT_TYPE_REMOTE; diff --git a/services/core/java/com/android/server/wm/TaskRecord.java b/services/core/java/com/android/server/wm/TaskRecord.java index 8505ec2b8a82..298b302a17fb 100644 --- a/services/core/java/com/android/server/wm/TaskRecord.java +++ b/services/core/java/com/android/server/wm/TaskRecord.java @@ -1493,7 +1493,7 @@ class TaskRecord extends ConfigurationContainer { if (r.finishing) { continue; } - ActivityOptions opts = r.takeOptionsLocked(); + ActivityOptions opts = r.takeOptionsLocked(false /* fromClient */); if (opts != null) { ret.updateOptionsLocked(opts); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index dc8b8857eb0e..11a177a71a10 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -56,9 +56,14 @@ import android.app.servertransaction.PauseActivityItem; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Rect; +import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.util.MergedConfiguration; import android.util.MutableBoolean; +import android.view.IRemoteAnimationFinishedCallback; +import android.view.IRemoteAnimationRunner.Stub; +import android.view.RemoteAnimationAdapter; +import android.view.RemoteAnimationTarget; import androidx.test.filters.MediumTest; @@ -568,6 +573,31 @@ public class ActivityRecordTests extends ActivityTestsBase { eq(mActivity.app.mName), eq(mActivity.app.mUid), anyString()); } + @Test + public void testTakeOptions() { + ActivityOptions opts = ActivityOptions.makeRemoteAnimation( + new RemoteAnimationAdapter(new Stub() { + + @Override + public void onAnimationStart(RemoteAnimationTarget[] apps, + IRemoteAnimationFinishedCallback finishedCallback) { + + } + + @Override + public void onAnimationCancelled() { + + } + }, 0, 0)); + mActivity.updateOptionsLocked(opts); + assertNotNull(mActivity.takeOptionsLocked(true /* fromClient */)); + assertNotNull(mActivity.pendingOptions); + + mActivity.updateOptionsLocked(ActivityOptions.makeBasic()); + assertNotNull(mActivity.takeOptionsLocked(false /* fromClient */)); + assertNull(mActivity.pendingOptions); + } + /** Setup {@link #mActivity} as a size-compat-mode-able activity without fixed orientation. */ private void prepareFixedAspectRatioUnresizableActivity() { setupDisplayContentForCompatDisplayInsets(); |