summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp2
-rw-r--r--core/java/android/app/ActivityOptions.java28
-rw-r--r--core/java/android/app/IActivityManager.aidl6
-rw-r--r--core/java/android/view/IRecentsAnimationController.aidl54
-rw-r--r--core/java/android/view/IRecentsAnimationRunner.aidl42
-rw-r--r--core/java/android/view/RemoteAnimationTarget.java12
-rw-r--r--services/core/java/com/android/server/am/ActivityDisplay.java59
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java51
-rw-r--r--services/core/java/com/android/server/am/ActivityStackSupervisor.java2
-rw-r--r--services/core/java/com/android/server/am/ActivityStarter.java33
-rw-r--r--services/core/java/com/android/server/am/RecentsAnimation.java159
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java14
-rw-r--r--services/core/java/com/android/server/wm/RecentsAnimationController.java373
-rw-r--r--services/core/java/com/android/server/wm/RemoteAnimationController.java3
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java7
-rw-r--r--services/core/java/com/android/server/wm/SurfaceAnimator.java9
-rw-r--r--services/core/java/com/android/server/wm/WallpaperController.java31
-rw-r--r--services/core/java/com/android/server/wm/WindowContainer.java4
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java42
-rw-r--r--services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java3
20 files changed, 52 insertions, 882 deletions
diff --git a/Android.bp b/Android.bp
index 4ef04579b7f8..704ec8789cb6 100644
--- a/Android.bp
+++ b/Android.bp
@@ -330,8 +330,6 @@ java_library {
"core/java/android/view/IPinnedStackController.aidl",
"core/java/android/view/IPinnedStackListener.aidl",
"core/java/android/view/IRemoteAnimationRunner.aidl",
- "core/java/android/view/IRecentsAnimationController.aidl",
- "core/java/android/view/IRecentsAnimationRunner.aidl",
"core/java/android/view/IRemoteAnimationFinishedCallback.aidl",
"core/java/android/view/IRotationWatcher.aidl",
"core/java/android/view/IWallpaperVisibilityListener.aidl",
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index fee58274a5fc..4bcd677e1f4e 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -207,12 +207,6 @@ public class ActivityOptions {
"android.activity.taskOverlayCanResume";
/**
- * See {@link #setAvoidMoveToFront()}.
- * @hide
- */
- private static final String KEY_AVOID_MOVE_TO_FRONT = "android.activity.avoidMoveToFront";
-
- /**
* Where the split-screen-primary stack should be positioned.
* @hide
*/
@@ -313,7 +307,6 @@ public class ActivityOptions {
private boolean mDisallowEnterPictureInPictureWhileLaunching;
private boolean mTaskOverlay;
private boolean mTaskOverlayCanResume;
- private boolean mAvoidMoveToFront;
private AppTransitionAnimationSpec mAnimSpecs[];
private int mRotationAnimationHint = -1;
private Bundle mAppVerificationBundle;
@@ -930,7 +923,6 @@ public class ActivityOptions {
mLaunchTaskId = opts.getInt(KEY_LAUNCH_TASK_ID, -1);
mTaskOverlay = opts.getBoolean(KEY_TASK_OVERLAY, false);
mTaskOverlayCanResume = opts.getBoolean(KEY_TASK_OVERLAY_CAN_RESUME, false);
- mAvoidMoveToFront = opts.getBoolean(KEY_AVOID_MOVE_TO_FRONT, false);
mSplitScreenCreateMode = opts.getInt(KEY_SPLIT_SCREEN_CREATE_MODE,
SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT);
mDisallowEnterPictureInPictureWhileLaunching = opts.getBoolean(
@@ -1247,25 +1239,6 @@ public class ActivityOptions {
return mTaskOverlayCanResume;
}
- /**
- * Sets whether the activity launched should not cause the activity stack it is contained in to
- * be moved to the front as a part of launching.
- *
- * @hide
- */
- public void setAvoidMoveToFront() {
- mAvoidMoveToFront = true;
- }
-
- /**
- * @return whether the activity launch should prevent moving the associated activity stack to
- * the front.
- * @hide
- */
- public boolean getAvoidMoveToFront() {
- return mAvoidMoveToFront;
- }
-
/** @hide */
public int getSplitScreenCreateMode() {
return mSplitScreenCreateMode;
@@ -1443,7 +1416,6 @@ public class ActivityOptions {
b.putInt(KEY_LAUNCH_TASK_ID, mLaunchTaskId);
b.putBoolean(KEY_TASK_OVERLAY, mTaskOverlay);
b.putBoolean(KEY_TASK_OVERLAY_CAN_RESUME, mTaskOverlayCanResume);
- b.putBoolean(KEY_AVOID_MOVE_TO_FRONT, mAvoidMoveToFront);
b.putInt(KEY_SPLIT_SCREEN_CREATE_MODE, mSplitScreenCreateMode);
b.putBoolean(KEY_DISALLOW_ENTER_PICTURE_IN_PICTURE_WHILE_LAUNCHING,
mDisallowEnterPictureInPictureWhileLaunching);
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 56bc184e89c4..9c15562b5813 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -65,7 +65,6 @@ import android.os.PersistableBundle;
import android.os.StrictMode;
import android.os.WorkSource;
import android.service.voice.IVoiceInteractionSession;
-import android.view.IRecentsAnimationRunner;
import android.view.RemoteAnimationDefinition;
import com.android.internal.app.IVoiceInteractor;
import com.android.internal.os.IResultReceiver;
@@ -442,9 +441,8 @@ interface IActivityManager {
in Bundle options, int userId);
int startAssistantActivity(in String callingPackage, int callingPid, int callingUid,
in Intent intent, in String resolvedType, in Bundle options, int userId);
- void startRecentsActivity(in Intent intent, in IAssistDataReceiver assistDataReceiver,
- in IRecentsAnimationRunner recentsAnimationRunner);
- void cancelRecentsAnimation();
+ int startRecentsActivity(in IAssistDataReceiver assistDataReceiver, in Bundle options,
+ in Bundle activityOptions, int userId);
int startActivityFromRecents(int taskId, in Bundle options);
Bundle getActivityOptions(in IBinder token);
List<IBinder> getAppTasks(in String callingPackage);
diff --git a/core/java/android/view/IRecentsAnimationController.aidl b/core/java/android/view/IRecentsAnimationController.aidl
deleted file mode 100644
index 5607b1134e5b..000000000000
--- a/core/java/android/view/IRecentsAnimationController.aidl
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view;
-
-import android.app.ActivityManager;
-import android.view.IRemoteAnimationFinishedCallback;
-import android.graphics.GraphicBuffer;
-
-/**
- * Passed to the {@link IRecentsAnimationRunner} in order for the runner to control to let the
- * runner control certain aspects of the recents animation, and to notify window manager when the
- * animation has completed.
- *
- * {@hide}
- */
-interface IRecentsAnimationController {
-
- /**
- * Takes a screenshot of the task associated with the given {@param taskId}. Only valid for the
- * current set of task ids provided to the handler.
- */
- ActivityManager.TaskSnapshot screenshotTask(int taskId);
-
- /**
- * Notifies to the system that the animation into Recents should end, and all leashes associated
- * with remote animation targets should be relinquished. If {@param moveHomeToTop} is true, then
- * the home activity should be moved to the top. Otherwise, the home activity is hidden and the
- * user is returned to the app.
- */
- void finish(boolean moveHomeToTop);
-
- /**
- * Called by the handler to indicate that the recents animation input consumer should be
- * enabled. This is currently used to work around an issue where registering an input consumer
- * mid-animation causes the existing motion event chain to be canceled. Instead, the caller
- * may register the recents animation input consumer prior to starting the recents animation
- * and then enable it mid-animation to start receiving touch events.
- */
- void setInputConsumerEnabled(boolean enabled);
-}
diff --git a/core/java/android/view/IRecentsAnimationRunner.aidl b/core/java/android/view/IRecentsAnimationRunner.aidl
deleted file mode 100644
index ea6226b3ea69..000000000000
--- a/core/java/android/view/IRecentsAnimationRunner.aidl
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.view;
-
-import android.view.RemoteAnimationTarget;
-import android.view.IRecentsAnimationController;
-
-/**
- * Interface that is used to callback from window manager to the process that runs a recents
- * animation to start or cancel it.
- *
- * {@hide}
- */
-oneway interface IRecentsAnimationRunner {
-
- /**
- * Called when the system is ready for the handler to start animating all the visible tasks.
- */
- void onAnimationStart(in IRecentsAnimationController controller,
- in RemoteAnimationTarget[] apps);
-
- /**
- * Called when the system needs to cancel the current animation. This can be due to the
- * wallpaper not drawing in time, or the handler not finishing the animation within a predefined
- * amount of time.
- */
- void onAnimationCanceled();
-}
diff --git a/core/java/android/view/RemoteAnimationTarget.java b/core/java/android/view/RemoteAnimationTarget.java
index c28c3894482d..f39e618e169d 100644
--- a/core/java/android/view/RemoteAnimationTarget.java
+++ b/core/java/android/view/RemoteAnimationTarget.java
@@ -17,7 +17,6 @@
package android.view;
import android.annotation.IntDef;
-import android.app.WindowConfiguration;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Parcel;
@@ -99,14 +98,8 @@ public class RemoteAnimationTarget implements Parcelable {
*/
public final Rect sourceContainerBounds;
- /**
- * The window configuration for the target.
- */
- public final WindowConfiguration windowConfiguration;
-
public RemoteAnimationTarget(int taskId, int mode, SurfaceControl leash, boolean isTranslucent,
- Rect clipRect, int prefixOrderIndex, Point position, Rect sourceContainerBounds,
- WindowConfiguration windowConfig) {
+ Rect clipRect, int prefixOrderIndex, Point position, Rect sourceContainerBounds) {
this.mode = mode;
this.taskId = taskId;
this.leash = leash;
@@ -115,7 +108,6 @@ public class RemoteAnimationTarget implements Parcelable {
this.prefixOrderIndex = prefixOrderIndex;
this.position = new Point(position);
this.sourceContainerBounds = new Rect(sourceContainerBounds);
- this.windowConfiguration = windowConfig;
}
public RemoteAnimationTarget(Parcel in) {
@@ -127,7 +119,6 @@ public class RemoteAnimationTarget implements Parcelable {
prefixOrderIndex = in.readInt();
position = in.readParcelable(null);
sourceContainerBounds = in.readParcelable(null);
- windowConfiguration = in.readParcelable(null);
}
@Override
@@ -145,7 +136,6 @@ public class RemoteAnimationTarget implements Parcelable {
dest.writeInt(prefixOrderIndex);
dest.writeParcelable(position, 0 /* flags */);
dest.writeParcelable(sourceContainerBounds, 0 /* flags */);
- dest.writeParcelable(windowConfiguration, 0 /* flags */);
}
public static final Creator<RemoteAnimationTarget> CREATOR
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index aa8d56b3f6c6..46ab0e09436a 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -16,7 +16,6 @@
package com.android.server.am;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
@@ -665,64 +664,6 @@ class ActivityDisplay extends ConfigurationContainer<ActivityStack>
&& (mSupervisor.mService.mRunningVoice == null);
}
- /**
- * @return the stack currently above the home stack. Can be null if there is no home stack, or
- * the home stack is already on top.
- */
- ActivityStack getStackAboveHome() {
- if (mHomeStack == null) {
- // Skip if there is no home stack
- return null;
- }
-
- final int stackIndex = mStacks.indexOf(mHomeStack) + 1;
- return (stackIndex < mStacks.size()) ? mStacks.get(stackIndex) : null;
- }
-
- /**
- * Adjusts the home stack behind the last visible stack in the display if necessary. Generally
- * used in conjunction with {@link #moveHomeStackBehindStack}.
- */
- void moveHomeStackBehindBottomMostVisibleStack() {
- if (mHomeStack == null) {
- // Skip if there is no home stack
- return;
- }
-
- // Move the home stack to the bottom to not affect the following visibility checks
- positionChildAtBottom(mHomeStack);
-
- // Find the next position where the homes stack should be placed
- final int numStacks = mStacks.size();
- for (int stackNdx = 0; stackNdx < numStacks; stackNdx++) {
- final ActivityStack stack = mStacks.get(stackNdx);
- if (stack == mHomeStack) {
- continue;
- }
- final int winMode = stack.getWindowingMode();
- final boolean isValidWindowingMode = winMode == WINDOWING_MODE_FULLSCREEN ||
- winMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
- if (stack.shouldBeVisible(null) && isValidWindowingMode) {
- // Move the home stack to behind this stack
- positionChildAt(mHomeStack, Math.max(0, stackNdx - 1));
- break;
- }
- }
- }
-
- /**
- * Moves the home stack behind the given {@param stack} if possible. If {@param stack} is not
- * currently in the display, then then the home stack is moved to the back. Generally used in
- * conjunction with {@link #moveHomeStackBehindBottomMostVisibleStack}.
- */
- void moveHomeStackBehindStack(ActivityStack behindStack) {
- if (behindStack == null) {
- return;
- }
-
- positionChildAt(mHomeStack, Math.max(0, mStacks.indexOf(behindStack) - 1));
- }
-
boolean isSleeping() {
return mSleeping;
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 368f2e1032db..364d5d584e4f 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -39,7 +39,6 @@ import static android.app.ActivityManagerInternal.ASSIST_KEY_STRUCTURE;
import static android.app.ActivityThread.PROC_START_SEQ_IDENT;
import static android.app.AppOpsManager.OP_ASSIST_STRUCTURE;
import static android.app.AppOpsManager.OP_NONE;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -377,7 +376,6 @@ import android.util.Xml;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoUtils;
import android.view.Gravity;
-import android.view.IRecentsAnimationRunner;
import android.view.LayoutInflater;
import android.view.RemoteAnimationDefinition;
import android.view.View;
@@ -451,7 +449,6 @@ import com.android.server.pm.Installer.InstallerException;
import com.android.server.utils.PriorityDump;
import com.android.server.vr.VrManagerInternal;
import com.android.server.wm.PinnedStackWindowController;
-import com.android.server.wm.RecentsAnimationController;
import com.android.server.wm.WindowManagerService;
import dalvik.system.VMRuntime;
@@ -5098,16 +5095,23 @@ public class ActivityManagerService extends IActivityManager.Stub
}
@Override
- public void startRecentsActivity(Intent intent, IAssistDataReceiver assistDataReceiver,
- IRecentsAnimationRunner recentsAnimationRunner) {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()");
+ public int startRecentsActivity(IAssistDataReceiver assistDataReceiver, Bundle options,
+ Bundle activityOptions, int userId) {
+ if (!mRecentTasks.isCallerRecents(Binder.getCallingUid())) {
+ String msg = "Permission Denial: startRecentsActivity() from pid="
+ + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
+ + " not recent tasks package";
+ Slog.w(TAG, msg);
+ throw new SecurityException(msg);
+ }
+
+ final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(options);
+ final int recentsUid = mRecentTasks.getRecentsComponentUid();
+ final ComponentName recentsComponent = mRecentTasks.getRecentsComponent();
+ final String recentsPackage = recentsComponent.getPackageName();
final long origId = Binder.clearCallingIdentity();
try {
synchronized (this) {
- final int recentsUid = mRecentTasks.getRecentsComponentUid();
- final ComponentName recentsComponent = mRecentTasks.getRecentsComponent();
- final String recentsPackage = recentsComponent.getPackageName();
-
// If provided, kick off the request for the assist data in the background before
// starting the activity
if (assistDataReceiver != null) {
@@ -5124,24 +5128,17 @@ public class ActivityManagerService extends IActivityManager.Stub
recentsUid, recentsPackage);
}
- // Start a new recents animation
- final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor,
- mActivityStartController, mWindowManager, mUserController);
- anim.startRecentsActivity(intent, recentsAnimationRunner, recentsComponent,
- recentsUid);
- }
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
+ final Intent intent = new Intent();
+ intent.setFlags(FLAG_ACTIVITY_NEW_TASK);
+ intent.setComponent(recentsComponent);
+ intent.putExtras(options);
- @Override
- public void cancelRecentsAnimation() {
- enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "cancelRecentsAnimation()");
- final long origId = Binder.clearCallingIdentity();
- try {
- synchronized (this) {
- mWindowManager.cancelRecentsAnimation();
+ return mActivityStartController.obtainStarter(intent, "startRecentsActivity")
+ .setCallingUid(recentsUid)
+ .setCallingPackage(recentsPackage)
+ .setActivityOptions(safeOptions)
+ .setMayWait(userId)
+ .execute();
}
} finally {
Binder.restoreCallingIdentity(origId);
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 510a3fa47ec5..bfb563fd93a8 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -297,7 +297,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
private RunningTasks mRunningTasks;
final ActivityStackSupervisorHandler mHandler;
- final Looper mLooper;
/** Short cut */
WindowManagerService mWindowManager;
@@ -582,7 +581,6 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D
public ActivityStackSupervisor(ActivityManagerService service, Looper looper) {
mService = service;
- mLooper = looper;
mHandler = new ActivityStackSupervisorHandler(looper);
}
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 8fd754af1a0f..4dc30ddf4b5b 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -302,7 +302,6 @@ class ActivityStarter {
SafeActivityOptions activityOptions;
boolean ignoreTargetSecurity;
boolean componentSpecified;
- boolean avoidMoveToFront;
ActivityRecord[] outActivity;
TaskRecord inTask;
String reason;
@@ -357,7 +356,6 @@ class ActivityStarter {
userId = 0;
waitResult = null;
mayWait = false;
- avoidMoveToFront = false;
}
/**
@@ -392,7 +390,6 @@ class ActivityStarter {
userId = request.userId;
waitResult = request.waitResult;
mayWait = request.mayWait;
- avoidMoveToFront = request.avoidMoveToFront;
}
}
@@ -1488,23 +1485,19 @@ class ActivityStarter {
mDoResume = false;
}
- if (mOptions != null) {
- if (mOptions.getLaunchTaskId() != -1 && mOptions.getTaskOverlay()) {
- r.mTaskOverlay = true;
- if (!mOptions.canTaskOverlayResume()) {
- final TaskRecord task = mSupervisor.anyTaskForIdLocked(
- mOptions.getLaunchTaskId());
- final ActivityRecord top = task != null ? task.getTopActivity() : null;
- if (top != null && top.state != RESUMED) {
-
- // The caller specifies that we'd like to be avoided to be moved to the
- // front, so be it!
- mDoResume = false;
- mAvoidMoveToFront = true;
- }
+ if (mOptions != null && mOptions.getLaunchTaskId() != -1
+ && mOptions.getTaskOverlay()) {
+ r.mTaskOverlay = true;
+ if (!mOptions.canTaskOverlayResume()) {
+ final TaskRecord task = mSupervisor.anyTaskForIdLocked(mOptions.getLaunchTaskId());
+ final ActivityRecord top = task != null ? task.getTopActivity() : null;
+ if (top != null && top.state != RESUMED) {
+
+ // The caller specifies that we'd like to be avoided to be moved to the front,
+ // so be it!
+ mDoResume = false;
+ mAvoidMoveToFront = true;
}
- } else if (mOptions.getAvoidMoveToFront()) {
- mAvoidMoveToFront = true;
}
}
@@ -1845,7 +1838,7 @@ class ActivityStarter {
// Need to update mTargetStack because if task was moved out of it, the original stack may
// be destroyed.
mTargetStack = intentActivity.getStack();
- if (!mAvoidMoveToFront && !mMovedToFront && mDoResume) {
+ if (!mMovedToFront && mDoResume) {
if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Bring to front target: " + mTargetStack
+ " from " + intentActivity);
mTargetStack.moveToFront("intentActivityFound");
diff --git a/services/core/java/com/android/server/am/RecentsAnimation.java b/services/core/java/com/android/server/am/RecentsAnimation.java
deleted file mode 100644
index fe576fdaacbe..000000000000
--- a/services/core/java/com/android/server/am/RecentsAnimation.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.am;
-
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
-import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
-import static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
-import static android.view.WindowManager.TRANSIT_NONE;
-import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
-
-import android.app.ActivityOptions;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.os.Handler;
-import android.view.IRecentsAnimationRunner;
-import com.android.server.wm.RecentsAnimationController.RecentsAnimationCallbacks;
-import com.android.server.wm.WindowManagerService;
-
-/**
- * Manages the recents animation, including the reordering of the stacks for the transition and
- * cleanup. See {@link com.android.server.wm.RecentsAnimationController}.
- */
-class RecentsAnimation implements RecentsAnimationCallbacks {
- private static final String TAG = RecentsAnimation.class.getSimpleName();
-
- private static final int RECENTS_ANIMATION_TIMEOUT = 10 * 1000;
-
- private final ActivityManagerService mService;
- private final ActivityStackSupervisor mStackSupervisor;
- private final ActivityStartController mActivityStartController;
- private final WindowManagerService mWindowManager;
- private final UserController mUserController;
- private final Handler mHandler;
-
- private final Runnable mCancelAnimationRunnable;
-
- // The stack to restore the home stack behind when the animation is finished
- private ActivityStack mRestoreHomeBehindStack;
-
- RecentsAnimation(ActivityManagerService am, ActivityStackSupervisor stackSupervisor,
- ActivityStartController activityStartController, WindowManagerService wm,
- UserController userController) {
- mService = am;
- mStackSupervisor = stackSupervisor;
- mActivityStartController = activityStartController;
- mHandler = new Handler(mStackSupervisor.mLooper);
- mWindowManager = wm;
- mUserController = userController;
- mCancelAnimationRunnable = () -> {
- // The caller has not finished the animation in a predefined amount of time, so
- // force-cancel the animation
- mWindowManager.cancelRecentsAnimation();
- };
- }
-
- void startRecentsActivity(Intent intent, IRecentsAnimationRunner recentsAnimationRunner,
- ComponentName recentsComponent, int recentsUid) {
-
- // Cancel the previous recents animation if necessary
- mWindowManager.cancelRecentsAnimation();
-
- final boolean hasExistingHomeActivity = mStackSupervisor.getHomeActivity() != null;
- if (!hasExistingHomeActivity) {
- // No home activity
- final ActivityOptions opts = ActivityOptions.makeBasic();
- opts.setLaunchActivityType(ACTIVITY_TYPE_HOME);
- opts.setAvoidMoveToFront();
- intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION);
-
- mActivityStartController.obtainStarter(intent, "startRecentsActivity_noHomeActivity")
- .setCallingUid(recentsUid)
- .setCallingPackage(recentsComponent.getPackageName())
- .setActivityOptions(SafeActivityOptions.fromBundle(opts.toBundle()))
- .setMayWait(mUserController.getCurrentUserId())
- .execute();
- mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
-
- // TODO: Maybe wait for app to draw in this particular case?
- }
-
- final ActivityRecord homeActivity = mStackSupervisor.getHomeActivity();
- final ActivityDisplay display = homeActivity.getDisplay();
-
- // Save the initial position of the home activity stack to be restored to after the
- // animation completes
- mRestoreHomeBehindStack = hasExistingHomeActivity
- ? display.getStackAboveHome()
- : null;
-
- // Move the home activity into place for the animation
- display.moveHomeStackBehindBottomMostVisibleStack();
-
- // Mark the home activity as launch-behind to bump its visibility for the
- // duration of the gesture that is driven by the recents component
- homeActivity.mLaunchTaskBehind = true;
-
- // Fetch all the surface controls and pass them to the client to get the animation
- // started
- mWindowManager.initializeRecentsAnimation(recentsAnimationRunner, this, display.mDisplayId);
-
- // If we updated the launch-behind state, update the visibility of the activities after we
- // fetch the visible tasks to be controlled by the animation
- mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS);
-
- // Post a timeout for the animation
- mHandler.postDelayed(mCancelAnimationRunnable, RECENTS_ANIMATION_TIMEOUT);
- }
-
- @Override
- public void onAnimationFinished(boolean moveHomeToTop) {
- mHandler.removeCallbacks(mCancelAnimationRunnable);
- synchronized (mService) {
- if (mWindowManager.getRecentsAnimationController() == null) return;
-
- mWindowManager.inSurfaceTransaction(() -> {
- mWindowManager.cleanupRecentsAnimation();
-
- // Move the home stack to the front
- final ActivityRecord homeActivity = mStackSupervisor.getHomeActivity();
- if (homeActivity == null) {
- return;
- }
-
- // Restore the launched-behind state
- homeActivity.mLaunchTaskBehind = false;
-
- if (moveHomeToTop) {
- // Bring the home stack to the front
- final ActivityStack homeStack = homeActivity.getStack();
- homeStack.mNoAnimActivities.add(homeActivity);
- homeStack.moveToFront("RecentsAnimation.onAnimationFinished()");
- } else {
- // Restore the home stack to its previous position
- final ActivityDisplay display = homeActivity.getDisplay();
- display.moveHomeStackBehindStack(mRestoreHomeBehindStack);
- }
-
- mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
- mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, false);
- mStackSupervisor.resumeFocusedStackTopActivityLocked();
- });
- }
- }
-}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 3f49f0cd5c15..d7a58d99a4d6 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1508,10 +1508,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
return mTaskStackContainers.getTopStack();
}
- ArrayList<Task> getVisibleTasks() {
- return mTaskStackContainers.getVisibleTasks();
- }
-
void onStackWindowingModeChanged(TaskStack stack) {
mTaskStackContainers.onStackWindowingModeChanged(stack);
}
@@ -3264,16 +3260,6 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
return mSplitScreenPrimaryStack;
}
- ArrayList<Task> getVisibleTasks() {
- final ArrayList<Task> visibleTasks = new ArrayList<>();
- forAllTasks(task -> {
- if (task.isVisible()) {
- visibleTasks.add(task);
- }
- });
- return visibleTasks;
- }
-
/**
* Adds the stack to this container.
* @see DisplayContent#createStack(int, boolean, StackWindowController)
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
deleted file mode 100644
index c7ad17b8699b..000000000000
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.wm;
-
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
-import static android.view.RemoteAnimationTarget.MODE_CLOSING;
-import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
-import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
-
-import android.app.ActivityManager;
-import android.app.ActivityManager.TaskSnapshot;
-import android.app.WindowConfiguration;
-import android.graphics.GraphicBuffer;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Binder;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.util.Log;
-import android.util.Slog;
-import android.view.IRecentsAnimationController;
-import android.view.IRecentsAnimationRunner;
-import android.view.RemoteAnimationTarget;
-import android.view.SurfaceControl;
-import android.view.SurfaceControl.Transaction;
-import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-
-/**
- * Controls a single instance of the remote driven recents animation. In particular, this allows
- * the calling SystemUI to animate the visible task windows as a part of the transition. The remote
- * runner is provided an animation controller which allows it to take screenshots and to notify
- * window manager when the animation is completed. In addition, window manager may also notify the
- * app if it requires the animation to be canceled at any time (ie. due to timeout, etc.)
- */
-public class RecentsAnimationController {
- private static final String TAG = TAG_WITH_CLASS_NAME ? "RecentsAnimationController" : TAG_WM;
- private static final boolean DEBUG = false;
-
- private final WindowManagerService mService;
- private final IRecentsAnimationRunner mRunner;
- private final RecentsAnimationCallbacks mCallbacks;
- private final ArrayList<TaskAnimationAdapter> mPendingAnimations = new ArrayList<>();
-
- // The recents component app token that is shown behind the visibile tasks
- private AppWindowToken mHomeAppToken;
-
- // We start the RecentsAnimationController in a pending-start state since we need to wait for
- // the wallpaper/activity to draw before we can give control to the handler to start animating
- // the visible task surfaces
- private boolean mPendingStart = true;
-
- // Set when the animation has been canceled
- private boolean mCanceled = false;
-
- // Whether or not the input consumer is enabled. The input consumer must be both registered and
- // enabled for it to start intercepting touch events.
- private boolean mInputConsumerEnabled;
-
- public interface RecentsAnimationCallbacks {
- void onAnimationFinished(boolean moveHomeToTop);
- }
-
- private final IRecentsAnimationController mController =
- new IRecentsAnimationController.Stub() {
-
- @Override
- public TaskSnapshot screenshotTask(int taskId) {
- if (DEBUG) Log.d(TAG, "screenshotTask(" + taskId + "): mCanceled=" + mCanceled);
- long token = Binder.clearCallingIdentity();
- try {
- synchronized (mService.getWindowManagerLock()) {
- if (mCanceled) {
- return null;
- }
- for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
- final TaskAnimationAdapter adapter = mPendingAnimations.get(i);
- final Task task = adapter.mTask;
- if (task.mTaskId == taskId) {
- // TODO: Save this screenshot as the task snapshot?
- final Rect taskFrame = new Rect();
- task.getBounds(taskFrame);
- final GraphicBuffer buffer = SurfaceControl.captureLayers(
- task.getSurfaceControl().getHandle(), taskFrame, 1f);
- final AppWindowToken topChild = task.getTopChild();
- final WindowState mainWindow = topChild.findMainWindow();
- return new TaskSnapshot(buffer, topChild.getConfiguration().orientation,
- mainWindow.mStableInsets,
- ActivityManager.isLowRamDeviceStatic() /* reduced */,
- 1.0f /* scale */);
- }
- }
- return null;
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void finish(boolean moveHomeToTop) {
- if (DEBUG) Log.d(TAG, "finish(" + moveHomeToTop + "): mCanceled=" + mCanceled);
- long token = Binder.clearCallingIdentity();
- try {
- synchronized (mService.getWindowManagerLock()) {
- if (mCanceled) {
- return;
- }
- }
-
- // Note, the callback will handle its own synchronization, do not lock on WM lock
- // prior to calling the callback
- mCallbacks.onAnimationFinished(moveHomeToTop);
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
-
- @Override
- public void setInputConsumerEnabled(boolean enabled) {
- if (DEBUG) Log.d(TAG, "setInputConsumerEnabled(" + enabled + "): mCanceled="
- + mCanceled);
- long token = Binder.clearCallingIdentity();
- try {
- synchronized (mService.getWindowManagerLock()) {
- if (mCanceled) {
- return;
- }
-
- mInputConsumerEnabled = enabled;
- mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
- mService.scheduleAnimationLocked();
- }
- } finally {
- Binder.restoreCallingIdentity(token);
- }
- }
- };
-
- /**
- * Initializes a new RecentsAnimationController.
- *
- * @param remoteAnimationRunner The remote runner which should be notified when the animation is
- * ready to start or has been canceled
- * @param callbacks Callbacks to be made when the animation finishes
- * @param restoreHomeBehindStackId The stack id to restore the home stack behind once the
- * animation is complete. Will be passed to the callback.
- */
- RecentsAnimationController(WindowManagerService service,
- IRecentsAnimationRunner remoteAnimationRunner, RecentsAnimationCallbacks callbacks,
- int displayId) {
- mService = service;
- mRunner = remoteAnimationRunner;
- mCallbacks = callbacks;
-
- final DisplayContent dc = mService.mRoot.getDisplayContent(displayId);
- final ArrayList<Task> visibleTasks = dc.getVisibleTasks();
- if (visibleTasks.isEmpty()) {
- cancelAnimation();
- return;
- }
-
- // Make leashes for each of the visible tasks and add it to the recents animation to be
- // started
- final int taskCount = visibleTasks.size();
- for (int i = 0; i < taskCount; i++) {
- final Task task = visibleTasks.get(i);
- final WindowConfiguration config = task.getWindowConfiguration();
- if (config.tasksAreFloating()
- || config.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY
- || config.getActivityType() == ACTIVITY_TYPE_HOME) {
- continue;
- }
- addAnimation(task);
- }
-
- // Adjust the wallpaper visibility for the showing home activity
- final AppWindowToken recentsComponentAppToken =
- dc.getHomeStack().getTopChild().getTopFullscreenAppToken();
- if (recentsComponentAppToken != null) {
- if (DEBUG) Log.d(TAG, "setHomeApp(" + recentsComponentAppToken.getName() + ")");
- mHomeAppToken = recentsComponentAppToken;
- final WallpaperController wc = dc.mWallpaperController;
- if (recentsComponentAppToken.windowsCanBeWallpaperTarget()) {
- dc.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
- dc.setLayoutNeeded();
- }
- }
-
- mService.mWindowPlacerLocked.performSurfacePlacement();
- }
-
- private void addAnimation(Task task) {
- if (DEBUG) Log.d(TAG, "addAnimation(" + task.getName() + ")");
- final SurfaceAnimator anim = new SurfaceAnimator(task, null /* animationFinishedCallback */,
- mService.mAnimator::addAfterPrepareSurfacesRunnable, mService);
- final TaskAnimationAdapter taskAdapter = new TaskAnimationAdapter(task);
- anim.startAnimation(task.getPendingTransaction(), taskAdapter, false /* hidden */);
- task.commitPendingTransaction();
- mPendingAnimations.add(taskAdapter);
- }
-
- void startAnimation() {
- if (DEBUG) Log.d(TAG, "startAnimation(): mPendingStart=" + mPendingStart);
- if (!mPendingStart) {
- return;
- }
- try {
- final RemoteAnimationTarget[] appAnimations =
- new RemoteAnimationTarget[mPendingAnimations.size()];
- for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
- appAnimations[i] = mPendingAnimations.get(i).createRemoteAnimationApp();
- }
- mPendingStart = false;
- mRunner.onAnimationStart(mController, appAnimations);
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to start recents animation", e);
- }
- }
-
- void cancelAnimation() {
- if (DEBUG) Log.d(TAG, "cancelAnimation()");
- if (mCanceled) {
- // We've already canceled the animation
- return;
- }
- mCanceled = true;
- try {
- mRunner.onAnimationCanceled();
- } catch (RemoteException e) {
- Slog.e(TAG, "Failed to cancel recents animation", e);
- }
-
- // Clean up and return to the previous app
- mCallbacks.onAnimationFinished(false /* moveHomeToTop */);
- }
-
- void cleanupAnimation() {
- if (DEBUG) Log.d(TAG, "cleanupAnimation(): mPendingAnimations="
- + mPendingAnimations.size());
- for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
- final TaskAnimationAdapter adapter = mPendingAnimations.get(i);
- adapter.mCapturedFinishCallback.onAnimationFinished(adapter);
- }
- mPendingAnimations.clear();
-
- mService.mInputMonitor.updateInputWindowsLw(true /*force*/);
- mService.scheduleAnimationLocked();
- }
-
- void checkAnimationReady(WallpaperController wallpaperController) {
- if (mPendingStart) {
- final boolean wallpaperReady = !isHomeAppOverWallpaper()
- || (wallpaperController.getWallpaperTarget() != null
- && wallpaperController.wallpaperTransitionReady());
- if (wallpaperReady) {
- mService.getRecentsAnimationController().startAnimation();
- }
- }
- }
-
- boolean isWallpaperVisible(WindowState w) {
- return w != null && w.mAppToken != null && mHomeAppToken == w.mAppToken
- && isHomeAppOverWallpaper();
- }
-
- boolean isHomeAppOverWallpaper() {
- if (mHomeAppToken == null) {
- return false;
- }
- return mHomeAppToken.windowsCanBeWallpaperTarget();
- }
-
- WindowState getHomeAppMainWindow() {
- if (mHomeAppToken == null) {
- return null;
- }
- return mHomeAppToken.findMainWindow();
- }
-
- boolean isAnimatingApp(AppWindowToken appToken) {
- for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
- final Task task = mPendingAnimations.get(i).mTask;
- for (int j = task.getChildCount() - 1; j >= 0; j--) {
- final AppWindowToken app = task.getChildAt(j);
- if (app == appToken) {
- return true;
- }
- }
- }
- return false;
- }
-
- boolean isInputConsumerEnabled() {
- return mInputConsumerEnabled;
- }
-
- private class TaskAnimationAdapter implements AnimationAdapter {
-
- private Task mTask;
- private SurfaceControl mCapturedLeash;
- private OnAnimationFinishedCallback mCapturedFinishCallback;
-
- TaskAnimationAdapter(Task task) {
- mTask = task;
- }
-
- RemoteAnimationTarget createRemoteAnimationApp() {
- // TODO: Do we need position and stack bounds?
- return new RemoteAnimationTarget(mTask.mTaskId, MODE_CLOSING, mCapturedLeash,
- !mTask.fillsParent(),
- mTask.getTopVisibleAppMainWindow().mWinAnimator.mLastClipRect,
- mTask.getPrefixOrderIndex(), new Point(), new Rect(),
- mTask.getWindowConfiguration());
- }
-
- @Override
- public boolean getDetachWallpaper() {
- return false;
- }
-
- @Override
- public int getBackgroundColor() {
- return 0;
- }
-
- @Override
- public void startAnimation(SurfaceControl animationLeash, Transaction t,
- OnAnimationFinishedCallback finishCallback) {
- mCapturedLeash = animationLeash;
- mCapturedFinishCallback = finishCallback;
- }
-
- @Override
- public void onAnimationCancelled(SurfaceControl animationLeash) {
- cancelAnimation();
- }
-
- @Override
- public long getDurationHint() {
- return 0;
- }
-
- @Override
- public long getStatusBarTransitionsStartTime() {
- return SystemClock.uptimeMillis();
- }
- }
-
- public void dump(PrintWriter pw, String prefix) {
- final String innerPrefix = prefix + " ";
- pw.print(prefix); pw.println(RecentsAnimationController.class.getSimpleName() + ":");
- pw.print(innerPrefix); pw.println("mPendingStart=" + mPendingStart);
- pw.print(innerPrefix); pw.println("mHomeAppToken=" + mHomeAppToken);
- }
-}
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index 7d4eafb07fe9..8515dcb69970 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -160,8 +160,7 @@ class RemoteAnimationController {
return new RemoteAnimationTarget(task.mTaskId, getMode(),
mCapturedLeash, !mAppWindowToken.fillsParent(),
mainWindow.mWinAnimator.mLastClipRect,
- mAppWindowToken.getPrefixOrderIndex(), mPosition, mStackBounds,
- task.getWindowConfiguration());
+ mAppWindowToken.getPrefixOrderIndex(), mPosition, mStackBounds);
}
private int getMode() {
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index deed7f17e4e6..2cc96c9ee7b6 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -623,13 +623,6 @@ class RootWindowContainer extends WindowContainer<DisplayContent> {
defaultDisplay.pendingLayoutChanges);
}
- // Defer starting the recents animation until the wallpaper has drawn
- final RecentsAnimationController recentsAnimationController =
- mService.getRecentsAnimationController();
- if (recentsAnimationController != null) {
- recentsAnimationController.checkAnimationReady(mWallpaperController);
- }
-
if (mWallpaperForceHidingChanged && defaultDisplay.pendingLayoutChanges == 0
&& !mService.mAppTransition.isReady()) {
// At this point, there was a window with a wallpaper that was force hiding other
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimator.java b/services/core/java/com/android/server/wm/SurfaceAnimator.java
index 0512a08c59db..10f1c3a37dcf 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimator.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimator.java
@@ -62,7 +62,7 @@ class SurfaceAnimator {
* @param addAfterPrepareSurfaces Consumer that takes a runnable and executes it after preparing
* surfaces in WM. Can be implemented differently during testing.
*/
- SurfaceAnimator(Animatable animatable, @Nullable Runnable animationFinishedCallback,
+ SurfaceAnimator(Animatable animatable, Runnable animationFinishedCallback,
Consumer<Runnable> addAfterPrepareSurfaces, WindowManagerService service) {
mAnimatable = animatable;
mService = service;
@@ -71,8 +71,7 @@ class SurfaceAnimator {
addAfterPrepareSurfaces);
}
- private OnAnimationFinishedCallback getFinishedCallback(
- @Nullable Runnable animationFinishedCallback,
+ private OnAnimationFinishedCallback getFinishedCallback(Runnable animationFinishedCallback,
Consumer<Runnable> addAfterPrepareSurfaces) {
return anim -> {
synchronized (mService.mWindowMap) {
@@ -98,9 +97,7 @@ class SurfaceAnimator {
SurfaceControl.openTransaction();
try {
reset(t, true /* destroyLeash */);
- if (animationFinishedCallback != null) {
- animationFinishedCallback.run();
- }
+ animationFinishedCallback.run();
} finally {
SurfaceControl.mergeToGlobalTransaction(t);
SurfaceControl.closeTransaction();
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index f2ad6fb7a888..1218d3bc1b9b 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -149,17 +149,8 @@ class WallpaperController {
mFindResults.setUseTopWallpaperAsTarget(true);
}
- final RecentsAnimationController recentsAnimationController =
- mService.getRecentsAnimationController();
final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
- final boolean isRecentsTransitionTarget = (recentsAnimationController != null
- && recentsAnimationController.isWallpaperVisible(w));
- if (isRecentsTransitionTarget) {
- if (DEBUG_WALLPAPER) Slog.v(TAG, "Found recents animation wallpaper target: " + w);
- mFindResults.setWallpaperTarget(w);
- return true;
- } else if (hasWallpaper && w.isOnScreen()
- && (mWallpaperTarget == w || w.isDrawFinishedLw())) {
+ if (hasWallpaper && w.isOnScreen() && (mWallpaperTarget == w || w.isDrawFinishedLw())) {
if (DEBUG_WALLPAPER) Slog.v(TAG, "Found wallpaper target: " + w);
mFindResults.setWallpaperTarget(w);
if (w == mWallpaperTarget && w.mWinAnimator.isAnimationSet()) {
@@ -208,22 +199,15 @@ class WallpaperController {
}
}
- private final boolean isWallpaperVisible(WindowState wallpaperTarget) {
- final RecentsAnimationController recentsAnimationController =
- mService.getRecentsAnimationController();
- boolean isAnimatingWithRecentsComponent = recentsAnimationController != null
- && recentsAnimationController.isWallpaperVisible(wallpaperTarget);
+ private boolean isWallpaperVisible(WindowState wallpaperTarget) {
if (DEBUG_WALLPAPER) Slog.v(TAG, "Wallpaper vis: target " + wallpaperTarget + ", obscured="
+ (wallpaperTarget != null ? Boolean.toString(wallpaperTarget.mObscured) : "??")
+ " animating=" + ((wallpaperTarget != null && wallpaperTarget.mAppToken != null)
? wallpaperTarget.mAppToken.isSelfAnimating() : null)
- + " prev=" + mPrevWallpaperTarget
- + " recentsAnimationWallpaperVisible=" + isAnimatingWithRecentsComponent);
+ + " prev=" + mPrevWallpaperTarget);
return (wallpaperTarget != null
- && (!wallpaperTarget.mObscured
- || isAnimatingWithRecentsComponent
- || (wallpaperTarget.mAppToken != null
- && wallpaperTarget.mAppToken.isSelfAnimating())))
+ && (!wallpaperTarget.mObscured || (wallpaperTarget.mAppToken != null
+ && wallpaperTarget.mAppToken.isSelfAnimating())))
|| mPrevWallpaperTarget != null;
}
@@ -603,11 +587,6 @@ class WallpaperController {
mWallpaperDrawState = WALLPAPER_DRAW_TIMEOUT;
if (DEBUG_APP_TRANSITIONS || DEBUG_WALLPAPER) Slog.v(TAG,
"*** WALLPAPER DRAW TIMEOUT");
-
- // If there was a recents animation in progress, cancel that animation
- if (mService.getRecentsAnimationController() != null) {
- mService.getRecentsAnimationController().cancelAnimation();
- }
return true;
}
return false;
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index a0b59efe6ced..42c6ec25a7a8 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -337,9 +337,9 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
}
/** Returns true if this window container has the input child. */
- boolean hasChild(E child) {
+ boolean hasChild(WindowContainer child) {
for (int i = mChildren.size() - 1; i >= 0; --i) {
- final E current = mChildren.get(i);
+ final WindowContainer current = mChildren.get(i);
if (current == child || current.hasChild(child)) {
return true;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 4fb239085e5c..de1e7ecb2bb9 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -24,8 +24,6 @@ import static android.Manifest.permission.RESTRICTED_VR_ACCESS;
import static android.app.ActivityManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT;
import static android.app.AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
import static android.app.StatusBarManager.DISABLE_MASK;
-import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
-import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.admin.DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED;
import static android.content.Intent.ACTION_USER_REMOVED;
import static android.content.Intent.EXTRA_USER_HANDLE;
@@ -125,7 +123,6 @@ import android.app.ActivityThread;
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.IAssistDataReceiver;
-import android.app.WindowConfiguration;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
@@ -199,7 +196,6 @@ import android.view.IDockedStackListener;
import android.view.IInputFilter;
import android.view.IOnKeyguardExitResult;
import android.view.IPinnedStackListener;
-import android.view.IRecentsAnimationRunner;
import android.view.IRotationWatcher;
import android.view.IWallpaperVisibilityListener;
import android.view.IWindow;
@@ -532,7 +528,6 @@ public class WindowManagerService extends IWindowManager.Stub
IInputMethodManager mInputMethodManager;
AccessibilityController mAccessibilityController;
- private RecentsAnimationController mRecentsAnimationController;
Watermark mWatermark;
StrictModeFlash mStrictModeFlash;
@@ -2675,39 +2670,6 @@ public class WindowManagerService extends IWindowManager.Stub
}
}
- public void initializeRecentsAnimation(
- IRecentsAnimationRunner recentsAnimationRunner,
- RecentsAnimationController.RecentsAnimationCallbacks callbacks, int displayId) {
- synchronized (mWindowMap) {
- cancelRecentsAnimation();
- mRecentsAnimationController = new RecentsAnimationController(this,
- recentsAnimationRunner, callbacks, displayId);
- }
- }
-
- public RecentsAnimationController getRecentsAnimationController() {
- return mRecentsAnimationController;
- }
-
- public void cancelRecentsAnimation() {
- synchronized (mWindowMap) {
- if (mRecentsAnimationController != null) {
- // This call will call through to cleanupAnimation() below after the animation is
- // canceled
- mRecentsAnimationController.cancelAnimation();
- }
- }
- }
-
- public void cleanupRecentsAnimation() {
- synchronized (mWindowMap) {
- if (mRecentsAnimationController != null) {
- mRecentsAnimationController.cleanupAnimation();
- mRecentsAnimationController = null;
- }
- }
- }
-
public void setAppFullscreen(IBinder token, boolean toOpaque) {
synchronized (mWindowMap) {
final AppWindowToken atoken = mRoot.getAppWindowToken(token);
@@ -6365,10 +6327,6 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" mSkipAppTransitionAnimation=");pw.println(mSkipAppTransitionAnimation);
pw.println(" mLayoutToAnim:");
mAppTransition.dump(pw, " ");
- if (mRecentsAnimationController != null) {
- pw.print(" mRecentsAnimationController="); pw.println(mRecentsAnimationController);
- mRecentsAnimationController.dump(pw, " ");
- }
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
index 24566fcf8f0d..f0171727409c 100644
--- a/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/RecentTasksTest.java
@@ -573,8 +573,7 @@ public class RecentTasksTest extends ActivityTestsBase {
assertSecurityException(expectCallable, () -> mService.getTaskDescription(0));
assertSecurityException(expectCallable, () -> mService.cancelTaskWindowTransition(0));
assertSecurityException(expectCallable, () -> mService.startRecentsActivity(null, null,
- null));
- assertSecurityException(expectCallable, () -> mService.cancelRecentsAnimation());
+ null, 0));
}
private void testGetTasksApis(boolean expectCallable) {