summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java17
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java4
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java3
-rw-r--r--services/core/java/com/android/server/wm/AppTransition.java2
-rw-r--r--services/core/java/com/android/server/wm/TaskRecord.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java30
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();