RecentsAnimation.java revision e2d721781fc024cbd9a14929741e5b476242291f
1e2d721781fc024cbd9a14929741e5b476242291fWinson Chung/*
2e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * Copyright (C) 2018 The Android Open Source Project
3e2d721781fc024cbd9a14929741e5b476242291fWinson Chung *
4e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * Licensed under the Apache License, Version 2.0 (the "License");
5e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * you may not use this file except in compliance with the License.
6e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * You may obtain a copy of the License at
7e2d721781fc024cbd9a14929741e5b476242291fWinson Chung *
8e2d721781fc024cbd9a14929741e5b476242291fWinson Chung *      http://www.apache.org/licenses/LICENSE-2.0
9e2d721781fc024cbd9a14929741e5b476242291fWinson Chung *
10e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * Unless required by applicable law or agreed to in writing, software
11e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * distributed under the License is distributed on an "AS IS" BASIS,
12e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * See the License for the specific language governing permissions and
14e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * limitations under the License.
15e2d721781fc024cbd9a14929741e5b476242291fWinson Chung */
16e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
17e2d721781fc024cbd9a14929741e5b476242291fWinson Chungpackage com.android.server.am;
18e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
19e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.app.ActivityManager.StackId.INVALID_STACK_ID;
20e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
21e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
22e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION;
23e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static android.view.WindowManager.TRANSIT_NONE;
24e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
25e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
26e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.app.ActivityOptions;
27e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.content.ComponentName;
28e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.content.Intent;
29e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.os.Handler;
30e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport android.view.IRecentsAnimationRunner;
31e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport com.android.server.wm.RecentsAnimationController.RecentsAnimationCallbacks;
32e2d721781fc024cbd9a14929741e5b476242291fWinson Chungimport com.android.server.wm.WindowManagerService;
33e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
34e2d721781fc024cbd9a14929741e5b476242291fWinson Chung/**
35e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * Manages the recents animation, including the reordering of the stacks for the transition and
36e2d721781fc024cbd9a14929741e5b476242291fWinson Chung * cleanup. See {@link com.android.server.wm.RecentsAnimationController}.
37e2d721781fc024cbd9a14929741e5b476242291fWinson Chung */
38e2d721781fc024cbd9a14929741e5b476242291fWinson Chungclass RecentsAnimation implements RecentsAnimationCallbacks {
39e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private static final String TAG = RecentsAnimation.class.getSimpleName();
40e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
41e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private static final int RECENTS_ANIMATION_TIMEOUT = 10 * 1000;
42e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
43e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private final ActivityManagerService mService;
44e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private final ActivityStackSupervisor mStackSupervisor;
45e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private final ActivityStartController mActivityStartController;
46e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private final WindowManagerService mWindowManager;
47e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private final UserController mUserController;
48e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private final Handler mHandler;
49e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
50e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private final Runnable mCancelAnimationRunnable;
51e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
52e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    // The stack to restore the home stack behind when the animation is finished
53e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    private ActivityStack mRestoreHomeBehindStack;
54e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
55e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    RecentsAnimation(ActivityManagerService am, ActivityStackSupervisor stackSupervisor,
56e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            ActivityStartController activityStartController, WindowManagerService wm,
57e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            UserController userController) {
58e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mService = am;
59e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mStackSupervisor = stackSupervisor;
60e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mActivityStartController = activityStartController;
61e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mHandler = new Handler(mStackSupervisor.mLooper);
62e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mWindowManager = wm;
63e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mUserController = userController;
64e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mCancelAnimationRunnable = () -> {
65e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            // The caller has not finished the animation in a predefined amount of time, so
66e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            // force-cancel the animation
67e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            mWindowManager.cancelRecentsAnimation();
68e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        };
69e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    }
70e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
71e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    void startRecentsActivity(Intent intent, IRecentsAnimationRunner recentsAnimationRunner,
72e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            ComponentName recentsComponent, int recentsUid) {
73e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
74e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // Cancel the previous recents animation if necessary
75e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mWindowManager.cancelRecentsAnimation();
76e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
77e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        final boolean hasExistingHomeActivity = mStackSupervisor.getHomeActivity() != null;
78e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        if (!hasExistingHomeActivity) {
79e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            // No home activity
80e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            final ActivityOptions opts = ActivityOptions.makeBasic();
81e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            opts.setLaunchActivityType(ACTIVITY_TYPE_HOME);
82e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            opts.setAvoidMoveToFront();
83e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_NO_ANIMATION);
84e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
85e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            mActivityStartController.obtainStarter(intent, "startRecentsActivity_noHomeActivity")
86e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    .setCallingUid(recentsUid)
87e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    .setCallingPackage(recentsComponent.getPackageName())
88e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    .setActivityOptions(SafeActivityOptions.fromBundle(opts.toBundle()))
89e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    .setMayWait(mUserController.getCurrentUserId())
90e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    .execute();
91e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
92e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
93e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            // TODO: Maybe wait for app to draw in this particular case?
94e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        }
95e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
96e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        final ActivityRecord homeActivity = mStackSupervisor.getHomeActivity();
97e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        final ActivityDisplay display = homeActivity.getDisplay();
98e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
99e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // Save the initial position of the home activity stack to be restored to after the
100e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // animation completes
101e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mRestoreHomeBehindStack = hasExistingHomeActivity
102e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                ? display.getStackAboveHome()
103e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                : null;
104e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
105e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // Move the home activity into place for the animation
106e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        display.moveHomeStackBehindBottomMostVisibleStack();
107e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
108e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // Mark the home activity as launch-behind to bump its visibility for the
109e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // duration of the gesture that is driven by the recents component
110e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        homeActivity.mLaunchTaskBehind = true;
111e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
112e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // Fetch all the surface controls and pass them to the client to get the animation
113e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // started
114e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mWindowManager.initializeRecentsAnimation(recentsAnimationRunner, this, display.mDisplayId);
115e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
116e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // If we updated the launch-behind state, update the visibility of the activities after we
117e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // fetch the visible tasks to be controlled by the animation
118e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS);
119e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
120e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        // Post a timeout for the animation
121e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mHandler.postDelayed(mCancelAnimationRunnable, RECENTS_ANIMATION_TIMEOUT);
122e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    }
123e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
124e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    @Override
125e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    public void onAnimationFinished(boolean moveHomeToTop) {
126e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        mHandler.removeCallbacks(mCancelAnimationRunnable);
127e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        synchronized (mService) {
128e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            if (mWindowManager.getRecentsAnimationController() == null) return;
129e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
130e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            mWindowManager.inSurfaceTransaction(() -> {
131e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                mWindowManager.cleanupRecentsAnimation();
132e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
133e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                // Move the home stack to the front
134e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                final ActivityRecord homeActivity = mStackSupervisor.getHomeActivity();
135e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                if (homeActivity == null) {
136e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    return;
137e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                }
138e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
139e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                // Restore the launched-behind state
140e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                homeActivity.mLaunchTaskBehind = false;
141e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
142e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                if (moveHomeToTop) {
143e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    // Bring the home stack to the front
144e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    final ActivityStack homeStack = homeActivity.getStack();
145e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    homeStack.mNoAnimActivities.add(homeActivity);
146e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    homeStack.moveToFront("RecentsAnimation.onAnimationFinished()");
147e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                } else {
148e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    // Restore the home stack to its previous position
149e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    final ActivityDisplay display = homeActivity.getDisplay();
150e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                    display.moveHomeStackBehindStack(mRestoreHomeBehindStack);
151e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                }
152e2d721781fc024cbd9a14929741e5b476242291fWinson Chung
153e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                mWindowManager.prepareAppTransition(TRANSIT_NONE, false);
154e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, false);
155e2d721781fc024cbd9a14929741e5b476242291fWinson Chung                mStackSupervisor.resumeFocusedStackTopActivityLocked();
156e2d721781fc024cbd9a14929741e5b476242291fWinson Chung            });
157e2d721781fc024cbd9a14929741e5b476242291fWinson Chung        }
158e2d721781fc024cbd9a14929741e5b476242291fWinson Chung    }
159e2d721781fc024cbd9a14929741e5b476242291fWinson Chung}
160