Home | History | Annotate | Download | only in am
      1 /*
      2  * Copyright (C) 2013 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.server.am;
     18 
     19 import android.Manifest;
     20 import android.annotation.UserIdInt;
     21 import android.app.Activity;
     22 import android.app.ActivityManager;
     23 import android.app.ActivityManager.RunningTaskInfo;
     24 import android.app.ActivityManager.StackId;
     25 import android.app.ActivityManager.StackInfo;
     26 import android.app.ActivityOptions;
     27 import android.app.AppGlobals;
     28 import android.app.AppOpsManager;
     29 import android.app.IActivityContainer;
     30 import android.app.IActivityContainerCallback;
     31 import android.app.IActivityManager;
     32 import android.app.IActivityManager.WaitResult;
     33 import android.app.ProfilerInfo;
     34 import android.app.ResultInfo;
     35 import android.app.StatusBarManager;
     36 import android.app.admin.IDevicePolicyManager;
     37 import android.content.ComponentName;
     38 import android.content.Context;
     39 import android.content.IIntentSender;
     40 import android.content.Intent;
     41 import android.content.pm.ActivityInfo;
     42 import android.content.pm.ApplicationInfo;
     43 import android.content.pm.PackageInfo;
     44 import android.content.pm.PackageManager;
     45 import android.content.pm.ResolveInfo;
     46 import android.content.pm.UserInfo;
     47 import android.content.res.Configuration;
     48 import android.graphics.Rect;
     49 import android.hardware.display.DisplayManager;
     50 import android.hardware.display.DisplayManager.DisplayListener;
     51 import android.hardware.display.DisplayManagerGlobal;
     52 import android.hardware.display.VirtualDisplay;
     53 import android.hardware.input.InputManager;
     54 import android.hardware.input.InputManagerInternal;
     55 import android.os.Binder;
     56 import android.os.Bundle;
     57 import android.os.Debug;
     58 import android.os.Handler;
     59 import android.os.IBinder;
     60 import android.os.Looper;
     61 import android.os.Message;
     62 import android.os.ParcelFileDescriptor;
     63 import android.os.PowerManager;
     64 import android.os.Process;
     65 import android.os.RemoteException;
     66 import android.os.ServiceManager;
     67 import android.os.SystemClock;
     68 import android.os.Trace;
     69 import android.os.TransactionTooLargeException;
     70 import android.os.UserHandle;
     71 import android.os.UserManager;
     72 import android.os.WorkSource;
     73 import android.provider.MediaStore;
     74 import android.provider.Settings;
     75 import android.provider.Settings.SettingNotFoundException;
     76 import android.service.voice.IVoiceInteractionSession;
     77 import android.util.ArrayMap;
     78 import android.util.ArraySet;
     79 import android.util.EventLog;
     80 import android.util.Slog;
     81 import android.util.SparseArray;
     82 import android.util.SparseIntArray;
     83 import android.view.Display;
     84 import android.view.DisplayInfo;
     85 import android.view.InputEvent;
     86 import android.view.Surface;
     87 
     88 import com.android.internal.content.ReferrerIntent;
     89 import com.android.internal.os.TransferPipe;
     90 import com.android.internal.statusbar.IStatusBarService;
     91 import com.android.internal.util.ArrayUtils;
     92 import com.android.internal.widget.LockPatternUtils;
     93 import com.android.server.LocalServices;
     94 import com.android.server.am.ActivityStack.ActivityState;
     95 import com.android.server.wm.WindowManagerService;
     96 
     97 import java.io.FileDescriptor;
     98 import java.io.IOException;
     99 import java.io.PrintWriter;
    100 import java.util.ArrayList;
    101 import java.util.Arrays;
    102 import java.util.Collections;
    103 import java.util.List;
    104 import java.util.Objects;
    105 import java.util.Set;
    106 
    107 import static android.Manifest.permission.START_ANY_ACTIVITY;
    108 import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
    109 import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED;
    110 import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
    111 import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
    112 import static android.app.ActivityManager.RESIZE_MODE_FORCED;
    113 import static android.app.ActivityManager.RESIZE_MODE_SYSTEM;
    114 import static android.app.ActivityManager.START_TASK_TO_FRONT;
    115 import static android.app.ActivityManager.StackId.DOCKED_STACK_ID;
    116 import static android.app.ActivityManager.StackId.FIRST_DYNAMIC_STACK_ID;
    117 import static android.app.ActivityManager.StackId.FIRST_STATIC_STACK_ID;
    118 import static android.app.ActivityManager.StackId.FREEFORM_WORKSPACE_STACK_ID;
    119 import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
    120 import static android.app.ActivityManager.StackId.HOME_STACK_ID;
    121 import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
    122 import static android.app.ActivityManager.StackId.LAST_STATIC_STACK_ID;
    123 import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
    124 import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
    125 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
    126 import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS;
    127 import static android.content.pm.PackageManager.PERMISSION_GRANTED;
    128 import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER;
    129 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL;
    130 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONTAINERS;
    131 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IDLE;
    132 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKSCREEN;
    133 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK;
    134 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PAUSE;
    135 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RECENTS;
    136 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RELEASE;
    137 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK;
    138 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STATES;
    139 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH;
    140 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS;
    141 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBLE_BEHIND;
    142 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONTAINERS;
    143 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_IDLE;
    144 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK;
    145 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PAUSE;
    146 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RECENTS;
    147 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RELEASE;
    148 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK;
    149 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STATES;
    150 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH;
    151 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_TASKS;
    152 import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBLE_BEHIND;
    153 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
    154 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
    155 import static com.android.server.am.ActivityManagerService.ANIMATE;
    156 import static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG;
    157 import static com.android.server.am.ActivityManagerService.NOTIFY_ACTIVITY_DISMISSING_DOCKED_STACK_MSG;
    158 import static com.android.server.am.ActivityManagerService.NOTIFY_FORCED_RESIZABLE_MSG;
    159 import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE;
    160 import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
    161 import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
    162 import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
    163 import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
    164 import static com.android.server.am.ActivityStack.ActivityState.INITIALIZING;
    165 import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
    166 import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
    167 import static com.android.server.am.ActivityStack.ActivityState.RESUMED;
    168 import static com.android.server.am.ActivityStack.ActivityState.STOPPED;
    169 import static com.android.server.am.ActivityStack.ActivityState.STOPPING;
    170 import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING;
    171 import static com.android.server.am.ActivityStack.STACK_INVISIBLE;
    172 import static com.android.server.am.ActivityStack.STACK_VISIBLE;
    173 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK;
    174 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE;
    175 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE_PRIV;
    176 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_PINNABLE;
    177 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED;
    178 import static com.android.server.wm.AppTransition.TRANSIT_DOCK_TASK_FROM_RECENTS;
    179 
    180 public final class ActivityStackSupervisor implements DisplayListener {
    181     private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_AM;
    182     private static final String TAG_CONTAINERS = TAG + POSTFIX_CONTAINERS;
    183     private static final String TAG_IDLE = TAG + POSTFIX_IDLE;
    184     private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
    185     private static final String TAG_PAUSE = TAG + POSTFIX_PAUSE;
    186     private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS;
    187     private static final String TAG_RELEASE = TAG + POSTFIX_RELEASE;
    188     private static final String TAG_STACK = TAG + POSTFIX_STACK;
    189     private static final String TAG_STATES = TAG + POSTFIX_STATES;
    190     private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
    191     static final String TAG_TASKS = TAG + POSTFIX_TASKS;
    192     private static final String TAG_VISIBLE_BEHIND = TAG + POSTFIX_VISIBLE_BEHIND;
    193 
    194     /** How long we wait until giving up on the last activity telling us it is idle. */
    195     static final int IDLE_TIMEOUT = 10 * 1000;
    196 
    197     /** How long we can hold the sleep wake lock before giving up. */
    198     static final int SLEEP_TIMEOUT = 5 * 1000;
    199 
    200     // How long we can hold the launch wake lock before giving up.
    201     static final int LAUNCH_TIMEOUT = 10 * 1000;
    202 
    203     static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG;
    204     static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1;
    205     static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2;
    206     static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3;
    207     static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4;
    208     static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5;
    209     static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6;
    210     static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7;
    211     static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8;
    212     static final int LOCK_TASK_START_MSG = FIRST_SUPERVISOR_STACK_MSG + 9;
    213     static final int LOCK_TASK_END_MSG = FIRST_SUPERVISOR_STACK_MSG + 10;
    214     static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 11;
    215     static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_STACK_MSG + 12;
    216     static final int SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG = FIRST_SUPERVISOR_STACK_MSG + 13;
    217     static final int REPORT_MULTI_WINDOW_MODE_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 14;
    218     static final int REPORT_PIP_MODE_CHANGED_MSG = FIRST_SUPERVISOR_STACK_MSG + 15;
    219 
    220     private static final String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay";
    221 
    222     private static final String LOCK_TASK_TAG = "Lock-to-App";
    223 
    224     // Used to indicate if an object (e.g. stack) that we are trying to get
    225     // should be created if it doesn't exist already.
    226     static final boolean CREATE_IF_NEEDED = true;
    227 
    228     // Used to indicate that windows of activities should be preserved during the resize.
    229     static final boolean PRESERVE_WINDOWS = true;
    230 
    231     // Used to indicate if an object (e.g. task) should be moved/created
    232     // at the top of its container (e.g. stack).
    233     static final boolean ON_TOP = true;
    234 
    235     // Used to indicate that an objects (e.g. task) removal from its container
    236     // (e.g. stack) is due to it moving to another container.
    237     static final boolean MOVING = true;
    238 
    239     // Force the focus to change to the stack we are moving a task to..
    240     static final boolean FORCE_FOCUS = true;
    241 
    242     // Restore task from the saved recents if it can't be found in any live stack.
    243     static final boolean RESTORE_FROM_RECENTS = true;
    244 
    245     // Don't execute any calls to resume.
    246     static final boolean DEFER_RESUME = true;
    247 
    248     // Activity actions an app cannot start if it uses a permission which is not granted.
    249     private static final ArrayMap<String, String> ACTION_TO_RUNTIME_PERMISSION =
    250             new ArrayMap<>();
    251 
    252     static {
    253         ACTION_TO_RUNTIME_PERMISSION.put(MediaStore.ACTION_IMAGE_CAPTURE,
    254                 Manifest.permission.CAMERA);
    255         ACTION_TO_RUNTIME_PERMISSION.put(MediaStore.ACTION_VIDEO_CAPTURE,
    256                 Manifest.permission.CAMERA);
    257         ACTION_TO_RUNTIME_PERMISSION.put(Intent.ACTION_CALL,
    258                 Manifest.permission.CALL_PHONE);
    259     }
    260 
    261     /** Action restriction: launching the activity is not restricted. */
    262     private static final int ACTIVITY_RESTRICTION_NONE = 0;
    263     /** Action restriction: launching the activity is restricted by a permission. */
    264     private static final int ACTIVITY_RESTRICTION_PERMISSION = 1;
    265     /** Action restriction: launching the activity is restricted by an app op. */
    266     private static final int ACTIVITY_RESTRICTION_APPOP = 2;
    267 
    268     // The height/width divide used when fitting a task within a bounds with method
    269     // {@link #fitWithinBounds}.
    270     // We always want the task to to be visible in the bounds without affecting its size when
    271     // fitting. To make sure this is the case, we don't adjust the task left or top side pass
    272     // the input bounds right or bottom side minus the width or height divided by this value.
    273     private static final int FIT_WITHIN_BOUNDS_DIVIDER = 3;
    274 
    275     /** Status Bar Service **/
    276     private IBinder mToken = new Binder();
    277     private IStatusBarService mStatusBarService;
    278     private IDevicePolicyManager mDevicePolicyManager;
    279 
    280     // For debugging to make sure the caller when acquiring/releasing our
    281     // wake lock is the system process.
    282     static final boolean VALIDATE_WAKE_LOCK_CALLER = false;
    283     /** The number of distinct task ids that can be assigned to the tasks of a single user */
    284     private static final int MAX_TASK_IDS_PER_USER = UserHandle.PER_USER_RANGE;
    285 
    286     final ActivityManagerService mService;
    287 
    288     private RecentTasks mRecentTasks;
    289 
    290     final ActivityStackSupervisorHandler mHandler;
    291 
    292     /** Short cut */
    293     WindowManagerService mWindowManager;
    294     DisplayManager mDisplayManager;
    295 
    296     /** Counter for next free stack ID to use for dynamic activity stacks. */
    297     private int mNextFreeStackId = FIRST_DYNAMIC_STACK_ID;
    298 
    299     /**
    300      * Maps the task identifier that activities are currently being started in to the userId of the
    301      * task. Each time a new task is created, the entry for the userId of the task is incremented
    302      */
    303     private final SparseIntArray mCurTaskIdForUser = new SparseIntArray(20);
    304 
    305     /** The current user */
    306     int mCurrentUser;
    307 
    308     /** The stack containing the launcher app. Assumed to always be attached to
    309      * Display.DEFAULT_DISPLAY. */
    310     ActivityStack mHomeStack;
    311 
    312     /** The stack currently receiving input or launching the next activity. */
    313     ActivityStack mFocusedStack;
    314 
    315     /** If this is the same as mFocusedStack then the activity on the top of the focused stack has
    316      * been resumed. If stacks are changing position this will hold the old stack until the new
    317      * stack becomes resumed after which it will be set to mFocusedStack. */
    318     private ActivityStack mLastFocusedStack;
    319 
    320     /** List of activities that are waiting for a new activity to become visible before completing
    321      * whatever operation they are supposed to do. */
    322     final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<>();
    323 
    324     /** List of processes waiting to find out about the next visible activity. */
    325     final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible = new ArrayList<>();
    326 
    327     /** List of processes waiting to find out about the next launched activity. */
    328     final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched = new ArrayList<>();
    329 
    330     /** List of activities that are ready to be stopped, but waiting for the next activity to
    331      * settle down before doing so. */
    332     final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<>();
    333 
    334     /** List of activities that are ready to be finished, but waiting for the previous activity to
    335      * settle down before doing so.  It contains ActivityRecord objects. */
    336     final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<>();
    337 
    338     /** List of activities that are in the process of going to sleep. */
    339     final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<>();
    340 
    341     /** List of activities whose multi-window mode changed that we need to report to the
    342      * application */
    343     final ArrayList<ActivityRecord> mMultiWindowModeChangedActivities = new ArrayList<>();
    344 
    345     /** List of activities whose picture-in-picture mode changed that we need to report to the
    346      * application */
    347     final ArrayList<ActivityRecord> mPipModeChangedActivities = new ArrayList<>();
    348 
    349     /** Used on user changes */
    350     final ArrayList<UserState> mStartingUsers = new ArrayList<>();
    351 
    352     /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity
    353      * is being brought in front of us. */
    354     boolean mUserLeaving = false;
    355 
    356     /** Set when we have taken too long waiting to go to sleep. */
    357     boolean mSleepTimeout = false;
    358 
    359     /**
    360      * We don't want to allow the device to go to sleep while in the process
    361      * of launching an activity.  This is primarily to allow alarm intent
    362      * receivers to launch an activity and get that to run before the device
    363      * goes back to sleep.
    364      */
    365     PowerManager.WakeLock mLaunchingActivity;
    366 
    367     /**
    368      * Set when the system is going to sleep, until we have
    369      * successfully paused the current activity and released our wake lock.
    370      * At that point the system is allowed to actually sleep.
    371      */
    372     PowerManager.WakeLock mGoingToSleep;
    373 
    374     /** Stack id of the front stack when user switched, indexed by userId. */
    375     SparseIntArray mUserStackInFront = new SparseIntArray(2);
    376 
    377     // TODO: Add listener for removal of references.
    378     /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
    379     private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<>();
    380 
    381     /** Mapping from displayId to display current state */
    382     private final SparseArray<ActivityDisplay> mActivityDisplays = new SparseArray<>();
    383 
    384     InputManagerInternal mInputManagerInternal;
    385 
    386     /** The chain of tasks in lockTask mode. The current frontmost task is at the top, and tasks
    387      * may be finished until there is only one entry left. If this is empty the system is not
    388      * in lockTask mode. */
    389     ArrayList<TaskRecord> mLockTaskModeTasks = new ArrayList<>();
    390     /** Store the current lock task mode. Possible values:
    391      * {@link ActivityManager#LOCK_TASK_MODE_NONE}, {@link ActivityManager#LOCK_TASK_MODE_LOCKED},
    392      * {@link ActivityManager#LOCK_TASK_MODE_PINNED}
    393      */
    394     private int mLockTaskModeState;
    395     /**
    396      * Notifies the user when entering/exiting lock-task.
    397      */
    398     private LockTaskNotify mLockTaskNotify;
    399 
    400     /** Used to keep resumeTopActivityUncheckedLocked() from being entered recursively */
    401     boolean inResumeTopActivity;
    402 
    403     // temp. rects used during resize calculation so we don't need to create a new object each time.
    404     private final Rect tempRect = new Rect();
    405     private final Rect tempRect2 = new Rect();
    406 
    407     private final SparseArray<Configuration> mTmpConfigs = new SparseArray<>();
    408     private final SparseArray<Rect> mTmpBounds = new SparseArray<>();
    409     private final SparseArray<Rect> mTmpInsetBounds = new SparseArray<>();
    410 
    411     // The default minimal size that will be used if the activity doesn't specify its minimal size.
    412     // It will be calculated when the default display gets added.
    413     int mDefaultMinSizeOfResizeableTask = -1;
    414 
    415     // Whether tasks have moved and we need to rank the tasks before next OOM scoring
    416     private boolean mTaskLayersChanged = true;
    417 
    418     final ActivityMetricsLogger mActivityMetricsLogger;
    419 
    420     private final ResizeDockedStackTimeout mResizeDockedStackTimeout;
    421 
    422     static class FindTaskResult {
    423         ActivityRecord r;
    424         boolean matchedByRootAffinity;
    425     }
    426     private final FindTaskResult mTmpFindTaskResult = new FindTaskResult();
    427 
    428     /**
    429      * Used to keep track whether app visibilities got changed since the last pause. Useful to
    430      * determine whether to invoke the task stack change listener after pausing.
    431      */
    432     boolean mAppVisibilitiesChangedSinceLastPause;
    433 
    434     /**
    435      * Set of tasks that are in resizing mode during an app transition to fill the "void".
    436      */
    437     private final ArraySet<Integer> mResizingTasksDuringAnimation = new ArraySet<>();
    438 
    439 
    440     /**
    441      * If set to {@code false} all calls to resize the docked stack {@link #resizeDockedStackLocked}
    442      * will be ignored. Useful for the case where the caller is handling resizing of other stack and
    443      * moving tasks around and doesn't want dock stack to be resized due to an automatic trigger
    444      * like the docked stack going empty.
    445      */
    446     private boolean mAllowDockedStackResize = true;
    447 
    448     /**
    449      * Is dock currently minimized.
    450      */
    451     boolean mIsDockMinimized;
    452 
    453     /**
    454      * Description of a request to start a new activity, which has been held
    455      * due to app switches being disabled.
    456      */
    457     static class PendingActivityLaunch {
    458         final ActivityRecord r;
    459         final ActivityRecord sourceRecord;
    460         final int startFlags;
    461         final ActivityStack stack;
    462         final ProcessRecord callerApp;
    463 
    464         PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord,
    465                 int _startFlags, ActivityStack _stack, ProcessRecord _callerApp) {
    466             r = _r;
    467             sourceRecord = _sourceRecord;
    468             startFlags = _startFlags;
    469             stack = _stack;
    470             callerApp = _callerApp;
    471         }
    472 
    473         void sendErrorResult(String message) {
    474             try {
    475                 if (callerApp.thread != null) {
    476                     callerApp.thread.scheduleCrash(message);
    477                 }
    478             } catch (RemoteException e) {
    479                 Slog.e(TAG, "Exception scheduling crash of failed "
    480                         + "activity launcher sourceRecord=" + sourceRecord, e);
    481             }
    482         }
    483     }
    484 
    485     public ActivityStackSupervisor(ActivityManagerService service) {
    486         mService = service;
    487         mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper());
    488         mActivityMetricsLogger = new ActivityMetricsLogger(this, mService.mContext);
    489         mResizeDockedStackTimeout = new ResizeDockedStackTimeout(service, this, mHandler);
    490     }
    491 
    492     void setRecentTasks(RecentTasks recentTasks) {
    493         mRecentTasks = recentTasks;
    494     }
    495 
    496     /**
    497      * At the time when the constructor runs, the power manager has not yet been
    498      * initialized.  So we initialize our wakelocks afterwards.
    499      */
    500     void initPowerManagement() {
    501         PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE);
    502         mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
    503         mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*launch*");
    504         mLaunchingActivity.setReferenceCounted(false);
    505     }
    506 
    507     // This function returns a IStatusBarService. The value is from ServiceManager.
    508     // getService and is cached.
    509     private IStatusBarService getStatusBarService() {
    510         synchronized (mService) {
    511             if (mStatusBarService == null) {
    512                 mStatusBarService = IStatusBarService.Stub.asInterface(
    513                     ServiceManager.checkService(Context.STATUS_BAR_SERVICE));
    514                 if (mStatusBarService == null) {
    515                     Slog.w("StatusBarManager", "warning: no STATUS_BAR_SERVICE");
    516                 }
    517             }
    518             return mStatusBarService;
    519         }
    520     }
    521 
    522     private IDevicePolicyManager getDevicePolicyManager() {
    523         synchronized (mService) {
    524             if (mDevicePolicyManager == null) {
    525                 mDevicePolicyManager = IDevicePolicyManager.Stub.asInterface(
    526                     ServiceManager.checkService(Context.DEVICE_POLICY_SERVICE));
    527                 if (mDevicePolicyManager == null) {
    528                     Slog.w(TAG, "warning: no DEVICE_POLICY_SERVICE");
    529                 }
    530             }
    531             return mDevicePolicyManager;
    532         }
    533     }
    534 
    535     void setWindowManager(WindowManagerService wm) {
    536         synchronized (mService) {
    537             mWindowManager = wm;
    538 
    539             mDisplayManager =
    540                     (DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
    541             mDisplayManager.registerDisplayListener(this, null);
    542 
    543             Display[] displays = mDisplayManager.getDisplays();
    544             for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) {
    545                 final int displayId = displays[displayNdx].getDisplayId();
    546                 ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
    547                 if (activityDisplay.mDisplay == null) {
    548                     throw new IllegalStateException("Default Display does not exist");
    549                 }
    550                 mActivityDisplays.put(displayId, activityDisplay);
    551                 calculateDefaultMinimalSizeOfResizeableTasks(activityDisplay);
    552             }
    553 
    554             mHomeStack = mFocusedStack = mLastFocusedStack =
    555                     getStack(HOME_STACK_ID, CREATE_IF_NEEDED, ON_TOP);
    556 
    557             mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
    558         }
    559     }
    560 
    561     void notifyActivityDrawnForKeyguard() {
    562         if (DEBUG_LOCKSCREEN) mService.logLockScreen("");
    563         mWindowManager.notifyActivityDrawnForKeyguard();
    564     }
    565 
    566     ActivityStack getFocusedStack() {
    567         return mFocusedStack;
    568     }
    569 
    570     ActivityStack getLastStack() {
    571         return mLastFocusedStack;
    572     }
    573 
    574     boolean isFocusedStack(ActivityStack stack) {
    575         if (stack == null) {
    576             return false;
    577         }
    578 
    579         final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
    580         if (parent != null) {
    581             stack = parent.task.stack;
    582         }
    583         return stack == mFocusedStack;
    584     }
    585 
    586     /** The top most stack. */
    587     boolean isFrontStack(ActivityStack stack) {
    588         if (stack == null) {
    589             return false;
    590         }
    591 
    592         final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
    593         if (parent != null) {
    594             stack = parent.task.stack;
    595         }
    596         return stack == mHomeStack.mStacks.get((mHomeStack.mStacks.size() - 1));
    597     }
    598 
    599     /** NOTE: Should only be called from {@link ActivityStack#moveToFront} */
    600     void setFocusStackUnchecked(String reason, ActivityStack focusCandidate) {
    601         if (!focusCandidate.isFocusable()) {
    602             // The focus candidate isn't focusable. Move focus to the top stack that is focusable.
    603             focusCandidate = focusCandidate.getNextFocusableStackLocked();
    604         }
    605 
    606         if (focusCandidate != mFocusedStack) {
    607             mLastFocusedStack = mFocusedStack;
    608             mFocusedStack = focusCandidate;
    609 
    610             EventLogTags.writeAmFocusedStack(
    611                     mCurrentUser, mFocusedStack == null ? -1 : mFocusedStack.getStackId(),
    612                     mLastFocusedStack == null ? -1 : mLastFocusedStack.getStackId(), reason);
    613         }
    614 
    615         final ActivityRecord r = topRunningActivityLocked();
    616         if (!mService.mDoingSetFocusedActivity && mService.mFocusedActivity != r) {
    617             // The focus activity should always be the top activity in the focused stack.
    618             // There will be chaos and anarchy if it isn't...
    619             mService.setFocusedActivityLocked(r, reason + " setFocusStack");
    620         }
    621 
    622         if (mService.mBooting || !mService.mBooted) {
    623             if (r != null && r.idle) {
    624                 checkFinishBootingLocked();
    625             }
    626         }
    627     }
    628 
    629     void moveHomeStackToFront(String reason) {
    630         mHomeStack.moveToFront(reason);
    631     }
    632 
    633     /** Returns true if the focus activity was adjusted to the home stack top activity. */
    634     boolean moveHomeStackTaskToTop(int homeStackTaskType, String reason) {
    635         if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
    636             mWindowManager.showRecentApps(false /* fromHome */);
    637             return false;
    638         }
    639 
    640         mHomeStack.moveHomeStackTaskToTop(homeStackTaskType);
    641 
    642         final ActivityRecord top = getHomeActivity();
    643         if (top == null) {
    644             return false;
    645         }
    646         mService.setFocusedActivityLocked(top, reason);
    647         return true;
    648     }
    649 
    650     boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev, String reason) {
    651         if (!mService.mBooting && !mService.mBooted) {
    652             // Not ready yet!
    653             return false;
    654         }
    655 
    656         if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
    657             mWindowManager.showRecentApps(false /* fromHome */);
    658             return false;
    659         }
    660 
    661         if (prev != null) {
    662             prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
    663         }
    664 
    665         mHomeStack.moveHomeStackTaskToTop(homeStackTaskType);
    666         ActivityRecord r = getHomeActivity();
    667         final String myReason = reason + " resumeHomeStackTask";
    668 
    669         // Only resume home activity if isn't finishing.
    670         if (r != null && !r.finishing) {
    671             mService.setFocusedActivityLocked(r, myReason);
    672             return resumeFocusedStackTopActivityLocked(mHomeStack, prev, null);
    673         }
    674         return mService.startHomeActivityLocked(mCurrentUser, myReason);
    675     }
    676 
    677     TaskRecord anyTaskForIdLocked(int id) {
    678         return anyTaskForIdLocked(id, RESTORE_FROM_RECENTS, INVALID_STACK_ID);
    679     }
    680 
    681     /**
    682      * Returns a {@link TaskRecord} for the input id if available. Null otherwise.
    683      * @param id Id of the task we would like returned.
    684      * @param restoreFromRecents If the id was not in the active list, but was found in recents,
    685      *                           restore the task from recents to the active list.
    686      * @param stackId The stack to restore the task to (default launch stack will be used if
    687      *                stackId is {@link android.app.ActivityManager.StackId#INVALID_STACK_ID}).
    688      */
    689     TaskRecord anyTaskForIdLocked(int id, boolean restoreFromRecents, int stackId) {
    690         int numDisplays = mActivityDisplays.size();
    691         for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
    692             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    693             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    694                 ActivityStack stack = stacks.get(stackNdx);
    695                 TaskRecord task = stack.taskForIdLocked(id);
    696                 if (task != null) {
    697                     return task;
    698                 }
    699             }
    700         }
    701 
    702         // Don't give up! Look in recents.
    703         if (DEBUG_RECENTS) Slog.v(TAG_RECENTS, "Looking for task id=" + id + " in recents");
    704         TaskRecord task = mRecentTasks.taskForIdLocked(id);
    705         if (task == null) {
    706             if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "\tDidn't find task id=" + id + " in recents");
    707             return null;
    708         }
    709 
    710         if (!restoreFromRecents) {
    711             return task;
    712         }
    713 
    714         if (!restoreRecentTaskLocked(task, stackId)) {
    715             if (DEBUG_RECENTS) Slog.w(TAG_RECENTS,
    716                     "Couldn't restore task id=" + id + " found in recents");
    717             return null;
    718         }
    719         if (DEBUG_RECENTS) Slog.w(TAG_RECENTS, "Restored task id=" + id + " from in recents");
    720         return task;
    721     }
    722 
    723     ActivityRecord isInAnyStackLocked(IBinder token) {
    724         int numDisplays = mActivityDisplays.size();
    725         for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
    726             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    727             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    728                 final ActivityRecord r = stacks.get(stackNdx).isInStackLocked(token);
    729                 if (r != null) {
    730                     return r;
    731                 }
    732             }
    733         }
    734         return null;
    735     }
    736 
    737     /**
    738      * TODO: Handle freefom mode.
    739      * @return true when credential confirmation is needed for the user and there is any
    740      *         activity started by the user in any visible stack.
    741      */
    742     boolean isUserLockedProfile(@UserIdInt int userId) {
    743         if (!mService.mUserController.shouldConfirmCredentials(userId)) {
    744             return false;
    745         }
    746         final ActivityStack fullScreenStack = getStack(FULLSCREEN_WORKSPACE_STACK_ID);
    747         final ActivityStack dockedStack = getStack(DOCKED_STACK_ID);
    748         final ActivityStack[] activityStacks = new ActivityStack[] {fullScreenStack, dockedStack};
    749         for (final ActivityStack activityStack : activityStacks) {
    750             if (activityStack == null) {
    751                 continue;
    752             }
    753             if (activityStack.topRunningActivityLocked() == null) {
    754                 continue;
    755             }
    756             if (activityStack.getStackVisibilityLocked(null) == STACK_INVISIBLE) {
    757                 continue;
    758             }
    759             if (activityStack.isDockedStack() && mIsDockMinimized) {
    760                 continue;
    761             }
    762             final TaskRecord topTask = activityStack.topTask();
    763             if (topTask == null) {
    764                 continue;
    765             }
    766             // To handle the case that work app is in the task but just is not the top one.
    767             for (int i = topTask.mActivities.size() - 1; i >= 0; i--) {
    768                 final ActivityRecord activityRecord = topTask.mActivities.get(i);
    769                 if (activityRecord.userId == userId) {
    770                     return true;
    771                 }
    772             }
    773         }
    774         return false;
    775     }
    776 
    777     void setNextTaskIdForUserLocked(int taskId, int userId) {
    778         final int currentTaskId = mCurTaskIdForUser.get(userId, -1);
    779         if (taskId > currentTaskId) {
    780             mCurTaskIdForUser.put(userId, taskId);
    781         }
    782     }
    783 
    784     int getNextTaskIdForUserLocked(int userId) {
    785         final int currentTaskId = mCurTaskIdForUser.get(userId, userId * MAX_TASK_IDS_PER_USER);
    786         // for a userId u, a taskId can only be in the range
    787         // [u*MAX_TASK_IDS_PER_USER, (u+1)*MAX_TASK_IDS_PER_USER-1], so if MAX_TASK_IDS_PER_USER
    788         // was 10, user 0 could only have taskIds 0 to 9, user 1: 10 to 19, user 2: 20 to 29, so on.
    789         int candidateTaskId = currentTaskId;
    790         while (mRecentTasks.taskIdTakenForUserLocked(candidateTaskId, userId)
    791                 || anyTaskForIdLocked(candidateTaskId, !RESTORE_FROM_RECENTS,
    792                         INVALID_STACK_ID) != null) {
    793             candidateTaskId++;
    794             if (candidateTaskId == (userId + 1) * MAX_TASK_IDS_PER_USER) {
    795                 // Wrap around as there will be smaller task ids that are available now.
    796                 candidateTaskId -= MAX_TASK_IDS_PER_USER;
    797             }
    798             if (candidateTaskId == currentTaskId) {
    799                 // Something wrong!
    800                 // All MAX_TASK_IDS_PER_USER task ids are taken up by running tasks for this user
    801                 throw new IllegalStateException("Cannot get an available task id."
    802                         + " Reached limit of " + MAX_TASK_IDS_PER_USER
    803                         + " running tasks per user.");
    804             }
    805         }
    806         mCurTaskIdForUser.put(userId, candidateTaskId);
    807         return candidateTaskId;
    808     }
    809 
    810     ActivityRecord resumedAppLocked() {
    811         ActivityStack stack = mFocusedStack;
    812         if (stack == null) {
    813             return null;
    814         }
    815         ActivityRecord resumedActivity = stack.mResumedActivity;
    816         if (resumedActivity == null || resumedActivity.app == null) {
    817             resumedActivity = stack.mPausingActivity;
    818             if (resumedActivity == null || resumedActivity.app == null) {
    819                 resumedActivity = stack.topRunningActivityLocked();
    820             }
    821         }
    822         return resumedActivity;
    823     }
    824 
    825     boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
    826         final String processName = app.processName;
    827         boolean didSomething = false;
    828         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
    829             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    830             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    831                 final ActivityStack stack = stacks.get(stackNdx);
    832                 if (!isFocusedStack(stack)) {
    833                     continue;
    834                 }
    835                 ActivityRecord hr = stack.topRunningActivityLocked();
    836                 if (hr != null) {
    837                     if (hr.app == null && app.uid == hr.info.applicationInfo.uid
    838                             && processName.equals(hr.processName)) {
    839                         try {
    840                             if (realStartActivityLocked(hr, app, true, true)) {
    841                                 didSomething = true;
    842                             }
    843                         } catch (RemoteException e) {
    844                             Slog.w(TAG, "Exception in new application when starting activity "
    845                                   + hr.intent.getComponent().flattenToShortString(), e);
    846                             throw e;
    847                         }
    848                     }
    849                 }
    850             }
    851         }
    852         if (!didSomething) {
    853             ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
    854         }
    855         return didSomething;
    856     }
    857 
    858     boolean allResumedActivitiesIdle() {
    859         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
    860             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    861             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    862                 final ActivityStack stack = stacks.get(stackNdx);
    863                 if (!isFocusedStack(stack) || stack.numActivities() == 0) {
    864                     continue;
    865                 }
    866                 final ActivityRecord resumedActivity = stack.mResumedActivity;
    867                 if (resumedActivity == null || !resumedActivity.idle) {
    868                     if (DEBUG_STATES) Slog.d(TAG_STATES, "allResumedActivitiesIdle: stack="
    869                              + stack.mStackId + " " + resumedActivity + " not idle");
    870                     return false;
    871                 }
    872             }
    873         }
    874         return true;
    875     }
    876 
    877     boolean allResumedActivitiesComplete() {
    878         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
    879             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    880             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    881                 final ActivityStack stack = stacks.get(stackNdx);
    882                 if (isFocusedStack(stack)) {
    883                     final ActivityRecord r = stack.mResumedActivity;
    884                     if (r != null && r.state != RESUMED) {
    885                         return false;
    886                     }
    887                 }
    888             }
    889         }
    890         // TODO: Not sure if this should check if all Paused are complete too.
    891         if (DEBUG_STACK) Slog.d(TAG_STACK,
    892                 "allResumedActivitiesComplete: mLastFocusedStack changing from=" +
    893                 mLastFocusedStack + " to=" + mFocusedStack);
    894         mLastFocusedStack = mFocusedStack;
    895         return true;
    896     }
    897 
    898     boolean allResumedActivitiesVisible() {
    899         boolean foundResumed = false;
    900         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
    901             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    902             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    903                 final ActivityStack stack = stacks.get(stackNdx);
    904                 final ActivityRecord r = stack.mResumedActivity;
    905                 if (r != null) {
    906                     if (!r.nowVisible || mWaitingVisibleActivities.contains(r)) {
    907                         return false;
    908                     }
    909                     foundResumed = true;
    910                 }
    911             }
    912         }
    913         return foundResumed;
    914     }
    915 
    916     /**
    917      * Pause all activities in either all of the stacks or just the back stacks.
    918      * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving().
    919      * @return true if any activity was paused as a result of this call.
    920      */
    921     boolean pauseBackStacks(boolean userLeaving, boolean resuming, boolean dontWait) {
    922         boolean someActivityPaused = false;
    923         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
    924             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    925             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    926                 final ActivityStack stack = stacks.get(stackNdx);
    927                 if (!isFocusedStack(stack) && stack.mResumedActivity != null) {
    928                     if (DEBUG_STATES) Slog.d(TAG_STATES, "pauseBackStacks: stack=" + stack +
    929                             " mResumedActivity=" + stack.mResumedActivity);
    930                     someActivityPaused |= stack.startPausingLocked(userLeaving, false, resuming,
    931                             dontWait);
    932                 }
    933             }
    934         }
    935         return someActivityPaused;
    936     }
    937 
    938     boolean allPausedActivitiesComplete() {
    939         boolean pausing = true;
    940         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
    941             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    942             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    943                 final ActivityStack stack = stacks.get(stackNdx);
    944                 final ActivityRecord r = stack.mPausingActivity;
    945                 if (r != null && r.state != PAUSED && r.state != STOPPED && r.state != STOPPING) {
    946                     if (DEBUG_STATES) {
    947                         Slog.d(TAG_STATES,
    948                                 "allPausedActivitiesComplete: r=" + r + " state=" + r.state);
    949                         pausing = false;
    950                     } else {
    951                         return false;
    952                     }
    953                 }
    954             }
    955         }
    956         return pausing;
    957     }
    958 
    959     void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping,
    960             boolean resuming, boolean dontWait) {
    961         // TODO: Put all stacks in supervisor and iterate through them instead.
    962         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
    963             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    964             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    965                 final ActivityStack stack = stacks.get(stackNdx);
    966                 if (stack.mResumedActivity != null &&
    967                         stack.mActivityContainer.mParentActivity == parent) {
    968                     stack.startPausingLocked(userLeaving, uiSleeping, resuming, dontWait);
    969                 }
    970             }
    971         }
    972     }
    973 
    974     void cancelInitializingActivities() {
    975         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
    976             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
    977             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
    978                 stacks.get(stackNdx).cancelInitializingActivities();
    979             }
    980         }
    981     }
    982 
    983     void reportActivityVisibleLocked(ActivityRecord r) {
    984         sendWaitingVisibleReportLocked(r);
    985     }
    986 
    987     void sendWaitingVisibleReportLocked(ActivityRecord r) {
    988         boolean changed = false;
    989         for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
    990             WaitResult w = mWaitingActivityVisible.get(i);
    991             if (w.who == null) {
    992                 changed = true;
    993                 w.timeout = false;
    994                 if (r != null) {
    995                     w.who = new ComponentName(r.info.packageName, r.info.name);
    996                 }
    997                 w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
    998                 w.thisTime = w.totalTime;
    999             }
   1000         }
   1001         if (changed) {
   1002             mService.notifyAll();
   1003         }
   1004     }
   1005 
   1006     void reportTaskToFrontNoLaunch(ActivityRecord r) {
   1007         boolean changed = false;
   1008         for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
   1009             WaitResult w = mWaitingActivityLaunched.remove(i);
   1010             if (w.who == null) {
   1011                 changed = true;
   1012                 // Set result to START_TASK_TO_FRONT so that startActivityMayWait() knows that
   1013                 // the starting activity ends up moving another activity to front, and it should
   1014                 // wait for this new activity to become visible instead.
   1015                 // Do not modify other fields.
   1016                 w.result = START_TASK_TO_FRONT;
   1017             }
   1018         }
   1019         if (changed) {
   1020             mService.notifyAll();
   1021         }
   1022     }
   1023 
   1024     void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
   1025             long thisTime, long totalTime) {
   1026         boolean changed = false;
   1027         for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
   1028             WaitResult w = mWaitingActivityLaunched.remove(i);
   1029             if (w.who == null) {
   1030                 changed = true;
   1031                 w.timeout = timeout;
   1032                 if (r != null) {
   1033                     w.who = new ComponentName(r.info.packageName, r.info.name);
   1034                 }
   1035                 w.thisTime = thisTime;
   1036                 w.totalTime = totalTime;
   1037                 // Do not modify w.result.
   1038             }
   1039         }
   1040         if (changed) {
   1041             mService.notifyAll();
   1042         }
   1043     }
   1044 
   1045     ActivityRecord topRunningActivityLocked() {
   1046         final ActivityStack focusedStack = mFocusedStack;
   1047         ActivityRecord r = focusedStack.topRunningActivityLocked();
   1048         if (r != null) {
   1049             return r;
   1050         }
   1051 
   1052         // Return to the home stack.
   1053         final ArrayList<ActivityStack> stacks = mHomeStack.mStacks;
   1054         for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   1055             final ActivityStack stack = stacks.get(stackNdx);
   1056             if (stack != focusedStack && isFrontStack(stack) && stack.isFocusable()) {
   1057                 r = stack.topRunningActivityLocked();
   1058                 if (r != null) {
   1059                     return r;
   1060                 }
   1061             }
   1062         }
   1063         return null;
   1064     }
   1065 
   1066     void getTasksLocked(int maxNum, List<RunningTaskInfo> list, int callingUid, boolean allowed) {
   1067         // Gather all of the running tasks for each stack into runningTaskLists.
   1068         ArrayList<ArrayList<RunningTaskInfo>> runningTaskLists =
   1069                 new ArrayList<ArrayList<RunningTaskInfo>>();
   1070         final int numDisplays = mActivityDisplays.size();
   1071         for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
   1072             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   1073             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   1074                 final ActivityStack stack = stacks.get(stackNdx);
   1075                 ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<>();
   1076                 runningTaskLists.add(stackTaskList);
   1077                 stack.getTasksLocked(stackTaskList, callingUid, allowed);
   1078             }
   1079         }
   1080 
   1081         // The lists are already sorted from most recent to oldest. Just pull the most recent off
   1082         // each list and add it to list. Stop when all lists are empty or maxNum reached.
   1083         while (maxNum > 0) {
   1084             long mostRecentActiveTime = Long.MIN_VALUE;
   1085             ArrayList<RunningTaskInfo> selectedStackList = null;
   1086             final int numTaskLists = runningTaskLists.size();
   1087             for (int stackNdx = 0; stackNdx < numTaskLists; ++stackNdx) {
   1088                 ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists.get(stackNdx);
   1089                 if (!stackTaskList.isEmpty()) {
   1090                     final long lastActiveTime = stackTaskList.get(0).lastActiveTime;
   1091                     if (lastActiveTime > mostRecentActiveTime) {
   1092                         mostRecentActiveTime = lastActiveTime;
   1093                         selectedStackList = stackTaskList;
   1094                     }
   1095                 }
   1096             }
   1097             if (selectedStackList != null) {
   1098                 list.add(selectedStackList.remove(0));
   1099                 --maxNum;
   1100             } else {
   1101                 break;
   1102             }
   1103         }
   1104     }
   1105 
   1106     ActivityInfo resolveActivity(Intent intent, ResolveInfo rInfo, int startFlags,
   1107             ProfilerInfo profilerInfo) {
   1108         final ActivityInfo aInfo = rInfo != null ? rInfo.activityInfo : null;
   1109         if (aInfo != null) {
   1110             // Store the found target back into the intent, because now that
   1111             // we have it we never want to do this again.  For example, if the
   1112             // user navigates back to this point in the history, we should
   1113             // always restart the exact same activity.
   1114             intent.setComponent(new ComponentName(
   1115                     aInfo.applicationInfo.packageName, aInfo.name));
   1116 
   1117             // Don't debug things in the system process
   1118             if (!aInfo.processName.equals("system")) {
   1119                 if ((startFlags & ActivityManager.START_FLAG_DEBUG) != 0) {
   1120                     mService.setDebugApp(aInfo.processName, true, false);
   1121                 }
   1122 
   1123                 if ((startFlags & ActivityManager.START_FLAG_NATIVE_DEBUGGING) != 0) {
   1124                     mService.setNativeDebuggingAppLocked(aInfo.applicationInfo, aInfo.processName);
   1125                 }
   1126 
   1127                 if ((startFlags & ActivityManager.START_FLAG_TRACK_ALLOCATION) != 0) {
   1128                     mService.setTrackAllocationApp(aInfo.applicationInfo, aInfo.processName);
   1129                 }
   1130 
   1131                 if (profilerInfo != null) {
   1132                     mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo);
   1133                 }
   1134             }
   1135         }
   1136         return aInfo;
   1137     }
   1138 
   1139     ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId) {
   1140         return resolveIntent(intent, resolvedType, userId, 0);
   1141     }
   1142 
   1143     ResolveInfo resolveIntent(Intent intent, String resolvedType, int userId, int flags) {
   1144         try {
   1145             return AppGlobals.getPackageManager().resolveIntent(intent, resolvedType,
   1146                     PackageManager.MATCH_DEFAULT_ONLY | flags
   1147                     | ActivityManagerService.STOCK_PM_FLAGS, userId);
   1148         } catch (RemoteException e) {
   1149         }
   1150         return null;
   1151     }
   1152 
   1153     ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
   1154             ProfilerInfo profilerInfo, int userId) {
   1155         final ResolveInfo rInfo = resolveIntent(intent, resolvedType, userId);
   1156         return resolveActivity(intent, rInfo, startFlags, profilerInfo);
   1157     }
   1158 
   1159     final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,
   1160             boolean andResume, boolean checkConfig) throws RemoteException {
   1161 
   1162         if (!allPausedActivitiesComplete()) {
   1163             // While there are activities pausing we skipping starting any new activities until
   1164             // pauses are complete. NOTE: that we also do this for activities that are starting in
   1165             // the paused state because they will first be resumed then paused on the client side.
   1166             if (DEBUG_SWITCH || DEBUG_PAUSE || DEBUG_STATES) Slog.v(TAG_PAUSE,
   1167                     "realStartActivityLocked: Skipping start of r=" + r
   1168                     + " some activities pausing...");
   1169             return false;
   1170         }
   1171 
   1172         if (andResume) {
   1173             r.startFreezingScreenLocked(app, 0);
   1174             mWindowManager.setAppVisibility(r.appToken, true);
   1175 
   1176             // schedule launch ticks to collect information about slow apps.
   1177             r.startLaunchTickingLocked();
   1178         }
   1179 
   1180         // Have the window manager re-evaluate the orientation of
   1181         // the screen based on the new activity order.  Note that
   1182         // as a result of this, it can call back into the activity
   1183         // manager with a new orientation.  We don't care about that,
   1184         // because the activity is not currently running so we are
   1185         // just restarting it anyway.
   1186         if (checkConfig) {
   1187             Configuration config = mWindowManager.updateOrientationFromAppTokens(
   1188                     mService.mConfiguration,
   1189                     r.mayFreezeScreenLocked(app) ? r.appToken : null);
   1190             mService.updateConfigurationLocked(config, r, false);
   1191         }
   1192 
   1193         r.app = app;
   1194         app.waitingToKill = null;
   1195         r.launchCount++;
   1196         r.lastLaunchTime = SystemClock.uptimeMillis();
   1197 
   1198         if (DEBUG_ALL) Slog.v(TAG, "Launching: " + r);
   1199 
   1200         int idx = app.activities.indexOf(r);
   1201         if (idx < 0) {
   1202             app.activities.add(r);
   1203         }
   1204         mService.updateLruProcessLocked(app, true, null);
   1205         mService.updateOomAdjLocked();
   1206 
   1207         final TaskRecord task = r.task;
   1208         if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE ||
   1209                 task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE_PRIV) {
   1210             setLockTaskModeLocked(task, LOCK_TASK_MODE_LOCKED, "mLockTaskAuth==LAUNCHABLE", false);
   1211         }
   1212 
   1213         final ActivityStack stack = task.stack;
   1214         try {
   1215             if (app.thread == null) {
   1216                 throw new RemoteException();
   1217             }
   1218             List<ResultInfo> results = null;
   1219             List<ReferrerIntent> newIntents = null;
   1220             if (andResume) {
   1221                 results = r.results;
   1222                 newIntents = r.newIntents;
   1223             }
   1224             if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
   1225                     "Launching: " + r + " icicle=" + r.icicle + " with results=" + results
   1226                     + " newIntents=" + newIntents + " andResume=" + andResume);
   1227             if (andResume) {
   1228                 EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
   1229                         r.userId, System.identityHashCode(r),
   1230                         task.taskId, r.shortComponentName);
   1231             }
   1232             if (r.isHomeActivity()) {
   1233                 // Home process is the root process of the task.
   1234                 mService.mHomeProcess = task.mActivities.get(0).app;
   1235             }
   1236             mService.notifyPackageUse(r.intent.getComponent().getPackageName(),
   1237                                       PackageManager.NOTIFY_PACKAGE_USE_ACTIVITY);
   1238             r.sleeping = false;
   1239             r.forceNewConfig = false;
   1240             mService.showUnsupportedZoomDialogIfNeededLocked(r);
   1241             mService.showAskCompatModeDialogLocked(r);
   1242             r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
   1243             ProfilerInfo profilerInfo = null;
   1244             if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
   1245                 if (mService.mProfileProc == null || mService.mProfileProc == app) {
   1246                     mService.mProfileProc = app;
   1247                     final String profileFile = mService.mProfileFile;
   1248                     if (profileFile != null) {
   1249                         ParcelFileDescriptor profileFd = mService.mProfileFd;
   1250                         if (profileFd != null) {
   1251                             try {
   1252                                 profileFd = profileFd.dup();
   1253                             } catch (IOException e) {
   1254                                 if (profileFd != null) {
   1255                                     try {
   1256                                         profileFd.close();
   1257                                     } catch (IOException o) {
   1258                                     }
   1259                                     profileFd = null;
   1260                                 }
   1261                             }
   1262                         }
   1263 
   1264                         profilerInfo = new ProfilerInfo(profileFile, profileFd,
   1265                                 mService.mSamplingInterval, mService.mAutoStopProfiler);
   1266                     }
   1267                 }
   1268             }
   1269 
   1270             if (andResume) {
   1271                 app.hasShownUi = true;
   1272                 app.pendingUiClean = true;
   1273             }
   1274             app.forceProcessStateUpTo(mService.mTopProcessState);
   1275             app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
   1276                     System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
   1277                     new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,
   1278                     task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
   1279                     newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
   1280 
   1281             if ((app.info.privateFlags&ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) {
   1282                 // This may be a heavy-weight process!  Note that the package
   1283                 // manager will ensure that only activity can run in the main
   1284                 // process of the .apk, which is the only thing that will be
   1285                 // considered heavy-weight.
   1286                 if (app.processName.equals(app.info.packageName)) {
   1287                     if (mService.mHeavyWeightProcess != null
   1288                             && mService.mHeavyWeightProcess != app) {
   1289                         Slog.w(TAG, "Starting new heavy weight process " + app
   1290                                 + " when already running "
   1291                                 + mService.mHeavyWeightProcess);
   1292                     }
   1293                     mService.mHeavyWeightProcess = app;
   1294                     Message msg = mService.mHandler.obtainMessage(
   1295                             ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
   1296                     msg.obj = r;
   1297                     mService.mHandler.sendMessage(msg);
   1298                 }
   1299             }
   1300 
   1301         } catch (RemoteException e) {
   1302             if (r.launchFailed) {
   1303                 // This is the second time we failed -- finish activity
   1304                 // and give up.
   1305                 Slog.e(TAG, "Second failure launching "
   1306                       + r.intent.getComponent().flattenToShortString()
   1307                       + ", giving up", e);
   1308                 mService.appDiedLocked(app);
   1309                 stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
   1310                         "2nd-crash", false);
   1311                 return false;
   1312             }
   1313 
   1314             // This is the first time we failed -- restart process and
   1315             // retry.
   1316             app.activities.remove(r);
   1317             throw e;
   1318         }
   1319 
   1320         r.launchFailed = false;
   1321         if (stack.updateLRUListLocked(r)) {
   1322             Slog.w(TAG, "Activity " + r + " being launched, but already in LRU list");
   1323         }
   1324 
   1325         if (andResume) {
   1326             // As part of the process of launching, ActivityThread also performs
   1327             // a resume.
   1328             stack.minimalResumeActivityLocked(r);
   1329         } else {
   1330             // This activity is not starting in the resumed state... which should look like we asked
   1331             // it to pause+stop (but remain visible), and it has done so and reported back the
   1332             // current icicle and other state.
   1333             if (DEBUG_STATES) Slog.v(TAG_STATES,
   1334                     "Moving to PAUSED: " + r + " (starting in paused state)");
   1335             r.state = PAUSED;
   1336         }
   1337 
   1338         // Launch the new version setup screen if needed.  We do this -after-
   1339         // launching the initial activity (that is, home), so that it can have
   1340         // a chance to initialize itself while in the background, making the
   1341         // switch back to it faster and look better.
   1342         if (isFocusedStack(stack)) {
   1343             mService.startSetupActivityLocked();
   1344         }
   1345 
   1346         // Update any services we are bound to that might care about whether
   1347         // their client may have activities.
   1348         if (r.app != null) {
   1349             mService.mServices.updateServiceConnectionActivitiesLocked(r.app);
   1350         }
   1351 
   1352         return true;
   1353     }
   1354 
   1355     void startSpecificActivityLocked(ActivityRecord r,
   1356             boolean andResume, boolean checkConfig) {
   1357         // Is this activity's application already running?
   1358         ProcessRecord app = mService.getProcessRecordLocked(r.processName,
   1359                 r.info.applicationInfo.uid, true);
   1360 
   1361         r.task.stack.setLaunchTime(r);
   1362 
   1363         if (app != null && app.thread != null) {
   1364             try {
   1365                 if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
   1366                         || !"android".equals(r.info.packageName)) {
   1367                     // Don't add this if it is a platform component that is marked
   1368                     // to run in multiple processes, because this is actually
   1369                     // part of the framework so doesn't make sense to track as a
   1370                     // separate apk in the process.
   1371                     app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
   1372                             mService.mProcessStats);
   1373                 }
   1374                 realStartActivityLocked(r, app, andResume, checkConfig);
   1375                 return;
   1376             } catch (RemoteException e) {
   1377                 Slog.w(TAG, "Exception when starting activity "
   1378                         + r.intent.getComponent().flattenToShortString(), e);
   1379             }
   1380 
   1381             // If a dead object exception was thrown -- fall through to
   1382             // restart the application.
   1383         }
   1384 
   1385         mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
   1386                 "activity", r.intent.getComponent(), false, false, true);
   1387     }
   1388 
   1389     boolean checkStartAnyActivityPermission(Intent intent, ActivityInfo aInfo,
   1390             String resultWho, int requestCode, int callingPid, int callingUid,
   1391             String callingPackage, boolean ignoreTargetSecurity, ProcessRecord callerApp,
   1392             ActivityRecord resultRecord, ActivityStack resultStack, ActivityOptions options) {
   1393         final int startAnyPerm = mService.checkPermission(START_ANY_ACTIVITY, callingPid,
   1394                 callingUid);
   1395         if (startAnyPerm ==  PERMISSION_GRANTED) {
   1396             return true;
   1397         }
   1398         final int componentRestriction = getComponentRestrictionForCallingPackage(
   1399                 aInfo, callingPackage, callingPid, callingUid, ignoreTargetSecurity);
   1400         final int actionRestriction = getActionRestrictionForCallingPackage(
   1401                 intent.getAction(), callingPackage, callingPid, callingUid);
   1402         if (componentRestriction == ACTIVITY_RESTRICTION_PERMISSION
   1403                 || actionRestriction == ACTIVITY_RESTRICTION_PERMISSION) {
   1404             if (resultRecord != null) {
   1405                 resultStack.sendActivityResultLocked(-1,
   1406                         resultRecord, resultWho, requestCode,
   1407                         Activity.RESULT_CANCELED, null);
   1408             }
   1409             final String msg;
   1410             if (actionRestriction == ACTIVITY_RESTRICTION_PERMISSION) {
   1411                 msg = "Permission Denial: starting " + intent.toString()
   1412                         + " from " + callerApp + " (pid=" + callingPid
   1413                         + ", uid=" + callingUid + ")" + " with revoked permission "
   1414                         + ACTION_TO_RUNTIME_PERMISSION.get(intent.getAction());
   1415             } else if (!aInfo.exported) {
   1416                 msg = "Permission Denial: starting " + intent.toString()
   1417                         + " from " + callerApp + " (pid=" + callingPid
   1418                         + ", uid=" + callingUid + ")"
   1419                         + " not exported from uid " + aInfo.applicationInfo.uid;
   1420             } else {
   1421                 msg = "Permission Denial: starting " + intent.toString()
   1422                         + " from " + callerApp + " (pid=" + callingPid
   1423                         + ", uid=" + callingUid + ")"
   1424                         + " requires " + aInfo.permission;
   1425             }
   1426             Slog.w(TAG, msg);
   1427             throw new SecurityException(msg);
   1428         }
   1429 
   1430         if (actionRestriction == ACTIVITY_RESTRICTION_APPOP) {
   1431             final String message = "Appop Denial: starting " + intent.toString()
   1432                     + " from " + callerApp + " (pid=" + callingPid
   1433                     + ", uid=" + callingUid + ")"
   1434                     + " requires " + AppOpsManager.permissionToOp(
   1435                             ACTION_TO_RUNTIME_PERMISSION.get(intent.getAction()));
   1436             Slog.w(TAG, message);
   1437             return false;
   1438         } else if (componentRestriction == ACTIVITY_RESTRICTION_APPOP) {
   1439             final String message = "Appop Denial: starting " + intent.toString()
   1440                     + " from " + callerApp + " (pid=" + callingPid
   1441                     + ", uid=" + callingUid + ")"
   1442                     + " requires appop " + AppOpsManager.permissionToOp(aInfo.permission);
   1443             Slog.w(TAG, message);
   1444             return false;
   1445         }
   1446         if (options != null && options.getLaunchTaskId() != -1) {
   1447             final int startInTaskPerm = mService.checkPermission(START_TASKS_FROM_RECENTS,
   1448                     callingPid, callingUid);
   1449             if (startInTaskPerm != PERMISSION_GRANTED) {
   1450                 final String msg = "Permission Denial: starting " + intent.toString()
   1451                         + " from " + callerApp + " (pid=" + callingPid
   1452                         + ", uid=" + callingUid + ") with launchTaskId="
   1453                         + options.getLaunchTaskId();
   1454                 Slog.w(TAG, msg);
   1455                 throw new SecurityException(msg);
   1456             }
   1457         }
   1458 
   1459         return true;
   1460     }
   1461 
   1462     UserInfo getUserInfo(int userId) {
   1463         final long identity = Binder.clearCallingIdentity();
   1464         try {
   1465             return UserManager.get(mService.mContext).getUserInfo(userId);
   1466         } finally {
   1467             Binder.restoreCallingIdentity(identity);
   1468         }
   1469     }
   1470 
   1471     private int getComponentRestrictionForCallingPackage(ActivityInfo activityInfo,
   1472             String callingPackage, int callingPid, int callingUid, boolean ignoreTargetSecurity) {
   1473         if (!ignoreTargetSecurity && mService.checkComponentPermission(activityInfo.permission,
   1474                 callingPid, callingUid, activityInfo.applicationInfo.uid, activityInfo.exported)
   1475                 == PackageManager.PERMISSION_DENIED) {
   1476             return ACTIVITY_RESTRICTION_PERMISSION;
   1477         }
   1478 
   1479         if (activityInfo.permission == null) {
   1480             return ACTIVITY_RESTRICTION_NONE;
   1481         }
   1482 
   1483         final int opCode = AppOpsManager.permissionToOpCode(activityInfo.permission);
   1484         if (opCode == AppOpsManager.OP_NONE) {
   1485             return ACTIVITY_RESTRICTION_NONE;
   1486         }
   1487 
   1488         if (mService.mAppOpsService.noteOperation(opCode, callingUid,
   1489                 callingPackage) != AppOpsManager.MODE_ALLOWED) {
   1490             if (!ignoreTargetSecurity) {
   1491                 return ACTIVITY_RESTRICTION_APPOP;
   1492             }
   1493         }
   1494 
   1495         return ACTIVITY_RESTRICTION_NONE;
   1496     }
   1497 
   1498     private int getActionRestrictionForCallingPackage(String action,
   1499             String callingPackage, int callingPid, int callingUid) {
   1500         if (action == null) {
   1501             return ACTIVITY_RESTRICTION_NONE;
   1502         }
   1503 
   1504         String permission = ACTION_TO_RUNTIME_PERMISSION.get(action);
   1505         if (permission == null) {
   1506             return ACTIVITY_RESTRICTION_NONE;
   1507         }
   1508 
   1509         final PackageInfo packageInfo;
   1510         try {
   1511             packageInfo = mService.mContext.getPackageManager()
   1512                     .getPackageInfo(callingPackage, PackageManager.GET_PERMISSIONS);
   1513         } catch (PackageManager.NameNotFoundException e) {
   1514             Slog.i(TAG, "Cannot find package info for " + callingPackage);
   1515             return ACTIVITY_RESTRICTION_NONE;
   1516         }
   1517 
   1518         if (!ArrayUtils.contains(packageInfo.requestedPermissions, permission)) {
   1519             return ACTIVITY_RESTRICTION_NONE;
   1520         }
   1521 
   1522         if (mService.checkPermission(permission, callingPid, callingUid) ==
   1523                 PackageManager.PERMISSION_DENIED) {
   1524             return ACTIVITY_RESTRICTION_PERMISSION;
   1525         }
   1526 
   1527         final int opCode = AppOpsManager.permissionToOpCode(permission);
   1528         if (opCode == AppOpsManager.OP_NONE) {
   1529             return ACTIVITY_RESTRICTION_NONE;
   1530         }
   1531 
   1532         if (mService.mAppOpsService.noteOperation(opCode, callingUid,
   1533                 callingPackage) != AppOpsManager.MODE_ALLOWED) {
   1534             return ACTIVITY_RESTRICTION_APPOP;
   1535         }
   1536 
   1537         return ACTIVITY_RESTRICTION_NONE;
   1538     }
   1539 
   1540     boolean moveActivityStackToFront(ActivityRecord r, String reason) {
   1541         if (r == null) {
   1542             // Not sure what you are trying to do, but it is not going to work...
   1543             return false;
   1544         }
   1545         final TaskRecord task = r.task;
   1546         if (task == null || task.stack == null) {
   1547             Slog.w(TAG, "Can't move stack to front for r=" + r + " task=" + task);
   1548             return false;
   1549         }
   1550         task.stack.moveToFront(reason, task);
   1551         return true;
   1552     }
   1553 
   1554     void setLaunchSource(int uid) {
   1555         mLaunchingActivity.setWorkSource(new WorkSource(uid));
   1556     }
   1557 
   1558     void acquireLaunchWakelock() {
   1559         if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
   1560             throw new IllegalStateException("Calling must be system uid");
   1561         }
   1562         mLaunchingActivity.acquire();
   1563         if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
   1564             // To be safe, don't allow the wake lock to be held for too long.
   1565             mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
   1566         }
   1567     }
   1568 
   1569     /**
   1570      * Called when the frontmost task is idle.
   1571      * @return the state of mService.mBooting before this was called.
   1572      */
   1573     private boolean checkFinishBootingLocked() {
   1574         final boolean booting = mService.mBooting;
   1575         boolean enableScreen = false;
   1576         mService.mBooting = false;
   1577         if (!mService.mBooted) {
   1578             mService.mBooted = true;
   1579             enableScreen = true;
   1580         }
   1581         if (booting || enableScreen) {
   1582             mService.postFinishBooting(booting, enableScreen);
   1583         }
   1584         return booting;
   1585     }
   1586 
   1587     // Checked.
   1588     final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
   1589             Configuration config) {
   1590         if (DEBUG_ALL) Slog.v(TAG, "Activity idle: " + token);
   1591 
   1592         ArrayList<ActivityRecord> finishes = null;
   1593         ArrayList<UserState> startingUsers = null;
   1594         int NS = 0;
   1595         int NF = 0;
   1596         boolean booting = false;
   1597         boolean activityRemoved = false;
   1598 
   1599         ActivityRecord r = ActivityRecord.forTokenLocked(token);
   1600         if (r != null) {
   1601             if (DEBUG_IDLE) Slog.d(TAG_IDLE, "activityIdleInternalLocked: Callers="
   1602                     + Debug.getCallers(4));
   1603             mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
   1604             r.finishLaunchTickingLocked();
   1605             if (fromTimeout) {
   1606                 reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
   1607             }
   1608 
   1609             // This is a hack to semi-deal with a race condition
   1610             // in the client where it can be constructed with a
   1611             // newer configuration from when we asked it to launch.
   1612             // We'll update with whatever configuration it now says
   1613             // it used to launch.
   1614             if (config != null) {
   1615                 r.configuration = config;
   1616             }
   1617 
   1618             // We are now idle.  If someone is waiting for a thumbnail from
   1619             // us, we can now deliver.
   1620             r.idle = true;
   1621 
   1622             //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
   1623             if (isFocusedStack(r.task.stack) || fromTimeout) {
   1624                 booting = checkFinishBootingLocked();
   1625             }
   1626         }
   1627 
   1628         if (allResumedActivitiesIdle()) {
   1629             if (r != null) {
   1630                 mService.scheduleAppGcsLocked();
   1631             }
   1632 
   1633             if (mLaunchingActivity.isHeld()) {
   1634                 mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
   1635                 if (VALIDATE_WAKE_LOCK_CALLER &&
   1636                         Binder.getCallingUid() != Process.myUid()) {
   1637                     throw new IllegalStateException("Calling must be system uid");
   1638                 }
   1639                 mLaunchingActivity.release();
   1640             }
   1641             ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
   1642         }
   1643 
   1644         // Atomically retrieve all of the other things to do.
   1645         final ArrayList<ActivityRecord> stops = processStoppingActivitiesLocked(true);
   1646         NS = stops != null ? stops.size() : 0;
   1647         if ((NF = mFinishingActivities.size()) > 0) {
   1648             finishes = new ArrayList<>(mFinishingActivities);
   1649             mFinishingActivities.clear();
   1650         }
   1651 
   1652         if (mStartingUsers.size() > 0) {
   1653             startingUsers = new ArrayList<>(mStartingUsers);
   1654             mStartingUsers.clear();
   1655         }
   1656 
   1657         // Stop any activities that are scheduled to do so but have been
   1658         // waiting for the next one to start.
   1659         for (int i = 0; i < NS; i++) {
   1660             r = stops.get(i);
   1661             final ActivityStack stack = r.task.stack;
   1662             if (stack != null) {
   1663                 if (r.finishing) {
   1664                     stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
   1665                 } else {
   1666                     stack.stopActivityLocked(r);
   1667                 }
   1668             }
   1669         }
   1670 
   1671         // Finish any activities that are scheduled to do so but have been
   1672         // waiting for the next one to start.
   1673         for (int i = 0; i < NF; i++) {
   1674             r = finishes.get(i);
   1675             final ActivityStack stack = r.task.stack;
   1676             if (stack != null) {
   1677                 activityRemoved |= stack.destroyActivityLocked(r, true, "finish-idle");
   1678             }
   1679         }
   1680 
   1681         if (!booting) {
   1682             // Complete user switch
   1683             if (startingUsers != null) {
   1684                 for (int i = 0; i < startingUsers.size(); i++) {
   1685                     mService.mUserController.finishUserSwitch(startingUsers.get(i));
   1686                 }
   1687             }
   1688         }
   1689 
   1690         mService.trimApplications();
   1691         //dump();
   1692         //mWindowManager.dump();
   1693 
   1694         if (activityRemoved) {
   1695             resumeFocusedStackTopActivityLocked();
   1696         }
   1697 
   1698         return r;
   1699     }
   1700 
   1701     boolean handleAppDiedLocked(ProcessRecord app) {
   1702         boolean hasVisibleActivities = false;
   1703         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   1704             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   1705             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   1706                 hasVisibleActivities |= stacks.get(stackNdx).handleAppDiedLocked(app);
   1707             }
   1708         }
   1709         return hasVisibleActivities;
   1710     }
   1711 
   1712     void closeSystemDialogsLocked() {
   1713         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   1714             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   1715             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   1716                 stacks.get(stackNdx).closeSystemDialogsLocked();
   1717             }
   1718         }
   1719     }
   1720 
   1721     void removeUserLocked(int userId) {
   1722         mUserStackInFront.delete(userId);
   1723     }
   1724 
   1725     /**
   1726      * Update the last used stack id for non-current user (current user's last
   1727      * used stack is the focused stack)
   1728      */
   1729     void updateUserStackLocked(int userId, ActivityStack stack) {
   1730         if (userId != mCurrentUser) {
   1731             mUserStackInFront.put(userId, stack != null ? stack.getStackId() : HOME_STACK_ID);
   1732         }
   1733     }
   1734 
   1735     /**
   1736      * @return true if some activity was finished (or would have finished if doit were true).
   1737      */
   1738     boolean finishDisabledPackageActivitiesLocked(String packageName, Set<String> filterByClasses,
   1739             boolean doit, boolean evenPersistent, int userId) {
   1740         boolean didSomething = false;
   1741         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   1742             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   1743             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   1744                 final ActivityStack stack = stacks.get(stackNdx);
   1745                 if (stack.finishDisabledPackageActivitiesLocked(
   1746                         packageName, filterByClasses, doit, evenPersistent, userId)) {
   1747                     didSomething = true;
   1748                 }
   1749             }
   1750         }
   1751         return didSomething;
   1752     }
   1753 
   1754     void updatePreviousProcessLocked(ActivityRecord r) {
   1755         // Now that this process has stopped, we may want to consider
   1756         // it to be the previous app to try to keep around in case
   1757         // the user wants to return to it.
   1758 
   1759         // First, found out what is currently the foreground app, so that
   1760         // we don't blow away the previous app if this activity is being
   1761         // hosted by the process that is actually still the foreground.
   1762         ProcessRecord fgApp = null;
   1763         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   1764             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   1765             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   1766                 final ActivityStack stack = stacks.get(stackNdx);
   1767                 if (isFocusedStack(stack)) {
   1768                     if (stack.mResumedActivity != null) {
   1769                         fgApp = stack.mResumedActivity.app;
   1770                     } else if (stack.mPausingActivity != null) {
   1771                         fgApp = stack.mPausingActivity.app;
   1772                     }
   1773                     break;
   1774                 }
   1775             }
   1776         }
   1777 
   1778         // Now set this one as the previous process, only if that really
   1779         // makes sense to.
   1780         if (r.app != null && fgApp != null && r.app != fgApp
   1781                 && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
   1782                 && r.app != mService.mHomeProcess) {
   1783             mService.mPreviousProcess = r.app;
   1784             mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
   1785         }
   1786     }
   1787 
   1788     boolean resumeFocusedStackTopActivityLocked() {
   1789         return resumeFocusedStackTopActivityLocked(null, null, null);
   1790     }
   1791 
   1792     boolean resumeFocusedStackTopActivityLocked(
   1793             ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {
   1794         if (targetStack != null && isFocusedStack(targetStack)) {
   1795             return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);
   1796         }
   1797         final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
   1798         if (r == null || r.state != RESUMED) {
   1799             mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
   1800         }
   1801         return false;
   1802     }
   1803 
   1804     void updateActivityApplicationInfoLocked(ApplicationInfo aInfo) {
   1805         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   1806             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   1807             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   1808                 stacks.get(stackNdx).updateActivityApplicationInfoLocked(aInfo);
   1809             }
   1810         }
   1811     }
   1812 
   1813     TaskRecord finishTopRunningActivityLocked(ProcessRecord app, String reason) {
   1814         TaskRecord finishedTask = null;
   1815         ActivityStack focusedStack = getFocusedStack();
   1816         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   1817             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   1818             final int numStacks = stacks.size();
   1819             for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
   1820                 final ActivityStack stack = stacks.get(stackNdx);
   1821                 TaskRecord t = stack.finishTopRunningActivityLocked(app, reason);
   1822                 if (stack == focusedStack || finishedTask == null) {
   1823                     finishedTask = t;
   1824                 }
   1825             }
   1826         }
   1827         return finishedTask;
   1828     }
   1829 
   1830     void finishVoiceTask(IVoiceInteractionSession session) {
   1831         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   1832             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   1833             final int numStacks = stacks.size();
   1834             for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
   1835                 final ActivityStack stack = stacks.get(stackNdx);
   1836                 stack.finishVoiceTask(session);
   1837             }
   1838         }
   1839     }
   1840 
   1841     void findTaskToMoveToFrontLocked(TaskRecord task, int flags, ActivityOptions options,
   1842             String reason, boolean forceNonResizeable) {
   1843         if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) {
   1844             mUserLeaving = true;
   1845         }
   1846         if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) {
   1847             // Caller wants the home activity moved with it.  To accomplish this,
   1848             // we'll just indicate that this task returns to the home task.
   1849             task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
   1850         }
   1851         if (task.stack == null) {
   1852             Slog.e(TAG, "findTaskToMoveToFrontLocked: can't move task="
   1853                     + task + " to front. Stack is null");
   1854             return;
   1855         }
   1856 
   1857         if (task.isResizeable() && options != null) {
   1858             int stackId = options.getLaunchStackId();
   1859             if (canUseActivityOptionsLaunchBounds(options, stackId)) {
   1860                 final Rect bounds = TaskRecord.validateBounds(options.getLaunchBounds());
   1861                 task.updateOverrideConfiguration(bounds);
   1862                 if (stackId == INVALID_STACK_ID) {
   1863                     stackId = task.getLaunchStackId();
   1864                 }
   1865                 if (stackId != task.stack.mStackId) {
   1866                     final ActivityStack stack = moveTaskToStackUncheckedLocked(
   1867                             task, stackId, ON_TOP, !FORCE_FOCUS, reason);
   1868                     stackId = stack.mStackId;
   1869                     // moveTaskToStackUncheckedLocked() should already placed the task on top,
   1870                     // still need moveTaskToFrontLocked() below for any transition settings.
   1871                 }
   1872                 if (StackId.resizeStackWithLaunchBounds(stackId)) {
   1873                     resizeStackLocked(stackId, bounds,
   1874                             null /* tempTaskBounds */, null /* tempTaskInsetBounds */,
   1875                             !PRESERVE_WINDOWS, true /* allowResizeInDockedMode */, !DEFER_RESUME);
   1876                 } else {
   1877                     // WM resizeTask must be done after the task is moved to the correct stack,
   1878                     // because Task's setBounds() also updates dim layer's bounds, but that has
   1879                     // dependency on the stack.
   1880                     mWindowManager.resizeTask(task.taskId, task.mBounds, task.mOverrideConfig,
   1881                             false /* relayout */, false /* forced */);
   1882                 }
   1883             }
   1884         }
   1885 
   1886         final ActivityRecord r = task.getTopActivity();
   1887         task.stack.moveTaskToFrontLocked(task, false /* noAnimation */, options,
   1888                 r == null ? null : r.appTimeTracker, reason);
   1889 
   1890         if (DEBUG_STACK) Slog.d(TAG_STACK,
   1891                 "findTaskToMoveToFront: moved to front of stack=" + task.stack);
   1892 
   1893         handleNonResizableTaskIfNeeded(task, INVALID_STACK_ID, task.stack.mStackId,
   1894                 forceNonResizeable);
   1895     }
   1896 
   1897     boolean canUseActivityOptionsLaunchBounds(ActivityOptions options, int launchStackId) {
   1898         // We use the launch bounds in the activity options is the device supports freeform
   1899         // window management or is launching into the pinned stack.
   1900         if (options.getLaunchBounds() == null) {
   1901             return false;
   1902         }
   1903         return (mService.mSupportsPictureInPicture && launchStackId == PINNED_STACK_ID)
   1904                 || mService.mSupportsFreeformWindowManagement;
   1905     }
   1906 
   1907     ActivityStack getStack(int stackId) {
   1908         return getStack(stackId, !CREATE_IF_NEEDED, !ON_TOP);
   1909     }
   1910 
   1911     ActivityStack getStack(int stackId, boolean createStaticStackIfNeeded, boolean createOnTop) {
   1912         ActivityContainer activityContainer = mActivityContainers.get(stackId);
   1913         if (activityContainer != null) {
   1914             return activityContainer.mStack;
   1915         }
   1916         if (!createStaticStackIfNeeded || !StackId.isStaticStack(stackId)) {
   1917             return null;
   1918         }
   1919         return createStackOnDisplay(stackId, Display.DEFAULT_DISPLAY, createOnTop);
   1920     }
   1921 
   1922     ArrayList<ActivityStack> getStacks() {
   1923         ArrayList<ActivityStack> allStacks = new ArrayList<>();
   1924         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   1925             allStacks.addAll(mActivityDisplays.valueAt(displayNdx).mStacks);
   1926         }
   1927         return allStacks;
   1928     }
   1929 
   1930     IBinder getHomeActivityToken() {
   1931         ActivityRecord homeActivity = getHomeActivity();
   1932         if (homeActivity != null) {
   1933             return homeActivity.appToken;
   1934         }
   1935         return null;
   1936     }
   1937 
   1938     ActivityRecord getHomeActivity() {
   1939         return getHomeActivityForUser(mCurrentUser);
   1940     }
   1941 
   1942     ActivityRecord getHomeActivityForUser(int userId) {
   1943         final ArrayList<TaskRecord> tasks = mHomeStack.getAllTasks();
   1944         for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
   1945             final TaskRecord task = tasks.get(taskNdx);
   1946             if (task.isHomeTask()) {
   1947                 final ArrayList<ActivityRecord> activities = task.mActivities;
   1948                 for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
   1949                     final ActivityRecord r = activities.get(activityNdx);
   1950                     if (r.isHomeActivity()
   1951                             && ((userId == UserHandle.USER_ALL) || (r.userId == userId))) {
   1952                         return r;
   1953                     }
   1954                 }
   1955             }
   1956         }
   1957         return null;
   1958     }
   1959 
   1960     /**
   1961      * Returns if a stack should be treated as if it's docked. Returns true if the stack is
   1962      * the docked stack itself, or if it's side-by-side to the docked stack.
   1963      */
   1964     boolean isStackDockedInEffect(int stackId) {
   1965         return stackId == DOCKED_STACK_ID ||
   1966                 (StackId.isResizeableByDockedStack(stackId) && getStack(DOCKED_STACK_ID) != null);
   1967     }
   1968 
   1969     ActivityContainer createVirtualActivityContainer(ActivityRecord parentActivity,
   1970             IActivityContainerCallback callback) {
   1971         ActivityContainer activityContainer =
   1972                 new VirtualActivityContainer(parentActivity, callback);
   1973         mActivityContainers.put(activityContainer.mStackId, activityContainer);
   1974         if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS,
   1975                 "createActivityContainer: " + activityContainer);
   1976         parentActivity.mChildContainers.add(activityContainer);
   1977         return activityContainer;
   1978     }
   1979 
   1980     void removeChildActivityContainers(ActivityRecord parentActivity) {
   1981         final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers;
   1982         for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) {
   1983             ActivityContainer container = childStacks.remove(containerNdx);
   1984             if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, "removeChildActivityContainers: removing "
   1985                     + container);
   1986             container.release();
   1987         }
   1988     }
   1989 
   1990     void deleteActivityContainer(IActivityContainer container) {
   1991         ActivityContainer activityContainer = (ActivityContainer)container;
   1992         if (activityContainer != null) {
   1993             if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS,
   1994                     "deleteActivityContainer: callers=" + Debug.getCallers(4));
   1995             final int stackId = activityContainer.mStackId;
   1996             mActivityContainers.remove(stackId);
   1997             mWindowManager.removeStack(stackId);
   1998         }
   1999     }
   2000 
   2001     void resizeStackLocked(int stackId, Rect bounds, Rect tempTaskBounds, Rect tempTaskInsetBounds,
   2002             boolean preserveWindows, boolean allowResizeInDockedMode, boolean deferResume) {
   2003         if (stackId == DOCKED_STACK_ID) {
   2004             resizeDockedStackLocked(bounds, tempTaskBounds, tempTaskInsetBounds, null, null,
   2005                     preserveWindows);
   2006             return;
   2007         }
   2008         final ActivityStack stack = getStack(stackId);
   2009         if (stack == null) {
   2010             Slog.w(TAG, "resizeStack: stackId " + stackId + " not found.");
   2011             return;
   2012         }
   2013 
   2014         if (!allowResizeInDockedMode && getStack(DOCKED_STACK_ID) != null) {
   2015             // If the docked stack exist we don't allow resizes of stacks not caused by the docked
   2016             // stack size changing so things don't get out of sync.
   2017             return;
   2018         }
   2019 
   2020         Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "am.resizeStack_" + stackId);
   2021         mWindowManager.deferSurfaceLayout();
   2022         try {
   2023             resizeStackUncheckedLocked(stack, bounds, tempTaskBounds, tempTaskInsetBounds);
   2024             if (!deferResume) {
   2025                 stack.ensureVisibleActivitiesConfigurationLocked(
   2026                         stack.topRunningActivityLocked(), preserveWindows);
   2027             }
   2028         } finally {
   2029             mWindowManager.continueSurfaceLayout();
   2030             Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
   2031         }
   2032     }
   2033 
   2034     void deferUpdateBounds(int stackId) {
   2035         final ActivityStack stack = getStack(stackId);
   2036         if (stack != null) {
   2037             stack.deferUpdateBounds();
   2038         }
   2039     }
   2040 
   2041     void continueUpdateBounds(int stackId) {
   2042         final ActivityStack stack = getStack(stackId);
   2043         if (stack != null) {
   2044             stack.continueUpdateBounds();
   2045         }
   2046     }
   2047 
   2048     void notifyAppTransitionDone() {
   2049         continueUpdateBounds(HOME_STACK_ID);
   2050         for (int i = mResizingTasksDuringAnimation.size() - 1; i >= 0; i--) {
   2051             final int taskId = mResizingTasksDuringAnimation.valueAt(i);
   2052             if (anyTaskForIdLocked(taskId, !RESTORE_FROM_RECENTS, INVALID_STACK_ID) != null) {
   2053                 mWindowManager.setTaskDockedResizing(taskId, false);
   2054             }
   2055         }
   2056         mResizingTasksDuringAnimation.clear();
   2057     }
   2058 
   2059     void resizeStackUncheckedLocked(ActivityStack stack, Rect bounds, Rect tempTaskBounds,
   2060             Rect tempTaskInsetBounds) {
   2061         bounds = TaskRecord.validateBounds(bounds);
   2062 
   2063         if (!stack.updateBoundsAllowed(bounds, tempTaskBounds, tempTaskInsetBounds)) {
   2064             return;
   2065         }
   2066 
   2067         mTmpBounds.clear();
   2068         mTmpConfigs.clear();
   2069         mTmpInsetBounds.clear();
   2070         final ArrayList<TaskRecord> tasks = stack.getAllTasks();
   2071         final Rect taskBounds = tempTaskBounds != null ? tempTaskBounds : bounds;
   2072         final Rect insetBounds = tempTaskInsetBounds != null ? tempTaskInsetBounds : taskBounds;
   2073         for (int i = tasks.size() - 1; i >= 0; i--) {
   2074             final TaskRecord task = tasks.get(i);
   2075             if (task.isResizeable()) {
   2076                 if (stack.mStackId == FREEFORM_WORKSPACE_STACK_ID) {
   2077                     // For freeform stack we don't adjust the size of the tasks to match that
   2078                     // of the stack, but we do try to make sure the tasks are still contained
   2079                     // with the bounds of the stack.
   2080                     tempRect2.set(task.mBounds);
   2081                     fitWithinBounds(tempRect2, bounds);
   2082                     task.updateOverrideConfiguration(tempRect2);
   2083                 } else {
   2084                     task.updateOverrideConfiguration(taskBounds, insetBounds);
   2085                 }
   2086             }
   2087 
   2088             mTmpConfigs.put(task.taskId, task.mOverrideConfig);
   2089             mTmpBounds.put(task.taskId, task.mBounds);
   2090             if (tempTaskInsetBounds != null) {
   2091                 mTmpInsetBounds.put(task.taskId, tempTaskInsetBounds);
   2092             }
   2093         }
   2094 
   2095         // We might trigger a configuration change. Save the current task bounds for freezing.
   2096         mWindowManager.prepareFreezingTaskBounds(stack.mStackId);
   2097         stack.mFullscreen = mWindowManager.resizeStack(stack.mStackId, bounds, mTmpConfigs,
   2098                 mTmpBounds, mTmpInsetBounds);
   2099         stack.setBounds(bounds);
   2100     }
   2101 
   2102     void moveTasksToFullscreenStackLocked(int fromStackId, boolean onTop) {
   2103         final ActivityStack stack = getStack(fromStackId);
   2104         if (stack == null) {
   2105             return;
   2106         }
   2107 
   2108         mWindowManager.deferSurfaceLayout();
   2109         try {
   2110             if (fromStackId == DOCKED_STACK_ID) {
   2111 
   2112                 // We are moving all tasks from the docked stack to the fullscreen stack,
   2113                 // which is dismissing the docked stack, so resize all other stacks to
   2114                 // fullscreen here already so we don't end up with resize trashing.
   2115                 for (int i = FIRST_STATIC_STACK_ID; i <= LAST_STATIC_STACK_ID; i++) {
   2116                     if (StackId.isResizeableByDockedStack(i)) {
   2117                         ActivityStack otherStack = getStack(i);
   2118                         if (otherStack != null) {
   2119                             resizeStackLocked(i, null, null, null, PRESERVE_WINDOWS,
   2120                                     true /* allowResizeInDockedMode */, DEFER_RESUME);
   2121                         }
   2122                     }
   2123                 }
   2124 
   2125                 // Also disable docked stack resizing since we have manually adjusted the
   2126                 // size of other stacks above and we don't want to trigger a docked stack
   2127                 // resize when we remove task from it below and it is detached from the
   2128                 // display because it no longer contains any tasks.
   2129                 mAllowDockedStackResize = false;
   2130             }
   2131             final ArrayList<TaskRecord> tasks = stack.getAllTasks();
   2132             final int size = tasks.size();
   2133             if (onTop) {
   2134                 for (int i = 0; i < size; i++) {
   2135                     moveTaskToStackLocked(tasks.get(i).taskId,
   2136                             FULLSCREEN_WORKSPACE_STACK_ID, onTop, onTop /*forceFocus*/,
   2137                             "moveTasksToFullscreenStack", ANIMATE, DEFER_RESUME);
   2138                 }
   2139 
   2140                 ensureActivitiesVisibleLocked(null, 0, PRESERVE_WINDOWS);
   2141                 resumeFocusedStackTopActivityLocked();
   2142             } else {
   2143                 for (int i = size - 1; i >= 0; i--) {
   2144                     positionTaskInStackLocked(tasks.get(i).taskId,
   2145                             FULLSCREEN_WORKSPACE_STACK_ID, 0);
   2146                 }
   2147             }
   2148         } finally {
   2149             mAllowDockedStackResize = true;
   2150             mWindowManager.continueSurfaceLayout();
   2151         }
   2152     }
   2153 
   2154     void resizeDockedStackLocked(Rect dockedBounds, Rect tempDockedTaskBounds,
   2155             Rect tempDockedTaskInsetBounds,
   2156             Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds, boolean preserveWindows) {
   2157 
   2158         if (!mAllowDockedStackResize) {
   2159             // Docked stack resize currently disabled.
   2160             return;
   2161         }
   2162 
   2163         final ActivityStack stack = getStack(DOCKED_STACK_ID);
   2164         if (stack == null) {
   2165             Slog.w(TAG, "resizeDockedStackLocked: docked stack not found");
   2166             return;
   2167         }
   2168 
   2169         Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "am.resizeDockedStack");
   2170         mWindowManager.deferSurfaceLayout();
   2171         try {
   2172             // Don't allow re-entry while resizing. E.g. due to docked stack detaching.
   2173             mAllowDockedStackResize = false;
   2174             ActivityRecord r = stack.topRunningActivityLocked();
   2175             resizeStackUncheckedLocked(stack, dockedBounds, tempDockedTaskBounds,
   2176                     tempDockedTaskInsetBounds);
   2177 
   2178             // TODO: Checking for isAttached might not be needed as if the user passes in null
   2179             // dockedBounds then they want the docked stack to be dismissed.
   2180             if (stack.mFullscreen || (dockedBounds == null && !stack.isAttached())) {
   2181                 // The dock stack either was dismissed or went fullscreen, which is kinda the same.
   2182                 // In this case we make all other static stacks fullscreen and move all
   2183                 // docked stack tasks to the fullscreen stack.
   2184                 moveTasksToFullscreenStackLocked(DOCKED_STACK_ID, ON_TOP);
   2185 
   2186                 // stack shouldn't contain anymore activities, so nothing to resume.
   2187                 r = null;
   2188             } else {
   2189                 // Docked stacks occupy a dedicated region on screen so the size of all other
   2190                 // static stacks need to be adjusted so they don't overlap with the docked stack.
   2191                 // We get the bounds to use from window manager which has been adjusted for any
   2192                 // screen controls and is also the same for all stacks.
   2193                 mWindowManager.getStackDockedModeBounds(
   2194                         HOME_STACK_ID, tempRect, true /* ignoreVisibility */);
   2195                 for (int i = FIRST_STATIC_STACK_ID; i <= LAST_STATIC_STACK_ID; i++) {
   2196                     if (StackId.isResizeableByDockedStack(i) && getStack(i) != null) {
   2197                         resizeStackLocked(i, tempRect, tempOtherTaskBounds,
   2198                                 tempOtherTaskInsetBounds, preserveWindows,
   2199                                 true /* allowResizeInDockedMode */, !DEFER_RESUME);
   2200                     }
   2201                 }
   2202             }
   2203             stack.ensureVisibleActivitiesConfigurationLocked(r, preserveWindows);
   2204         } finally {
   2205             mAllowDockedStackResize = true;
   2206             mWindowManager.continueSurfaceLayout();
   2207             Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
   2208         }
   2209 
   2210         mResizeDockedStackTimeout.notifyResizing(dockedBounds,
   2211                 tempDockedTaskBounds != null
   2212                 || tempDockedTaskInsetBounds != null
   2213                 || tempOtherTaskBounds != null
   2214                 || tempOtherTaskInsetBounds != null);
   2215     }
   2216 
   2217     void resizePinnedStackLocked(Rect pinnedBounds, Rect tempPinnedTaskBounds) {
   2218         final ActivityStack stack = getStack(PINNED_STACK_ID);
   2219         if (stack == null) {
   2220             Slog.w(TAG, "resizePinnedStackLocked: pinned stack not found");
   2221             return;
   2222         }
   2223         Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "am.resizePinnedStack");
   2224         mWindowManager.deferSurfaceLayout();
   2225         try {
   2226             ActivityRecord r = stack.topRunningActivityLocked();
   2227             resizeStackUncheckedLocked(stack, pinnedBounds, tempPinnedTaskBounds,
   2228                     null);
   2229             stack.ensureVisibleActivitiesConfigurationLocked(r, false);
   2230         } finally {
   2231             mWindowManager.continueSurfaceLayout();
   2232             Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
   2233         }
   2234     }
   2235 
   2236     boolean resizeTaskLocked(TaskRecord task, Rect bounds, int resizeMode, boolean preserveWindow,
   2237             boolean deferResume) {
   2238         if (!task.isResizeable()) {
   2239             Slog.w(TAG, "resizeTask: task " + task + " not resizeable.");
   2240             return true;
   2241         }
   2242 
   2243         // If this is a forced resize, let it go through even if the bounds is not changing,
   2244         // as we might need a relayout due to surface size change (to/from fullscreen).
   2245         final boolean forced = (resizeMode & RESIZE_MODE_FORCED) != 0;
   2246         if (Objects.equals(task.mBounds, bounds) && !forced) {
   2247             // Nothing to do here...
   2248             return true;
   2249         }
   2250         bounds = TaskRecord.validateBounds(bounds);
   2251 
   2252         if (!mWindowManager.isValidTaskId(task.taskId)) {
   2253             // Task doesn't exist in window manager yet (e.g. was restored from recents).
   2254             // All we can do for now is update the bounds so it can be used when the task is
   2255             // added to window manager.
   2256             task.updateOverrideConfiguration(bounds);
   2257             if (task.stack != null && task.stack.mStackId != FREEFORM_WORKSPACE_STACK_ID) {
   2258                 // re-restore the task so it can have the proper stack association.
   2259                 restoreRecentTaskLocked(task, FREEFORM_WORKSPACE_STACK_ID);
   2260             }
   2261             return true;
   2262         }
   2263 
   2264         // Do not move the task to another stack here.
   2265         // This method assumes that the task is already placed in the right stack.
   2266         // we do not mess with that decision and we only do the resize!
   2267 
   2268         Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "am.resizeTask_" + task.taskId);
   2269 
   2270         final Configuration overrideConfig =  task.updateOverrideConfiguration(bounds);
   2271         // This variable holds information whether the configuration didn't change in a significant
   2272         // way and the activity was kept the way it was. If it's false, it means the activity had
   2273         // to be relaunched due to configuration change.
   2274         boolean kept = true;
   2275         if (overrideConfig != null) {
   2276             final ActivityRecord r = task.topRunningActivityLocked();
   2277             if (r != null) {
   2278                 final ActivityStack stack = task.stack;
   2279                 kept = stack.ensureActivityConfigurationLocked(r, 0, preserveWindow);
   2280 
   2281                 if (!deferResume) {
   2282 
   2283                     // All other activities must be made visible with their correct configuration.
   2284                     ensureActivitiesVisibleLocked(r, 0, !PRESERVE_WINDOWS);
   2285                     if (!kept) {
   2286                         resumeFocusedStackTopActivityLocked();
   2287                     }
   2288                 }
   2289             }
   2290         }
   2291         mWindowManager.resizeTask(task.taskId, task.mBounds, task.mOverrideConfig, kept, forced);
   2292 
   2293         Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
   2294         return kept;
   2295     }
   2296 
   2297     ActivityStack createStackOnDisplay(int stackId, int displayId, boolean onTop) {
   2298         ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
   2299         if (activityDisplay == null) {
   2300             return null;
   2301         }
   2302 
   2303         ActivityContainer activityContainer = new ActivityContainer(stackId);
   2304         mActivityContainers.put(stackId, activityContainer);
   2305         activityContainer.attachToDisplayLocked(activityDisplay, onTop);
   2306         return activityContainer.mStack;
   2307     }
   2308 
   2309     int getNextStackId() {
   2310         while (true) {
   2311             if (mNextFreeStackId >= FIRST_DYNAMIC_STACK_ID
   2312                     && getStack(mNextFreeStackId) == null) {
   2313                 break;
   2314             }
   2315             mNextFreeStackId++;
   2316         }
   2317         return mNextFreeStackId;
   2318     }
   2319 
   2320     /**
   2321      * Restores a recent task to a stack
   2322      * @param task The recent task to be restored.
   2323      * @param stackId The stack to restore the task to (default launch stack will be used
   2324      *                if stackId is {@link android.app.ActivityManager.StackId#INVALID_STACK_ID}).
   2325      * @return true if the task has been restored successfully.
   2326      */
   2327     private boolean restoreRecentTaskLocked(TaskRecord task, int stackId) {
   2328         if (stackId == INVALID_STACK_ID) {
   2329             stackId = task.getLaunchStackId();
   2330         } else if (stackId == DOCKED_STACK_ID && !task.canGoInDockedStack()) {
   2331             // Preferred stack is the docked stack, but the task can't go in the docked stack.
   2332             // Put it in the fullscreen stack.
   2333             stackId = FULLSCREEN_WORKSPACE_STACK_ID;
   2334         }
   2335 
   2336         if (task.stack != null) {
   2337             // Task has already been restored once. See if we need to do anything more
   2338             if (task.stack.mStackId == stackId) {
   2339                 // Nothing else to do since it is already restored in the right stack.
   2340                 return true;
   2341             }
   2342             // Remove current stack association, so we can re-associate the task with the
   2343             // right stack below.
   2344             task.stack.removeTask(task, "restoreRecentTaskLocked", REMOVE_TASK_MODE_MOVING);
   2345         }
   2346 
   2347         final ActivityStack stack =
   2348                 getStack(stackId, CREATE_IF_NEEDED, !ON_TOP);
   2349 
   2350         if (stack == null) {
   2351             // What does this mean??? Not sure how we would get here...
   2352             if (DEBUG_RECENTS) Slog.v(TAG_RECENTS,
   2353                     "Unable to find/create stack to restore recent task=" + task);
   2354             return false;
   2355         }
   2356 
   2357         stack.addTask(task, false, "restoreRecentTask");
   2358         if (DEBUG_RECENTS) Slog.v(TAG_RECENTS,
   2359                 "Added restored task=" + task + " to stack=" + stack);
   2360         final ArrayList<ActivityRecord> activities = task.mActivities;
   2361         for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
   2362             stack.addConfigOverride(activities.get(activityNdx), task);
   2363         }
   2364         return true;
   2365     }
   2366 
   2367     /**
   2368      * Moves the specified task record to the input stack id.
   2369      * WARNING: This method performs an unchecked/raw move of the task and
   2370      * can leave the system in an unstable state if used incorrectly.
   2371      * Use {@link #moveTaskToStackLocked} to perform safe task movement to a stack.
   2372      * @param task Task to move.
   2373      * @param stackId Id of stack to move task to.
   2374      * @param toTop True if the task should be placed at the top of the stack.
   2375      * @param forceFocus if focus should be moved to the new stack
   2376      * @param reason Reason the task is been moved.
   2377      * @return The stack the task was moved to.
   2378      */
   2379     ActivityStack moveTaskToStackUncheckedLocked(
   2380             TaskRecord task, int stackId, boolean toTop, boolean forceFocus, String reason) {
   2381 
   2382         if (StackId.isMultiWindowStack(stackId) && !mService.mSupportsMultiWindow) {
   2383             throw new IllegalStateException("moveTaskToStackUncheckedLocked: Device doesn't "
   2384                     + "support multi-window task=" + task + " to stackId=" + stackId);
   2385         }
   2386 
   2387         final ActivityRecord r = task.topRunningActivityLocked();
   2388         final ActivityStack prevStack = task.stack;
   2389         final boolean wasFocused = isFocusedStack(prevStack) && (topRunningActivityLocked() == r);
   2390         final boolean wasResumed = prevStack.mResumedActivity == r;
   2391         // In some cases the focused stack isn't the front stack. E.g. pinned stack.
   2392         // Whenever we are moving the top activity from the front stack we want to make sure to move
   2393         // the stack to the front.
   2394         final boolean wasFront = isFrontStack(prevStack)
   2395                 && (prevStack.topRunningActivityLocked() == r);
   2396 
   2397         if (stackId == DOCKED_STACK_ID && !task.isResizeable()) {
   2398             // We don't allow moving a unresizeable task to the docked stack since the docked
   2399             // stack is used for split-screen mode and will cause things like the docked divider to
   2400             // show up. We instead leave the task in its current stack or move it to the fullscreen
   2401             // stack if it isn't currently in a stack.
   2402             stackId = (prevStack != null) ? prevStack.mStackId : FULLSCREEN_WORKSPACE_STACK_ID;
   2403             Slog.w(TAG, "Can not move unresizeable task=" + task
   2404                     + " to docked stack. Moving to stackId=" + stackId + " instead.");
   2405         }
   2406 
   2407         // Temporarily disable resizeablility of task we are moving. We don't want it to be resized
   2408         // if a docked stack is created below which will lead to the stack we are moving from and
   2409         // its resizeable tasks being resized.
   2410         task.mTemporarilyUnresizable = true;
   2411         final ActivityStack stack = getStack(stackId, CREATE_IF_NEEDED, toTop);
   2412         task.mTemporarilyUnresizable = false;
   2413         mWindowManager.moveTaskToStack(task.taskId, stack.mStackId, toTop);
   2414         stack.addTask(task, toTop, reason);
   2415 
   2416         // If the task had focus before (or we're requested to move focus),
   2417         // move focus to the new stack by moving the stack to the front.
   2418         stack.moveToFrontAndResumeStateIfNeeded(
   2419                 r, forceFocus || wasFocused || wasFront, wasResumed, reason);
   2420 
   2421         return stack;
   2422     }
   2423 
   2424     boolean moveTaskToStackLocked(int taskId, int stackId, boolean toTop, boolean forceFocus,
   2425             String reason, boolean animate) {
   2426         return moveTaskToStackLocked(taskId, stackId, toTop, forceFocus, reason, animate,
   2427                 false /* deferResume */);
   2428     }
   2429 
   2430     boolean moveTaskToStackLocked(int taskId, int stackId, boolean toTop, boolean forceFocus,
   2431             String reason, boolean animate, boolean deferResume) {
   2432         final TaskRecord task = anyTaskForIdLocked(taskId);
   2433         if (task == null) {
   2434             Slog.w(TAG, "moveTaskToStack: no task for id=" + taskId);
   2435             return false;
   2436         }
   2437 
   2438         if (task.stack != null && task.stack.mStackId == stackId) {
   2439             // You are already in the right stack silly...
   2440             Slog.i(TAG, "moveTaskToStack: taskId=" + taskId + " already in stackId=" + stackId);
   2441             return true;
   2442         }
   2443 
   2444         if (stackId == FREEFORM_WORKSPACE_STACK_ID && !mService.mSupportsFreeformWindowManagement) {
   2445             throw new IllegalArgumentException("moveTaskToStack:"
   2446                     + "Attempt to move task " + taskId + " to unsupported freeform stack");
   2447         }
   2448 
   2449         final ActivityRecord topActivity = task.getTopActivity();
   2450         final int sourceStackId = task.stack != null ? task.stack.mStackId : INVALID_STACK_ID;
   2451         final boolean mightReplaceWindow =
   2452                 StackId.replaceWindowsOnTaskMove(sourceStackId, stackId) && topActivity != null;
   2453         if (mightReplaceWindow) {
   2454             // We are about to relaunch the activity because its configuration changed due to
   2455             // being maximized, i.e. size change. The activity will first remove the old window
   2456             // and then add a new one. This call will tell window manager about this, so it can
   2457             // preserve the old window until the new one is drawn. This prevents having a gap
   2458             // between the removal and addition, in which no window is visible. We also want the
   2459             // entrance of the new window to be properly animated.
   2460             // Note here we always set the replacing window first, as the flags might be needed
   2461             // during the relaunch. If we end up not doing any relaunch, we clear the flags later.
   2462             mWindowManager.setReplacingWindow(topActivity.appToken, animate);
   2463         }
   2464 
   2465         mWindowManager.deferSurfaceLayout();
   2466         final int preferredLaunchStackId = stackId;
   2467         boolean kept = true;
   2468         try {
   2469             final ActivityStack stack = moveTaskToStackUncheckedLocked(
   2470                     task, stackId, toTop, forceFocus, reason + " moveTaskToStack");
   2471             stackId = stack.mStackId;
   2472 
   2473             if (!animate) {
   2474                 stack.mNoAnimActivities.add(topActivity);
   2475             }
   2476 
   2477             // We might trigger a configuration change. Save the current task bounds for freezing.
   2478             mWindowManager.prepareFreezingTaskBounds(stack.mStackId);
   2479 
   2480             // Make sure the task has the appropriate bounds/size for the stack it is in.
   2481             if (stackId == FULLSCREEN_WORKSPACE_STACK_ID && task.mBounds != null) {
   2482                 kept = resizeTaskLocked(task, stack.mBounds, RESIZE_MODE_SYSTEM,
   2483                         !mightReplaceWindow, deferResume);
   2484             } else if (stackId == FREEFORM_WORKSPACE_STACK_ID) {
   2485                 Rect bounds = task.getLaunchBounds();
   2486                 if (bounds == null) {
   2487                     stack.layoutTaskInStack(task, null);
   2488                     bounds = task.mBounds;
   2489                 }
   2490                 kept = resizeTaskLocked(task, bounds, RESIZE_MODE_FORCED, !mightReplaceWindow,
   2491                         deferResume);
   2492             } else if (stackId == DOCKED_STACK_ID || stackId == PINNED_STACK_ID) {
   2493                 kept = resizeTaskLocked(task, stack.mBounds, RESIZE_MODE_SYSTEM,
   2494                         !mightReplaceWindow, deferResume);
   2495             }
   2496         } finally {
   2497             mWindowManager.continueSurfaceLayout();
   2498         }
   2499 
   2500         if (mightReplaceWindow) {
   2501             // If we didn't actual do a relaunch (indicated by kept==true meaning we kept the old
   2502             // window), we need to clear the replace window settings. Otherwise, we schedule a
   2503             // timeout to remove the old window if the replacing window is not coming in time.
   2504             mWindowManager.scheduleClearReplacingWindowIfNeeded(topActivity.appToken, !kept);
   2505         }
   2506 
   2507         if (!deferResume) {
   2508 
   2509             // The task might have already been running and its visibility needs to be synchronized with
   2510             // the visibility of the stack / windows.
   2511             ensureActivitiesVisibleLocked(null, 0, !mightReplaceWindow);
   2512             resumeFocusedStackTopActivityLocked();
   2513         }
   2514 
   2515         handleNonResizableTaskIfNeeded(task, preferredLaunchStackId, stackId);
   2516 
   2517         return (preferredLaunchStackId == stackId);
   2518     }
   2519 
   2520     boolean moveTopStackActivityToPinnedStackLocked(int stackId, Rect bounds) {
   2521         final ActivityStack stack = getStack(stackId, !CREATE_IF_NEEDED, !ON_TOP);
   2522         if (stack == null) {
   2523             throw new IllegalArgumentException(
   2524                     "moveTopStackActivityToPinnedStackLocked: Unknown stackId=" + stackId);
   2525         }
   2526 
   2527         final ActivityRecord r = stack.topRunningActivityLocked();
   2528         if (r == null) {
   2529             Slog.w(TAG, "moveTopStackActivityToPinnedStackLocked: No top running activity"
   2530                     + " in stack=" + stack);
   2531             return false;
   2532         }
   2533 
   2534         if (!mService.mForceResizableActivities && !r.supportsPictureInPicture()) {
   2535             Slog.w(TAG,
   2536                     "moveTopStackActivityToPinnedStackLocked: Picture-In-Picture not supported for "
   2537                             + " r=" + r);
   2538             return false;
   2539         }
   2540 
   2541         moveActivityToPinnedStackLocked(r, "moveTopActivityToPinnedStack", bounds);
   2542         return true;
   2543     }
   2544 
   2545     void moveActivityToPinnedStackLocked(ActivityRecord r, String reason, Rect bounds) {
   2546         mWindowManager.deferSurfaceLayout();
   2547         try {
   2548             final TaskRecord task = r.task;
   2549 
   2550             if (r == task.stack.getVisibleBehindActivity()) {
   2551                 // An activity can't be pinned and visible behind at the same time. Go ahead and
   2552                 // release it from been visible behind before pinning.
   2553                 requestVisibleBehindLocked(r, false);
   2554             }
   2555 
   2556             // Need to make sure the pinned stack exist so we can resize it below...
   2557             final ActivityStack stack = getStack(PINNED_STACK_ID, CREATE_IF_NEEDED, ON_TOP);
   2558 
   2559             // Resize the pinned stack to match the current size of the task the activity we are
   2560             // going to be moving is currently contained in. We do this to have the right starting
   2561             // animation bounds for the pinned stack to the desired bounds the caller wants.
   2562             resizeStackLocked(PINNED_STACK_ID, task.mBounds, null /* tempTaskBounds */,
   2563                     null /* tempTaskInsetBounds */, !PRESERVE_WINDOWS,
   2564                     true /* allowResizeInDockedMode */, !DEFER_RESUME);
   2565 
   2566             if (task.mActivities.size() == 1) {
   2567                 // There is only one activity in the task. So, we can just move the task over to
   2568                 // the stack without re-parenting the activity in a different task.
   2569                 if (task.getTaskToReturnTo() == HOME_ACTIVITY_TYPE) {
   2570                     // Move the home stack forward if the task we just moved to the pinned stack
   2571                     // was launched from home so home should be visible behind it.
   2572                     moveHomeStackToFront(reason);
   2573                 }
   2574                 moveTaskToStackLocked(
   2575                         task.taskId, PINNED_STACK_ID, ON_TOP, FORCE_FOCUS, reason, !ANIMATE);
   2576             } else {
   2577                 stack.moveActivityToStack(r);
   2578             }
   2579         } finally {
   2580             mWindowManager.continueSurfaceLayout();
   2581         }
   2582 
   2583         // The task might have already been running and its visibility needs to be synchronized
   2584         // with the visibility of the stack / windows.
   2585         ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
   2586         resumeFocusedStackTopActivityLocked();
   2587 
   2588         mWindowManager.animateResizePinnedStack(bounds, -1);
   2589         mService.notifyActivityPinnedLocked();
   2590     }
   2591 
   2592     void positionTaskInStackLocked(int taskId, int stackId, int position) {
   2593         final TaskRecord task = anyTaskForIdLocked(taskId);
   2594         if (task == null) {
   2595             Slog.w(TAG, "positionTaskInStackLocked: no task for id=" + taskId);
   2596             return;
   2597         }
   2598         final ActivityStack stack = getStack(stackId, CREATE_IF_NEEDED, !ON_TOP);
   2599 
   2600         task.updateOverrideConfigurationForStack(stack);
   2601 
   2602         mWindowManager.positionTaskInStack(
   2603                 taskId, stackId, position, task.mBounds, task.mOverrideConfig);
   2604         stack.positionTask(task, position);
   2605         // The task might have already been running and its visibility needs to be synchronized with
   2606         // the visibility of the stack / windows.
   2607         stack.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
   2608         resumeFocusedStackTopActivityLocked();
   2609     }
   2610 
   2611     ActivityRecord findTaskLocked(ActivityRecord r) {
   2612         mTmpFindTaskResult.r = null;
   2613         mTmpFindTaskResult.matchedByRootAffinity = false;
   2614         if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + r);
   2615         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2616             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2617             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   2618                 final ActivityStack stack = stacks.get(stackNdx);
   2619                 if (!r.isApplicationActivity() && !stack.isHomeStack()) {
   2620                     if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping stack: (home activity) " + stack);
   2621                     continue;
   2622                 }
   2623                 if (!stack.mActivityContainer.isEligibleForNewTasks()) {
   2624                     if (DEBUG_TASKS) Slog.d(TAG_TASKS,
   2625                             "Skipping stack: (new task not allowed) " + stack);
   2626                     continue;
   2627                 }
   2628                 stack.findTaskLocked(r, mTmpFindTaskResult);
   2629                 // It is possible to have task in multiple stacks with the same root affinity.
   2630                 // If the match we found was based on root affinity we keep on looking to see if
   2631                 // there is a better match in another stack. We eventually return the match based
   2632                 // on root affinity if we don't find a better match.
   2633                 if (mTmpFindTaskResult.r != null && !mTmpFindTaskResult.matchedByRootAffinity) {
   2634                     return mTmpFindTaskResult.r;
   2635                 }
   2636             }
   2637         }
   2638         if (DEBUG_TASKS && mTmpFindTaskResult.r == null) Slog.d(TAG_TASKS, "No task found");
   2639         return mTmpFindTaskResult.r;
   2640     }
   2641 
   2642     ActivityRecord findActivityLocked(Intent intent, ActivityInfo info,
   2643                                       boolean compareIntentFilters) {
   2644         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2645             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2646             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   2647                 final ActivityRecord ar = stacks.get(stackNdx)
   2648                         .findActivityLocked(intent, info, compareIntentFilters);
   2649                 if (ar != null) {
   2650                     return ar;
   2651                 }
   2652             }
   2653         }
   2654         return null;
   2655     }
   2656 
   2657     void goingToSleepLocked() {
   2658         scheduleSleepTimeout();
   2659         if (!mGoingToSleep.isHeld()) {
   2660             mGoingToSleep.acquire();
   2661             if (mLaunchingActivity.isHeld()) {
   2662                 if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
   2663                     throw new IllegalStateException("Calling must be system uid");
   2664                 }
   2665                 mLaunchingActivity.release();
   2666                 mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
   2667             }
   2668         }
   2669         checkReadyForSleepLocked();
   2670     }
   2671 
   2672     boolean shutdownLocked(int timeout) {
   2673         goingToSleepLocked();
   2674 
   2675         boolean timedout = false;
   2676         final long endTime = System.currentTimeMillis() + timeout;
   2677         while (true) {
   2678             boolean cantShutdown = false;
   2679             for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2680                 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2681                 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   2682                     cantShutdown |= stacks.get(stackNdx).checkReadyForSleepLocked();
   2683                 }
   2684             }
   2685             if (cantShutdown) {
   2686                 long timeRemaining = endTime - System.currentTimeMillis();
   2687                 if (timeRemaining > 0) {
   2688                     try {
   2689                         mService.wait(timeRemaining);
   2690                     } catch (InterruptedException e) {
   2691                     }
   2692                 } else {
   2693                     Slog.w(TAG, "Activity manager shutdown timed out");
   2694                     timedout = true;
   2695                     break;
   2696                 }
   2697             } else {
   2698                 break;
   2699             }
   2700         }
   2701 
   2702         // Force checkReadyForSleep to complete.
   2703         mSleepTimeout = true;
   2704         checkReadyForSleepLocked();
   2705 
   2706         return timedout;
   2707     }
   2708 
   2709     void comeOutOfSleepIfNeededLocked() {
   2710         removeSleepTimeouts();
   2711         if (mGoingToSleep.isHeld()) {
   2712             mGoingToSleep.release();
   2713         }
   2714         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2715             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2716             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   2717                 final ActivityStack stack = stacks.get(stackNdx);
   2718                 stack.awakeFromSleepingLocked();
   2719                 if (isFocusedStack(stack)) {
   2720                     resumeFocusedStackTopActivityLocked();
   2721                 }
   2722             }
   2723         }
   2724         mGoingToSleepActivities.clear();
   2725     }
   2726 
   2727     void activitySleptLocked(ActivityRecord r) {
   2728         mGoingToSleepActivities.remove(r);
   2729         checkReadyForSleepLocked();
   2730     }
   2731 
   2732     void checkReadyForSleepLocked() {
   2733         if (!mService.isSleepingOrShuttingDownLocked()) {
   2734             // Do not care.
   2735             return;
   2736         }
   2737 
   2738         if (!mSleepTimeout) {
   2739             boolean dontSleep = false;
   2740             for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2741                 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2742                 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   2743                     dontSleep |= stacks.get(stackNdx).checkReadyForSleepLocked();
   2744                 }
   2745             }
   2746 
   2747             if (mStoppingActivities.size() > 0) {
   2748                 // Still need to tell some activities to stop; can't sleep yet.
   2749                 if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still need to stop "
   2750                         + mStoppingActivities.size() + " activities");
   2751                 scheduleIdleLocked();
   2752                 dontSleep = true;
   2753             }
   2754 
   2755             if (mGoingToSleepActivities.size() > 0) {
   2756                 // Still need to tell some activities to sleep; can't sleep yet.
   2757                 if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still need to sleep "
   2758                         + mGoingToSleepActivities.size() + " activities");
   2759                 dontSleep = true;
   2760             }
   2761 
   2762             if (dontSleep) {
   2763                 return;
   2764             }
   2765         }
   2766 
   2767         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2768             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2769             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   2770                 stacks.get(stackNdx).goToSleep();
   2771             }
   2772         }
   2773 
   2774         removeSleepTimeouts();
   2775 
   2776         if (mGoingToSleep.isHeld()) {
   2777             mGoingToSleep.release();
   2778         }
   2779         if (mService.mShuttingDown) {
   2780             mService.notifyAll();
   2781         }
   2782     }
   2783 
   2784     boolean reportResumedActivityLocked(ActivityRecord r) {
   2785         final ActivityStack stack = r.task.stack;
   2786         if (isFocusedStack(stack)) {
   2787             mService.updateUsageStats(r, true);
   2788         }
   2789         if (allResumedActivitiesComplete()) {
   2790             ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
   2791             mWindowManager.executeAppTransition();
   2792             return true;
   2793         }
   2794         return false;
   2795     }
   2796 
   2797     void handleAppCrashLocked(ProcessRecord app) {
   2798         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2799             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2800             int stackNdx = stacks.size() - 1;
   2801             while (stackNdx >= 0) {
   2802                 stacks.get(stackNdx).handleAppCrashLocked(app);
   2803                 stackNdx--;
   2804             }
   2805         }
   2806     }
   2807 
   2808     boolean requestVisibleBehindLocked(ActivityRecord r, boolean visible) {
   2809         final ActivityStack stack = r.task.stack;
   2810         if (stack == null) {
   2811             if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
   2812                     "requestVisibleBehind: r=" + r + " visible=" + visible + " stack is null");
   2813             return false;
   2814         }
   2815 
   2816         if (visible && !StackId.activitiesCanRequestVisibleBehind(stack.mStackId)) {
   2817             if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, "requestVisibleBehind: r=" + r
   2818                     + " visible=" + visible + " stackId=" + stack.mStackId
   2819                     + " can't contain visible behind activities");
   2820             return false;
   2821         }
   2822 
   2823         final boolean isVisible = stack.hasVisibleBehindActivity();
   2824         if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
   2825                 "requestVisibleBehind r=" + r + " visible=" + visible + " isVisible=" + isVisible);
   2826 
   2827         final ActivityRecord top = topRunningActivityLocked();
   2828         if (top == null || top == r || (visible == isVisible)) {
   2829             if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, "requestVisibleBehind: quick return");
   2830             stack.setVisibleBehindActivity(visible ? r : null);
   2831             return true;
   2832         }
   2833 
   2834         // A non-top activity is reporting a visibility change.
   2835         if (visible && top.fullscreen) {
   2836             // Let the caller know that it can't be seen.
   2837             if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
   2838                     "requestVisibleBehind: returning top.fullscreen=" + top.fullscreen
   2839                     + " top.state=" + top.state + " top.app=" + top.app + " top.app.thread="
   2840                     + top.app.thread);
   2841             return false;
   2842         } else if (!visible && stack.getVisibleBehindActivity() != r) {
   2843             // Only the activity set as currently visible behind should actively reset its
   2844             // visible behind state.
   2845             if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND,
   2846                     "requestVisibleBehind: returning visible=" + visible
   2847                     + " stack.getVisibleBehindActivity()=" + stack.getVisibleBehindActivity()
   2848                     + " r=" + r);
   2849             return false;
   2850         }
   2851 
   2852         stack.setVisibleBehindActivity(visible ? r : null);
   2853         if (!visible) {
   2854             // If there is a translucent home activity, we need to force it stop being translucent,
   2855             // because we can't depend on the application to necessarily perform that operation.
   2856             // Check out b/14469711 for details.
   2857             final ActivityRecord next = stack.findNextTranslucentActivity(r);
   2858             if (next != null && next.isHomeActivity()) {
   2859                 mService.convertFromTranslucent(next.appToken);
   2860             }
   2861         }
   2862         if (top.app != null && top.app.thread != null) {
   2863             // Notify the top app of the change.
   2864             try {
   2865                 top.app.thread.scheduleBackgroundVisibleBehindChanged(top.appToken, visible);
   2866             } catch (RemoteException e) {
   2867             }
   2868         }
   2869         return true;
   2870     }
   2871 
   2872     // Called when WindowManager has finished animating the launchingBehind activity to the back.
   2873     void handleLaunchTaskBehindCompleteLocked(ActivityRecord r) {
   2874         final TaskRecord task = r.task;
   2875         final ActivityStack stack = task.stack;
   2876 
   2877         r.mLaunchTaskBehind = false;
   2878         task.setLastThumbnailLocked(stack.screenshotActivitiesLocked(r));
   2879         mRecentTasks.addLocked(task);
   2880         mService.notifyTaskStackChangedLocked();
   2881         mWindowManager.setAppVisibility(r.appToken, false);
   2882 
   2883         // When launching tasks behind, update the last active time of the top task after the new
   2884         // task has been shown briefly
   2885         final ActivityRecord top = stack.topActivity();
   2886         if (top != null) {
   2887             top.task.touchActiveTime();
   2888         }
   2889     }
   2890 
   2891     void scheduleLaunchTaskBehindComplete(IBinder token) {
   2892         mHandler.obtainMessage(LAUNCH_TASK_BEHIND_COMPLETE, token).sendToTarget();
   2893     }
   2894 
   2895     void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges,
   2896             boolean preserveWindows) {
   2897         // First the front stacks. In case any are not fullscreen and are in front of home.
   2898         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2899             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2900             final int topStackNdx = stacks.size() - 1;
   2901             for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) {
   2902                 final ActivityStack stack = stacks.get(stackNdx);
   2903                 stack.ensureActivitiesVisibleLocked(starting, configChanges, preserveWindows);
   2904             }
   2905         }
   2906     }
   2907 
   2908     void invalidateTaskLayers() {
   2909         mTaskLayersChanged = true;
   2910     }
   2911 
   2912     void rankTaskLayersIfNeeded() {
   2913         if (!mTaskLayersChanged) {
   2914             return;
   2915         }
   2916         mTaskLayersChanged = false;
   2917         for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); displayNdx++) {
   2918             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2919             int baseLayer = 0;
   2920             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   2921                 baseLayer += stacks.get(stackNdx).rankTaskLayers(baseLayer);
   2922             }
   2923         }
   2924     }
   2925 
   2926     void clearOtherAppTimeTrackers(AppTimeTracker except) {
   2927         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2928             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2929             final int topStackNdx = stacks.size() - 1;
   2930             for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) {
   2931                 final ActivityStack stack = stacks.get(stackNdx);
   2932                 stack.clearOtherAppTimeTrackers(except);
   2933             }
   2934         }
   2935     }
   2936 
   2937     void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
   2938         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   2939             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2940             final int numStacks = stacks.size();
   2941             for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
   2942                 final ActivityStack stack = stacks.get(stackNdx);
   2943                 stack.scheduleDestroyActivities(app, reason);
   2944             }
   2945         }
   2946     }
   2947 
   2948     void releaseSomeActivitiesLocked(ProcessRecord app, String reason) {
   2949         // Examine all activities currently running in the process.
   2950         TaskRecord firstTask = null;
   2951         // Tasks is non-null only if two or more tasks are found.
   2952         ArraySet<TaskRecord> tasks = null;
   2953         if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Trying to release some activities in " + app);
   2954         for (int i = 0; i < app.activities.size(); i++) {
   2955             ActivityRecord r = app.activities.get(i);
   2956             // First, if we find an activity that is in the process of being destroyed,
   2957             // then we just aren't going to do anything for now; we want things to settle
   2958             // down before we try to prune more activities.
   2959             if (r.finishing || r.state == DESTROYING || r.state == DESTROYED) {
   2960                 if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Abort release; already destroying: " + r);
   2961                 return;
   2962             }
   2963             // Don't consider any activies that are currently not in a state where they
   2964             // can be destroyed.
   2965             if (r.visible || !r.stopped || !r.haveState || r.state == RESUMED || r.state == PAUSING
   2966                     || r.state == PAUSED || r.state == STOPPING) {
   2967                 if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r);
   2968                 continue;
   2969             }
   2970             if (r.task != null) {
   2971                 if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Collecting release task " + r.task
   2972                         + " from " + r);
   2973                 if (firstTask == null) {
   2974                     firstTask = r.task;
   2975                 } else if (firstTask != r.task) {
   2976                     if (tasks == null) {
   2977                         tasks = new ArraySet<>();
   2978                         tasks.add(firstTask);
   2979                     }
   2980                     tasks.add(r.task);
   2981                 }
   2982             }
   2983         }
   2984         if (tasks == null) {
   2985             if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Didn't find two or more tasks to release");
   2986             return;
   2987         }
   2988         // If we have activities in multiple tasks that are in a position to be destroyed,
   2989         // let's iterate through the tasks and release the oldest one.
   2990         final int numDisplays = mActivityDisplays.size();
   2991         for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
   2992             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   2993             // Step through all stacks starting from behind, to hit the oldest things first.
   2994             for (int stackNdx = 0; stackNdx < stacks.size(); stackNdx++) {
   2995                 final ActivityStack stack = stacks.get(stackNdx);
   2996                 // Try to release activities in this stack; if we manage to, we are done.
   2997                 if (stack.releaseSomeActivitiesLocked(app, tasks, reason) > 0) {
   2998                     return;
   2999                 }
   3000             }
   3001         }
   3002     }
   3003 
   3004     boolean switchUserLocked(int userId, UserState uss) {
   3005         final int focusStackId = mFocusedStack.getStackId();
   3006         // We dismiss the docked stack whenever we switch users.
   3007         moveTasksToFullscreenStackLocked(DOCKED_STACK_ID, focusStackId == DOCKED_STACK_ID);
   3008 
   3009         mUserStackInFront.put(mCurrentUser, focusStackId);
   3010         final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID);
   3011         mCurrentUser = userId;
   3012 
   3013         mStartingUsers.add(uss);
   3014         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   3015             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   3016             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   3017                 final ActivityStack stack = stacks.get(stackNdx);
   3018                 stack.switchUserLocked(userId);
   3019                 TaskRecord task = stack.topTask();
   3020                 if (task != null) {
   3021                     mWindowManager.moveTaskToTop(task.taskId);
   3022                 }
   3023             }
   3024         }
   3025 
   3026         ActivityStack stack = getStack(restoreStackId);
   3027         if (stack == null) {
   3028             stack = mHomeStack;
   3029         }
   3030         final boolean homeInFront = stack.isHomeStack();
   3031         if (stack.isOnHomeDisplay()) {
   3032             stack.moveToFront("switchUserOnHomeDisplay");
   3033         } else {
   3034             // Stack was moved to another display while user was swapped out.
   3035             resumeHomeStackTask(HOME_ACTIVITY_TYPE, null, "switchUserOnOtherDisplay");
   3036         }
   3037         return homeInFront;
   3038     }
   3039 
   3040     /** Checks whether the userid is a profile of the current user. */
   3041     boolean isCurrentProfileLocked(int userId) {
   3042         if (userId == mCurrentUser) return true;
   3043         return mService.mUserController.isCurrentProfileLocked(userId);
   3044     }
   3045 
   3046     /** Checks whether the activity should be shown for current user. */
   3047     boolean okToShowLocked(ActivityRecord r) {
   3048         return r != null && ((r.info.flags & FLAG_SHOW_FOR_ALL_USERS) != 0
   3049                 || (isCurrentProfileLocked(r.userId)
   3050                 && !mService.mUserController.isUserStoppingOrShuttingDownLocked(r.userId)));
   3051     }
   3052 
   3053     final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
   3054         ArrayList<ActivityRecord> stops = null;
   3055 
   3056         final boolean nowVisible = allResumedActivitiesVisible();
   3057         for (int activityNdx = mStoppingActivities.size() - 1; activityNdx >= 0; --activityNdx) {
   3058             ActivityRecord s = mStoppingActivities.get(activityNdx);
   3059             final boolean waitingVisible = mWaitingVisibleActivities.contains(s);
   3060             if (DEBUG_STATES) Slog.v(TAG, "Stopping " + s + ": nowVisible=" + nowVisible
   3061                     + " waitingVisible=" + waitingVisible + " finishing=" + s.finishing);
   3062             if (waitingVisible && nowVisible) {
   3063                 mWaitingVisibleActivities.remove(s);
   3064                 if (s.finishing) {
   3065                     // If this activity is finishing, it is sitting on top of
   3066                     // everyone else but we now know it is no longer needed...
   3067                     // so get rid of it.  Otherwise, we need to go through the
   3068                     // normal flow and hide it once we determine that it is
   3069                     // hidden by the activities in front of it.
   3070                     if (DEBUG_STATES) Slog.v(TAG, "Before stopping, can hide: " + s);
   3071                     mWindowManager.setAppVisibility(s.appToken, false);
   3072                 }
   3073             }
   3074             if ((!waitingVisible || mService.isSleepingOrShuttingDownLocked()) && remove) {
   3075                 if (DEBUG_STATES) Slog.v(TAG, "Ready to stop: " + s);
   3076                 if (stops == null) {
   3077                     stops = new ArrayList<>();
   3078                 }
   3079                 stops.add(s);
   3080                 mStoppingActivities.remove(activityNdx);
   3081             }
   3082         }
   3083 
   3084         return stops;
   3085     }
   3086 
   3087     void validateTopActivitiesLocked() {
   3088         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   3089             final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   3090             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   3091                 final ActivityStack stack = stacks.get(stackNdx);
   3092                 final ActivityRecord r = stack.topRunningActivityLocked();
   3093                 final ActivityState state = r == null ? DESTROYED : r.state;
   3094                 if (isFocusedStack(stack)) {
   3095                     if (r == null) Slog.e(TAG,
   3096                             "validateTop...: null top activity, stack=" + stack);
   3097                     else {
   3098                         final ActivityRecord pausing = stack.mPausingActivity;
   3099                         if (pausing != null && pausing == r) Slog.e(TAG,
   3100                                 "validateTop...: top stack has pausing activity r=" + r
   3101                                 + " state=" + state);
   3102                         if (state != INITIALIZING && state != RESUMED) Slog.e(TAG,
   3103                                 "validateTop...: activity in front not resumed r=" + r
   3104                                 + " state=" + state);
   3105                     }
   3106                 } else {
   3107                     final ActivityRecord resumed = stack.mResumedActivity;
   3108                     if (resumed != null && resumed == r) Slog.e(TAG,
   3109                             "validateTop...: back stack has resumed activity r=" + r
   3110                             + " state=" + state);
   3111                     if (r != null && (state == INITIALIZING || state == RESUMED)) Slog.e(TAG,
   3112                             "validateTop...: activity in back resumed r=" + r + " state=" + state);
   3113                 }
   3114             }
   3115         }
   3116     }
   3117 
   3118     private String lockTaskModeToString() {
   3119         switch (mLockTaskModeState) {
   3120             case LOCK_TASK_MODE_LOCKED:
   3121                 return "LOCKED";
   3122             case LOCK_TASK_MODE_PINNED:
   3123                 return "PINNED";
   3124             case LOCK_TASK_MODE_NONE:
   3125                 return "NONE";
   3126             default: return "unknown=" + mLockTaskModeState;
   3127         }
   3128     }
   3129 
   3130     public void dump(PrintWriter pw, String prefix) {
   3131         pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack);
   3132                 pw.print(" mLastFocusedStack="); pw.println(mLastFocusedStack);
   3133         pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout);
   3134         pw.print(prefix);
   3135         pw.println("mCurTaskIdForUser=" + mCurTaskIdForUser);
   3136         pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
   3137         pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers);
   3138         pw.print(prefix); pw.print("mLockTaskModeState=" + lockTaskModeToString());
   3139                 final SparseArray<String[]> packages = mService.mLockTaskPackages;
   3140                 if (packages.size() > 0) {
   3141                     pw.println(" mLockTaskPackages (userId:packages)=");
   3142                     for (int i = 0; i < packages.size(); ++i) {
   3143                         pw.print(prefix); pw.print(prefix); pw.print(packages.keyAt(i));
   3144                         pw.print(":"); pw.println(Arrays.toString(packages.valueAt(i)));
   3145                     }
   3146                 }
   3147                 pw.println(" mLockTaskModeTasks" + mLockTaskModeTasks);
   3148     }
   3149 
   3150     ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
   3151         return mFocusedStack.getDumpActivitiesLocked(name);
   3152     }
   3153 
   3154     static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage,
   3155             boolean needSep, String prefix) {
   3156         if (activity != null) {
   3157             if (dumpPackage == null || dumpPackage.equals(activity.packageName)) {
   3158                 if (needSep) {
   3159                     pw.println();
   3160                 }
   3161                 pw.print(prefix);
   3162                 pw.println(activity);
   3163                 return true;
   3164             }
   3165         }
   3166         return false;
   3167     }
   3168 
   3169     boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
   3170             boolean dumpClient, String dumpPackage) {
   3171         boolean printed = false;
   3172         boolean needSep = false;
   3173         for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) {
   3174             ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx);
   3175             pw.print("Display #"); pw.print(activityDisplay.mDisplayId);
   3176                     pw.println(" (activities from top to bottom):");
   3177             ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
   3178             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   3179                 final ActivityStack stack = stacks.get(stackNdx);
   3180                 StringBuilder stackHeader = new StringBuilder(128);
   3181                 stackHeader.append("  Stack #");
   3182                 stackHeader.append(stack.mStackId);
   3183                 stackHeader.append(":");
   3184                 stackHeader.append("\n");
   3185                 stackHeader.append("  mFullscreen=" + stack.mFullscreen);
   3186                 stackHeader.append("\n");
   3187                 stackHeader.append("  mBounds=" + stack.mBounds);
   3188                 printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage,
   3189                         needSep, stackHeader.toString());
   3190                 printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, "    ", "Run", false,
   3191                         !dumpAll, false, dumpPackage, true,
   3192                         "    Running activities (most recent first):", null);
   3193 
   3194                 needSep = printed;
   3195                 boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep,
   3196                         "    mPausingActivity: ");
   3197                 if (pr) {
   3198                     printed = true;
   3199                     needSep = false;
   3200                 }
   3201                 pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep,
   3202                         "    mResumedActivity: ");
   3203                 if (pr) {
   3204                     printed = true;
   3205                     needSep = false;
   3206                 }
   3207                 if (dumpAll) {
   3208                     pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep,
   3209                             "    mLastPausedActivity: ");
   3210                     if (pr) {
   3211                         printed = true;
   3212                         needSep = true;
   3213                     }
   3214                     printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage,
   3215                             needSep, "    mLastNoHistoryActivity: ");
   3216                 }
   3217                 needSep = printed;
   3218             }
   3219         }
   3220 
   3221         printed |= dumpHistoryList(fd, pw, mFinishingActivities, "  ", "Fin", false, !dumpAll,
   3222                 false, dumpPackage, true, "  Activities waiting to finish:", null);
   3223         printed |= dumpHistoryList(fd, pw, mStoppingActivities, "  ", "Stop", false, !dumpAll,
   3224                 false, dumpPackage, true, "  Activities waiting to stop:", null);
   3225         printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, "  ", "Wait", false, !dumpAll,
   3226                 false, dumpPackage, true, "  Activities waiting for another to become visible:",
   3227                 null);
   3228         printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
   3229                 false, dumpPackage, true, "  Activities waiting to sleep:", null);
   3230         printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
   3231                 false, dumpPackage, true, "  Activities waiting to sleep:", null);
   3232 
   3233         return printed;
   3234     }
   3235 
   3236     static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
   3237             String prefix, String label, boolean complete, boolean brief, boolean client,
   3238             String dumpPackage, boolean needNL, String header1, String header2) {
   3239         TaskRecord lastTask = null;
   3240         String innerPrefix = null;
   3241         String[] args = null;
   3242         boolean printed = false;
   3243         for (int i=list.size()-1; i>=0; i--) {
   3244             final ActivityRecord r = list.get(i);
   3245             if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
   3246                 continue;
   3247             }
   3248             if (innerPrefix == null) {
   3249                 innerPrefix = prefix + "      ";
   3250                 args = new String[0];
   3251             }
   3252             printed = true;
   3253             final boolean full = !brief && (complete || !r.isInHistory());
   3254             if (needNL) {
   3255                 pw.println("");
   3256                 needNL = false;
   3257             }
   3258             if (header1 != null) {
   3259                 pw.println(header1);
   3260                 header1 = null;
   3261             }
   3262             if (header2 != null) {
   3263                 pw.println(header2);
   3264                 header2 = null;
   3265             }
   3266             if (lastTask != r.task) {
   3267                 lastTask = r.task;
   3268                 pw.print(prefix);
   3269                 pw.print(full ? "* " : "  ");
   3270                 pw.println(lastTask);
   3271                 if (full) {
   3272                     lastTask.dump(pw, prefix + "  ");
   3273                 } else if (complete) {
   3274                     // Complete + brief == give a summary.  Isn't that obvious?!?
   3275                     if (lastTask.intent != null) {
   3276                         pw.print(prefix); pw.print("  ");
   3277                                 pw.println(lastTask.intent.toInsecureStringWithClip());
   3278                     }
   3279                 }
   3280             }
   3281             pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
   3282             pw.print(" #"); pw.print(i); pw.print(": ");
   3283             pw.println(r);
   3284             if (full) {
   3285                 r.dump(pw, innerPrefix);
   3286             } else if (complete) {
   3287                 // Complete + brief == give a summary.  Isn't that obvious?!?
   3288                 pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
   3289                 if (r.app != null) {
   3290                     pw.print(innerPrefix); pw.println(r.app);
   3291                 }
   3292             }
   3293             if (client && r.app != null && r.app.thread != null) {
   3294                 // flush anything that is already in the PrintWriter since the thread is going
   3295                 // to write to the file descriptor directly
   3296                 pw.flush();
   3297                 try {
   3298                     TransferPipe tp = new TransferPipe();
   3299                     try {
   3300                         r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
   3301                                 r.appToken, innerPrefix, args);
   3302                         // Short timeout, since blocking here can
   3303                         // deadlock with the application.
   3304                         tp.go(fd, 2000);
   3305                     } finally {
   3306                         tp.kill();
   3307                     }
   3308                 } catch (IOException e) {
   3309                     pw.println(innerPrefix + "Failure while dumping the activity: " + e);
   3310                 } catch (RemoteException e) {
   3311                     pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
   3312                 }
   3313                 needNL = true;
   3314             }
   3315         }
   3316         return printed;
   3317     }
   3318 
   3319     void scheduleIdleTimeoutLocked(ActivityRecord next) {
   3320         if (DEBUG_IDLE) Slog.d(TAG_IDLE,
   3321                 "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4));
   3322         Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
   3323         mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
   3324     }
   3325 
   3326     final void scheduleIdleLocked() {
   3327         mHandler.sendEmptyMessage(IDLE_NOW_MSG);
   3328     }
   3329 
   3330     void removeTimeoutsForActivityLocked(ActivityRecord r) {
   3331         if (DEBUG_IDLE) Slog.d(TAG_IDLE, "removeTimeoutsForActivity: Callers="
   3332                 + Debug.getCallers(4));
   3333         mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
   3334     }
   3335 
   3336     final void scheduleResumeTopActivities() {
   3337         if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) {
   3338             mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
   3339         }
   3340     }
   3341 
   3342     void removeSleepTimeouts() {
   3343         mSleepTimeout = false;
   3344         mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
   3345     }
   3346 
   3347     final void scheduleSleepTimeout() {
   3348         removeSleepTimeouts();
   3349         mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT);
   3350     }
   3351 
   3352     @Override
   3353     public void onDisplayAdded(int displayId) {
   3354         if (DEBUG_STACK) Slog.v(TAG, "Display added displayId=" + displayId);
   3355         mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0));
   3356     }
   3357 
   3358     @Override
   3359     public void onDisplayRemoved(int displayId) {
   3360         if (DEBUG_STACK) Slog.v(TAG, "Display removed displayId=" + displayId);
   3361         mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0));
   3362     }
   3363 
   3364     @Override
   3365     public void onDisplayChanged(int displayId) {
   3366         if (DEBUG_STACK) Slog.v(TAG, "Display changed displayId=" + displayId);
   3367         mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0));
   3368     }
   3369 
   3370     private void handleDisplayAdded(int displayId) {
   3371         boolean newDisplay;
   3372         synchronized (mService) {
   3373             newDisplay = mActivityDisplays.get(displayId) == null;
   3374             if (newDisplay) {
   3375                 ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
   3376                 if (activityDisplay.mDisplay == null) {
   3377                     Slog.w(TAG, "Display " + displayId + " gone before initialization complete");
   3378                     return;
   3379                 }
   3380                 mActivityDisplays.put(displayId, activityDisplay);
   3381                 calculateDefaultMinimalSizeOfResizeableTasks(activityDisplay);
   3382             }
   3383         }
   3384         if (newDisplay) {
   3385             mWindowManager.onDisplayAdded(displayId);
   3386         }
   3387     }
   3388 
   3389     private void calculateDefaultMinimalSizeOfResizeableTasks(ActivityDisplay display) {
   3390         mDefaultMinSizeOfResizeableTask =
   3391                 mService.mContext.getResources().getDimensionPixelSize(
   3392                         com.android.internal.R.dimen.default_minimal_size_resizable_task);
   3393     }
   3394 
   3395     private void handleDisplayRemoved(int displayId) {
   3396         synchronized (mService) {
   3397             ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
   3398             if (activityDisplay != null) {
   3399                 ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
   3400                 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   3401                     stacks.get(stackNdx).mActivityContainer.detachLocked();
   3402                 }
   3403                 mActivityDisplays.remove(displayId);
   3404             }
   3405         }
   3406         mWindowManager.onDisplayRemoved(displayId);
   3407     }
   3408 
   3409     private void handleDisplayChanged(int displayId) {
   3410         synchronized (mService) {
   3411             ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
   3412             if (activityDisplay != null) {
   3413                 // TODO: Update the bounds.
   3414             }
   3415         }
   3416         mWindowManager.onDisplayChanged(displayId);
   3417     }
   3418 
   3419     private StackInfo getStackInfoLocked(ActivityStack stack) {
   3420         final ActivityDisplay display = mActivityDisplays.get(Display.DEFAULT_DISPLAY);
   3421         StackInfo info = new StackInfo();
   3422         mWindowManager.getStackBounds(stack.mStackId, info.bounds);
   3423         info.displayId = Display.DEFAULT_DISPLAY;
   3424         info.stackId = stack.mStackId;
   3425         info.userId = stack.mCurrentUser;
   3426         info.visible = stack.getStackVisibilityLocked(null) == STACK_VISIBLE;
   3427         info.position = display != null
   3428                 ? display.mStacks.indexOf(stack)
   3429                 : 0;
   3430 
   3431         ArrayList<TaskRecord> tasks = stack.getAllTasks();
   3432         final int numTasks = tasks.size();
   3433         int[] taskIds = new int[numTasks];
   3434         String[] taskNames = new String[numTasks];
   3435         Rect[] taskBounds = new Rect[numTasks];
   3436         int[] taskUserIds = new int[numTasks];
   3437         for (int i = 0; i < numTasks; ++i) {
   3438             final TaskRecord task = tasks.get(i);
   3439             taskIds[i] = task.taskId;
   3440             taskNames[i] = task.origActivity != null ? task.origActivity.flattenToString()
   3441                     : task.realActivity != null ? task.realActivity.flattenToString()
   3442                     : task.getTopActivity() != null ? task.getTopActivity().packageName
   3443                     : "unknown";
   3444             taskBounds[i] = new Rect();
   3445             mWindowManager.getTaskBounds(task.taskId, taskBounds[i]);
   3446             taskUserIds[i] = task.userId;
   3447         }
   3448         info.taskIds = taskIds;
   3449         info.taskNames = taskNames;
   3450         info.taskBounds = taskBounds;
   3451         info.taskUserIds = taskUserIds;
   3452 
   3453         final ActivityRecord top = stack.topRunningActivityLocked();
   3454         info.topActivity = top != null ? top.intent.getComponent() : null;
   3455         return info;
   3456     }
   3457 
   3458     StackInfo getStackInfoLocked(int stackId) {
   3459         ActivityStack stack = getStack(stackId);
   3460         if (stack != null) {
   3461             return getStackInfoLocked(stack);
   3462         }
   3463         return null;
   3464     }
   3465 
   3466     ArrayList<StackInfo> getAllStackInfosLocked() {
   3467         ArrayList<StackInfo> list = new ArrayList<>();
   3468         for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) {
   3469             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   3470             for (int ndx = stacks.size() - 1; ndx >= 0; --ndx) {
   3471                 list.add(getStackInfoLocked(stacks.get(ndx)));
   3472             }
   3473         }
   3474         return list;
   3475     }
   3476 
   3477     TaskRecord getLockedTaskLocked() {
   3478         final int top = mLockTaskModeTasks.size() - 1;
   3479         if (top >= 0) {
   3480             return mLockTaskModeTasks.get(top);
   3481         }
   3482         return null;
   3483     }
   3484 
   3485     boolean isLockedTask(TaskRecord task) {
   3486         return mLockTaskModeTasks.contains(task);
   3487     }
   3488 
   3489     boolean isLastLockedTask(TaskRecord task) {
   3490         return mLockTaskModeTasks.size() == 1 && mLockTaskModeTasks.contains(task);
   3491     }
   3492 
   3493     void removeLockedTaskLocked(final TaskRecord task) {
   3494         if (!mLockTaskModeTasks.remove(task)) {
   3495             return;
   3496         }
   3497         if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "removeLockedTaskLocked: removed " + task);
   3498         if (mLockTaskModeTasks.isEmpty()) {
   3499             // Last one.
   3500             if (DEBUG_LOCKTASK) Slog.d(TAG_LOCKTASK, "removeLockedTask: task=" + task +
   3501                     " last task, reverting locktask mode. Callers=" + Debug.getCallers(3));
   3502             final Message lockTaskMsg = Message.obtain();
   3503             lockTaskMsg.arg1 = task.userId;
   3504             lockTaskMsg.what = LOCK_TASK_END_MSG;
   3505             mHandler.sendMessage(lockTaskMsg);
   3506         }
   3507     }
   3508 
   3509     void handleNonResizableTaskIfNeeded(TaskRecord task, int preferredStackId, int actualStackId) {
   3510         handleNonResizableTaskIfNeeded(task, preferredStackId, actualStackId,
   3511                 false /* forceNonResizable */);
   3512     }
   3513 
   3514     void handleNonResizableTaskIfNeeded(
   3515             TaskRecord task, int preferredStackId, int actualStackId, boolean forceNonResizable) {
   3516         if ((!isStackDockedInEffect(actualStackId) && preferredStackId != DOCKED_STACK_ID)
   3517                 || task.isHomeTask()) {
   3518             return;
   3519         }
   3520 
   3521         final ActivityRecord topActivity = task.getTopActivity();
   3522         if (!task.canGoInDockedStack() || forceNonResizable) {
   3523             // Display a warning toast that we tried to put a non-dockable task in the docked stack.
   3524             mService.mHandler.sendEmptyMessage(NOTIFY_ACTIVITY_DISMISSING_DOCKED_STACK_MSG);
   3525 
   3526             // Dismiss docked stack. If task appeared to be in docked stack but is not resizable -
   3527             // we need to move it to top of fullscreen stack, otherwise it will be covered.
   3528             moveTasksToFullscreenStackLocked(DOCKED_STACK_ID, actualStackId == DOCKED_STACK_ID);
   3529         } else if (topActivity != null && topActivity.isNonResizableOrForced()
   3530                 && !topActivity.noDisplay) {
   3531             String packageName = topActivity.appInfo.packageName;
   3532             mService.mHandler.obtainMessage(NOTIFY_FORCED_RESIZABLE_MSG, task.taskId, 0,
   3533                     packageName).sendToTarget();
   3534         }
   3535     }
   3536 
   3537     void showLockTaskToast() {
   3538         if (mLockTaskNotify != null) {
   3539             mLockTaskNotify.showToast(mLockTaskModeState);
   3540         }
   3541     }
   3542 
   3543     void showLockTaskEscapeMessageLocked(TaskRecord task) {
   3544         if (mLockTaskModeTasks.contains(task)) {
   3545             mHandler.sendEmptyMessage(SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG);
   3546         }
   3547     }
   3548 
   3549     void setLockTaskModeLocked(TaskRecord task, int lockTaskModeState, String reason,
   3550             boolean andResume) {
   3551         if (task == null) {
   3552             // Take out of lock task mode if necessary
   3553             final TaskRecord lockedTask = getLockedTaskLocked();
   3554             if (lockedTask != null) {
   3555                 removeLockedTaskLocked(lockedTask);
   3556                 if (!mLockTaskModeTasks.isEmpty()) {
   3557                     // There are locked tasks remaining, can only finish this task, not unlock it.
   3558                     if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK,
   3559                             "setLockTaskModeLocked: Tasks remaining, can't unlock");
   3560                     lockedTask.performClearTaskLocked();
   3561                     resumeFocusedStackTopActivityLocked();
   3562                     return;
   3563                 }
   3564             }
   3565             if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK,
   3566                     "setLockTaskModeLocked: No tasks to unlock. Callers=" + Debug.getCallers(4));
   3567             return;
   3568         }
   3569 
   3570         // Should have already been checked, but do it again.
   3571         if (task.mLockTaskAuth == LOCK_TASK_AUTH_DONT_LOCK) {
   3572             if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK,
   3573                     "setLockTaskModeLocked: Can't lock due to auth");
   3574             return;
   3575         }
   3576         if (isLockTaskModeViolation(task)) {
   3577             Slog.e(TAG_LOCKTASK, "setLockTaskMode: Attempt to start an unauthorized lock task.");
   3578             return;
   3579         }
   3580 
   3581         if (mLockTaskModeTasks.isEmpty()) {
   3582             // First locktask.
   3583             final Message lockTaskMsg = Message.obtain();
   3584             lockTaskMsg.obj = task.intent.getComponent().getPackageName();
   3585             lockTaskMsg.arg1 = task.userId;
   3586             lockTaskMsg.what = LOCK_TASK_START_MSG;
   3587             lockTaskMsg.arg2 = lockTaskModeState;
   3588             mHandler.sendMessage(lockTaskMsg);
   3589         }
   3590         // Add it or move it to the top.
   3591         if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "setLockTaskModeLocked: Locking to " + task +
   3592                 " Callers=" + Debug.getCallers(4));
   3593         mLockTaskModeTasks.remove(task);
   3594         mLockTaskModeTasks.add(task);
   3595 
   3596         if (task.mLockTaskUid == -1) {
   3597             task.mLockTaskUid = task.effectiveUid;
   3598         }
   3599 
   3600         if (andResume) {
   3601             findTaskToMoveToFrontLocked(task, 0, null, reason,
   3602                     lockTaskModeState != LOCK_TASK_MODE_NONE);
   3603             resumeFocusedStackTopActivityLocked();
   3604         } else if (lockTaskModeState != LOCK_TASK_MODE_NONE) {
   3605             handleNonResizableTaskIfNeeded(task, INVALID_STACK_ID, task.stack.mStackId,
   3606                     true /* forceNonResizable */);
   3607         }
   3608     }
   3609 
   3610     boolean isLockTaskModeViolation(TaskRecord task) {
   3611         return isLockTaskModeViolation(task, false);
   3612     }
   3613 
   3614     boolean isLockTaskModeViolation(TaskRecord task, boolean isNewClearTask) {
   3615         if (getLockedTaskLocked() == task && !isNewClearTask) {
   3616             return false;
   3617         }
   3618         final int lockTaskAuth = task.mLockTaskAuth;
   3619         switch (lockTaskAuth) {
   3620             case LOCK_TASK_AUTH_DONT_LOCK:
   3621                 return !mLockTaskModeTasks.isEmpty();
   3622             case LOCK_TASK_AUTH_LAUNCHABLE_PRIV:
   3623             case LOCK_TASK_AUTH_LAUNCHABLE:
   3624             case LOCK_TASK_AUTH_WHITELISTED:
   3625                 return false;
   3626             case LOCK_TASK_AUTH_PINNABLE:
   3627                 // Pinnable tasks can't be launched on top of locktask tasks.
   3628                 return !mLockTaskModeTasks.isEmpty();
   3629             default:
   3630                 Slog.w(TAG, "isLockTaskModeViolation: invalid lockTaskAuth value=" + lockTaskAuth);
   3631                 return true;
   3632         }
   3633     }
   3634 
   3635     void onLockTaskPackagesUpdatedLocked() {
   3636         boolean didSomething = false;
   3637         for (int taskNdx = mLockTaskModeTasks.size() - 1; taskNdx >= 0; --taskNdx) {
   3638             final TaskRecord lockedTask = mLockTaskModeTasks.get(taskNdx);
   3639             final boolean wasWhitelisted =
   3640                     (lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE) ||
   3641                     (lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_WHITELISTED);
   3642             lockedTask.setLockTaskAuth();
   3643             final boolean isWhitelisted =
   3644                     (lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE) ||
   3645                     (lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_WHITELISTED);
   3646             if (wasWhitelisted && !isWhitelisted) {
   3647                 // Lost whitelisting authorization. End it now.
   3648                 if (DEBUG_LOCKTASK) Slog.d(TAG_LOCKTASK, "onLockTaskPackagesUpdated: removing " +
   3649                         lockedTask + " mLockTaskAuth=" + lockedTask.lockTaskAuthToString());
   3650                 removeLockedTaskLocked(lockedTask);
   3651                 lockedTask.performClearTaskLocked();
   3652                 didSomething = true;
   3653             }
   3654         }
   3655         for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
   3656             ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
   3657             for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
   3658                 final ActivityStack stack = stacks.get(stackNdx);
   3659                 stack.onLockTaskPackagesUpdatedLocked();
   3660             }
   3661         }
   3662         final ActivityRecord r = topRunningActivityLocked();
   3663         final TaskRecord task = r != null ? r.task : null;
   3664         if (mLockTaskModeTasks.isEmpty() && task != null
   3665                 && task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE) {
   3666             // This task must have just been authorized.
   3667             if (DEBUG_LOCKTASK) Slog.d(TAG_LOCKTASK,
   3668                     "onLockTaskPackagesUpdated: starting new locktask task=" + task);
   3669             setLockTaskModeLocked(task, ActivityManager.LOCK_TASK_MODE_LOCKED, "package updated",
   3670                     false);
   3671             didSomething = true;
   3672         }
   3673         if (didSomething) {
   3674             resumeFocusedStackTopActivityLocked();
   3675         }
   3676     }
   3677 
   3678     int getLockTaskModeState() {
   3679         return mLockTaskModeState;
   3680     }
   3681 
   3682     void activityRelaunchedLocked(IBinder token) {
   3683         mWindowManager.notifyAppRelaunchingFinished(token);
   3684     }
   3685 
   3686     void activityRelaunchingLocked(ActivityRecord r) {
   3687         mWindowManager.notifyAppRelaunching(r.appToken);
   3688     }
   3689 
   3690     void logStackState() {
   3691         mActivityMetricsLogger.logWindowState();
   3692     }
   3693 
   3694     void scheduleReportMultiWindowModeChanged(TaskRecord task) {
   3695         for (int i = task.mActivities.size() - 1; i >= 0; i--) {
   3696             final ActivityRecord r = task.mActivities.get(i);
   3697             if (r.app != null && r.app.thread != null) {
   3698                 mMultiWindowModeChangedActivities.add(r);
   3699             }
   3700         }
   3701 
   3702         if (!mHandler.hasMessages(REPORT_MULTI_WINDOW_MODE_CHANGED_MSG)) {
   3703             mHandler.sendEmptyMessage(REPORT_MULTI_WINDOW_MODE_CHANGED_MSG);
   3704         }
   3705     }
   3706 
   3707     void scheduleReportPictureInPictureModeChangedIfNeeded(TaskRecord task, ActivityStack prevStack) {
   3708         final ActivityStack stack = task.stack;
   3709         if (prevStack == null || prevStack == stack
   3710                 || (prevStack.mStackId != PINNED_STACK_ID && stack.mStackId != PINNED_STACK_ID)) {
   3711             return;
   3712         }
   3713 
   3714         for (int i = task.mActivities.size() - 1; i >= 0; i--) {
   3715             final ActivityRecord r = task.mActivities.get(i);
   3716             if (r.app != null && r.app.thread != null) {
   3717                 mPipModeChangedActivities.add(r);
   3718             }
   3719         }
   3720 
   3721         if (!mHandler.hasMessages(REPORT_PIP_MODE_CHANGED_MSG)) {
   3722             mHandler.sendEmptyMessage(REPORT_PIP_MODE_CHANGED_MSG);
   3723         }
   3724     }
   3725 
   3726     void setDockedStackMinimized(boolean minimized) {
   3727         mIsDockMinimized = minimized;
   3728         if (minimized) {
   3729             // Docked stack is not visible, no need to confirm credentials for its top activity.
   3730             return;
   3731         }
   3732         final ActivityStack dockedStack = getStack(StackId.DOCKED_STACK_ID);
   3733         if (dockedStack == null) {
   3734             return;
   3735         }
   3736         final ActivityRecord top = dockedStack.topRunningActivityLocked();
   3737         if (top != null && mService.mUserController.shouldConfirmCredentials(top.userId)) {
   3738             mService.mActivityStarter.showConfirmDeviceCredential(top.userId);
   3739         }
   3740     }
   3741 
   3742     private final class ActivityStackSupervisorHandler extends Handler {
   3743 
   3744         public ActivityStackSupervisorHandler(Looper looper) {
   3745             super(looper);
   3746         }
   3747 
   3748         void activityIdleInternal(ActivityRecord r) {
   3749             synchronized (mService) {
   3750                 activityIdleInternalLocked(r != null ? r.appToken : null, true, null);
   3751             }
   3752         }
   3753 
   3754         @Override
   3755         public void handleMessage(Message msg) {
   3756             switch (msg.what) {
   3757                 case REPORT_MULTI_WINDOW_MODE_CHANGED_MSG: {
   3758                     synchronized (mService) {
   3759                         for (int i = mMultiWindowModeChangedActivities.size() - 1; i >= 0; i--) {
   3760                             final ActivityRecord r = mMultiWindowModeChangedActivities.remove(i);
   3761                             r.scheduleMultiWindowModeChanged();
   3762                         }
   3763                     }
   3764                 } break;
   3765                 case REPORT_PIP_MODE_CHANGED_MSG: {
   3766                     synchronized (mService) {
   3767                         for (int i = mPipModeChangedActivities.size() - 1; i >= 0; i--) {
   3768                             final ActivityRecord r = mPipModeChangedActivities.remove(i);
   3769                             r.schedulePictureInPictureModeChanged();
   3770                         }
   3771                     }
   3772                 } break;
   3773                 case IDLE_TIMEOUT_MSG: {
   3774                     if (DEBUG_IDLE) Slog.d(TAG_IDLE,
   3775                             "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
   3776                     if (mService.mDidDexOpt) {
   3777                         mService.mDidDexOpt = false;
   3778                         Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
   3779                         nmsg.obj = msg.obj;
   3780                         mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
   3781                         return;
   3782                     }
   3783                     // We don't at this point know if the activity is fullscreen,
   3784                     // so we need to be conservative and assume it isn't.
   3785                     activityIdleInternal((ActivityRecord)msg.obj);
   3786                 } break;
   3787                 case IDLE_NOW_MSG: {
   3788                     if (DEBUG_IDLE) Slog.d(TAG_IDLE, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
   3789                     activityIdleInternal((ActivityRecord)msg.obj);
   3790                 } break;
   3791                 case RESUME_TOP_ACTIVITY_MSG: {
   3792                     synchronized (mService) {
   3793                         resumeFocusedStackTopActivityLocked();
   3794                     }
   3795                 } break;
   3796                 case SLEEP_TIMEOUT_MSG: {
   3797                     synchronized (mService) {
   3798                         if (mService.isSleepingOrShuttingDownLocked()) {
   3799                             Slog.w(TAG, "Sleep timeout!  Sleeping now.");
   3800                             mSleepTimeout = true;
   3801                             checkReadyForSleepLocked();
   3802                         }
   3803                     }
   3804                 } break;
   3805                 case LAUNCH_TIMEOUT_MSG: {
   3806                     if (mService.mDidDexOpt) {
   3807                         mService.mDidDexOpt = false;
   3808                         mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
   3809                         return;
   3810                     }
   3811                     synchronized (mService) {
   3812                         if (mLaunchingActivity.isHeld()) {
   3813                             Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
   3814                             if (VALIDATE_WAKE_LOCK_CALLER
   3815                                     && Binder.getCallingUid() != Process.myUid()) {
   3816                                 throw new IllegalStateException("Calling must be system uid");
   3817                             }
   3818                             mLaunchingActivity.release();
   3819                         }
   3820                     }
   3821                 } break;
   3822                 case HANDLE_DISPLAY_ADDED: {
   3823                     handleDisplayAdded(msg.arg1);
   3824                 } break;
   3825                 case HANDLE_DISPLAY_CHANGED: {
   3826                     handleDisplayChanged(msg.arg1);
   3827                 } break;
   3828                 case HANDLE_DISPLAY_REMOVED: {
   3829                     handleDisplayRemoved(msg.arg1);
   3830                 } break;
   3831                 case CONTAINER_CALLBACK_VISIBILITY: {
   3832                     final ActivityContainer container = (ActivityContainer) msg.obj;
   3833                     final IActivityContainerCallback callback = container.mCallback;
   3834                     if (callback != null) {
   3835                         try {
   3836                             callback.setVisible(container.asBinder(), msg.arg1 == 1);
   3837                         } catch (RemoteException e) {
   3838                         }
   3839                     }
   3840                 } break;
   3841                 case LOCK_TASK_START_MSG: {
   3842                     // When lock task starts, we disable the status bars.
   3843                     try {
   3844                         if (mLockTaskNotify == null) {
   3845                             mLockTaskNotify = new LockTaskNotify(mService.mContext);
   3846                         }
   3847                         mLockTaskNotify.show(true);
   3848                         mLockTaskModeState = msg.arg2;
   3849                         if (getStatusBarService() != null) {
   3850                             int flags = 0;
   3851                             if (mLockTaskModeState == LOCK_TASK_MODE_LOCKED) {
   3852                                 flags = StatusBarManager.DISABLE_MASK
   3853                                         & (~StatusBarManager.DISABLE_BACK);
   3854                             } else if (mLockTaskModeState == LOCK_TASK_MODE_PINNED) {
   3855                                 flags = StatusBarManager.DISABLE_MASK
   3856                                         & (~StatusBarManager.DISABLE_BACK)
   3857                                         & (~StatusBarManager.DISABLE_HOME)
   3858                                         & (~StatusBarManager.DISABLE_RECENT);
   3859                             }
   3860                             getStatusBarService().disable(flags, mToken,
   3861                                     mService.mContext.getPackageName());
   3862                         }
   3863                         mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG);
   3864                         if (getDevicePolicyManager() != null) {
   3865                             getDevicePolicyManager().notifyLockTaskModeChanged(true,
   3866                                     (String)msg.obj, msg.arg1);
   3867                         }
   3868                     } catch (RemoteException ex) {
   3869                         throw new RuntimeException(ex);
   3870                     }
   3871                 } break;
   3872                 case LOCK_TASK_END_MSG: {
   3873                     // When lock task ends, we enable the status bars.
   3874                     try {
   3875                         if (getStatusBarService() != null) {
   3876                             getStatusBarService().disable(StatusBarManager.DISABLE_NONE, mToken,
   3877                                     mService.mContext.getPackageName());
   3878                         }
   3879                         mWindowManager.reenableKeyguard(mToken);
   3880                         if (getDevicePolicyManager() != null) {
   3881                             getDevicePolicyManager().notifyLockTaskModeChanged(false, null,
   3882                                     msg.arg1);
   3883                         }
   3884                         if (mLockTaskNotify == null) {
   3885                             mLockTaskNotify = new LockTaskNotify(mService.mContext);
   3886                         }
   3887                         mLockTaskNotify.show(false);
   3888                         try {
   3889                             boolean shouldLockKeyguard = Settings.Secure.getInt(
   3890                                     mService.mContext.getContentResolver(),
   3891                                     Settings.Secure.LOCK_TO_APP_EXIT_LOCKED) != 0;
   3892                             if (mLockTaskModeState == LOCK_TASK_MODE_PINNED && shouldLockKeyguard) {
   3893                                 mWindowManager.lockNow(null);
   3894                                 mWindowManager.dismissKeyguard();
   3895                                 new LockPatternUtils(mService.mContext)
   3896                                         .requireCredentialEntry(UserHandle.USER_ALL);
   3897                             }
   3898                         } catch (SettingNotFoundException e) {
   3899                             // No setting, don't lock.
   3900                         }
   3901                     } catch (RemoteException ex) {
   3902                         throw new RuntimeException(ex);
   3903                     } finally {
   3904                         mLockTaskModeState = LOCK_TASK_MODE_NONE;
   3905                     }
   3906                 } break;
   3907                 case SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG: {
   3908                     if (mLockTaskNotify == null) {
   3909                         mLockTaskNotify = new LockTaskNotify(mService.mContext);
   3910                     }
   3911                     mLockTaskNotify.showToast(LOCK_TASK_MODE_PINNED);
   3912                 } break;
   3913                 case CONTAINER_CALLBACK_TASK_LIST_EMPTY: {
   3914                     final ActivityContainer container = (ActivityContainer) msg.obj;
   3915                     final IActivityContainerCallback callback = container.mCallback;
   3916                     if (callback != null) {
   3917                         try {
   3918                             callback.onAllActivitiesComplete(container.asBinder());
   3919                         } catch (RemoteException e) {
   3920                         }
   3921                     }
   3922                 } break;
   3923                 case LAUNCH_TASK_BEHIND_COMPLETE: {
   3924                     synchronized (mService) {
   3925                         ActivityRecord r = ActivityRecord.forTokenLocked((IBinder) msg.obj);
   3926                         if (r != null) {
   3927                             handleLaunchTaskBehindCompleteLocked(r);
   3928                         }
   3929                     }
   3930                 } break;
   3931 
   3932             }
   3933         }
   3934     }
   3935 
   3936     class ActivityContainer extends android.app.IActivityContainer.Stub {
   3937         final static int FORCE_NEW_TASK_FLAGS = FLAG_ACTIVITY_NEW_TASK |
   3938                 FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION;
   3939         final int mStackId;
   3940         IActivityContainerCallback mCallback = null;
   3941         final ActivityStack mStack;
   3942         ActivityRecord mParentActivity = null;
   3943         String mIdString;
   3944 
   3945         boolean mVisible = true;
   3946 
   3947         /** Display this ActivityStack is currently on. Null if not attached to a Display. */
   3948         ActivityDisplay mActivityDisplay;
   3949 
   3950         final static int CONTAINER_STATE_HAS_SURFACE = 0;
   3951         final static int CONTAINER_STATE_NO_SURFACE = 1;
   3952         final static int CONTAINER_STATE_FINISHING = 2;
   3953         int mContainerState = CONTAINER_STATE_HAS_SURFACE;
   3954 
   3955         ActivityContainer(int stackId) {
   3956             synchronized (mService) {
   3957                 mStackId = stackId;
   3958                 mStack = new ActivityStack(this, mRecentTasks);
   3959                 mIdString = "ActivtyContainer{" + mStackId + "}";
   3960                 if (DEBUG_STACK) Slog.d(TAG_STACK, "Creating " + this);
   3961             }
   3962         }
   3963 
   3964         void attachToDisplayLocked(ActivityDisplay activityDisplay, boolean onTop) {
   3965             if (DEBUG_STACK) Slog.d(TAG_STACK, "attachToDisplayLocked: " + this
   3966                     + " to display=" + activityDisplay + " onTop=" + onTop);
   3967             mActivityDisplay = activityDisplay;
   3968             mStack.attachDisplay(activityDisplay, onTop);
   3969             activityDisplay.attachActivities(mStack, onTop);
   3970         }
   3971 
   3972         @Override
   3973         public void attachToDisplay(int displayId) {
   3974             synchronized (mService) {
   3975                 ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
   3976                 if (activityDisplay == null) {
   3977                     return;
   3978                 }
   3979                 attachToDisplayLocked(activityDisplay, true);
   3980             }
   3981         }
   3982 
   3983         @Override
   3984         public int getDisplayId() {
   3985             synchronized (mService) {
   3986                 if (mActivityDisplay != null) {
   3987                     return mActivityDisplay.mDisplayId;
   3988                 }
   3989             }
   3990             return -1;
   3991         }
   3992 
   3993         @Override
   3994         public int getStackId() {
   3995             synchronized (mService) {
   3996                 return mStackId;
   3997             }
   3998         }
   3999 
   4000         @Override
   4001         public boolean injectEvent(InputEvent event) {
   4002             final long origId = Binder.clearCallingIdentity();
   4003             try {
   4004                 synchronized (mService) {
   4005                     if (mActivityDisplay != null) {
   4006                         return mInputManagerInternal.injectInputEvent(event,
   4007                                 mActivityDisplay.mDisplayId,
   4008                                 InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
   4009                     }
   4010                 }
   4011                 return false;
   4012             } finally {
   4013                 Binder.restoreCallingIdentity(origId);
   4014             }
   4015         }
   4016 
   4017         @Override
   4018         public void release() {
   4019             synchronized (mService) {
   4020                 if (mContainerState == CONTAINER_STATE_FINISHING) {
   4021                     return;
   4022                 }
   4023                 mContainerState = CONTAINER_STATE_FINISHING;
   4024 
   4025                 long origId = Binder.clearCallingIdentity();
   4026                 try {
   4027                     mStack.finishAllActivitiesLocked(false);
   4028                     mService.mActivityStarter.removePendingActivityLaunchesLocked(mStack);
   4029                 } finally {
   4030                     Binder.restoreCallingIdentity(origId);
   4031                 }
   4032             }
   4033         }
   4034 
   4035         protected void detachLocked() {
   4036             if (DEBUG_STACK) Slog.d(TAG_STACK, "detachLocked: " + this + " from display="
   4037                     + mActivityDisplay + " Callers=" + Debug.getCallers(2));
   4038             if (mActivityDisplay != null) {
   4039                 mActivityDisplay.detachActivitiesLocked(mStack);
   4040                 mActivityDisplay = null;
   4041                 mStack.detachDisplay();
   4042             }
   4043         }
   4044 
   4045         @Override
   4046         public final int startActivity(Intent intent) {
   4047             return mService.startActivity(intent, this);
   4048         }
   4049 
   4050         @Override
   4051         public final int startActivityIntentSender(IIntentSender intentSender)
   4052                 throws TransactionTooLargeException {
   4053             mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender");
   4054 
   4055             if (!(intentSender instanceof PendingIntentRecord)) {
   4056                 throw new IllegalArgumentException("Bad PendingIntent object");
   4057             }
   4058 
   4059             final int userId = mService.mUserController.handleIncomingUser(Binder.getCallingPid(),
   4060                     Binder.getCallingUid(), mCurrentUser, false,
   4061                     ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null);
   4062 
   4063             final PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender;
   4064             checkEmbeddedAllowedInner(userId, pendingIntent.key.requestIntent,
   4065                     pendingIntent.key.requestResolvedType);
   4066 
   4067             return pendingIntent.sendInner(0, null, null, null, null, null, null, 0,
   4068                     FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this);
   4069         }
   4070 
   4071         void checkEmbeddedAllowedInner(int userId, Intent intent, String resolvedType) {
   4072             ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId);
   4073             if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) {
   4074                 throw new SecurityException(
   4075                         "Attempt to embed activity that has not set allowEmbedded=\"true\"");
   4076             }
   4077         }
   4078 
   4079         @Override
   4080         public IBinder asBinder() {
   4081             return this;
   4082         }
   4083 
   4084         @Override
   4085         public void setSurface(Surface surface, int width, int height, int density) {
   4086             mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface");
   4087         }
   4088 
   4089         ActivityStackSupervisor getOuter() {
   4090             return ActivityStackSupervisor.this;
   4091         }
   4092 
   4093         boolean isAttachedLocked() {
   4094             return mActivityDisplay != null;
   4095         }
   4096 
   4097         // TODO: Make sure every change to ActivityRecord.visible results in a call to this.
   4098         void setVisible(boolean visible) {
   4099             if (mVisible != visible) {
   4100                 mVisible = visible;
   4101                 if (mCallback != null) {
   4102                     mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0,
   4103                             0 /* unused */, this).sendToTarget();
   4104                 }
   4105             }
   4106         }
   4107 
   4108         void setDrawn() {
   4109         }
   4110 
   4111         // You can always start a new task on a regular ActivityStack.
   4112         boolean isEligibleForNewTasks() {
   4113             return true;
   4114         }
   4115 
   4116         void onTaskListEmptyLocked() {
   4117             detachLocked();
   4118             deleteActivityContainer(this);
   4119             mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget();
   4120         }
   4121 
   4122         @Override
   4123         public String toString() {
   4124             return mIdString + (mActivityDisplay == null ? "N" : "A");
   4125         }
   4126     }
   4127 
   4128     private class VirtualActivityContainer extends ActivityContainer {
   4129         Surface mSurface;
   4130         boolean mDrawn = false;
   4131 
   4132         VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) {
   4133             super(getNextStackId());
   4134             mParentActivity = parent;
   4135             mCallback = callback;
   4136             mContainerState = CONTAINER_STATE_NO_SURFACE;
   4137             mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}";
   4138         }
   4139 
   4140         @Override
   4141         public void setSurface(Surface surface, int width, int height, int density) {
   4142             super.setSurface(surface, width, height, density);
   4143 
   4144             synchronized (mService) {
   4145                 final long origId = Binder.clearCallingIdentity();
   4146                 try {
   4147                     setSurfaceLocked(surface, width, height, density);
   4148                 } finally {
   4149                     Binder.restoreCallingIdentity(origId);
   4150                 }
   4151             }
   4152         }
   4153 
   4154         private void setSurfaceLocked(Surface surface, int width, int height, int density) {
   4155             if (mContainerState == CONTAINER_STATE_FINISHING) {
   4156                 return;
   4157             }
   4158             VirtualActivityDisplay virtualActivityDisplay =
   4159                     (VirtualActivityDisplay) mActivityDisplay;
   4160             if (virtualActivityDisplay == null) {
   4161                 virtualActivityDisplay =
   4162                         new VirtualActivityDisplay(width, height, density);
   4163                 mActivityDisplay = virtualActivityDisplay;
   4164                 mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay);
   4165                 attachToDisplayLocked(virtualActivityDisplay, true);
   4166             }
   4167 
   4168             if (mSurface != null) {
   4169                 mSurface.release();
   4170             }
   4171 
   4172             mSurface = surface;
   4173             if (surface != null) {
   4174                 resumeFocusedStackTopActivityLocked();
   4175             } else {
   4176                 mContainerState = CONTAINER_STATE_NO_SURFACE;
   4177                 ((VirtualActivityDisplay) mActivityDisplay).setSurface(null);
   4178                 if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
   4179                     mStack.startPausingLocked(false, true, false, false);
   4180                 }
   4181             }
   4182 
   4183             setSurfaceIfReadyLocked();
   4184 
   4185             if (DEBUG_STACK) Slog.d(TAG_STACK,
   4186                     "setSurface: " + this + " to display=" + virtualActivityDisplay);
   4187         }
   4188 
   4189         @Override
   4190         boolean isAttachedLocked() {
   4191             return mSurface != null && super.isAttachedLocked();
   4192         }
   4193 
   4194         @Override
   4195         void setDrawn() {
   4196             synchronized (mService) {
   4197                 mDrawn = true;
   4198                 setSurfaceIfReadyLocked();
   4199             }
   4200         }
   4201 
   4202         // Never start a new task on an ActivityView if it isn't explicitly specified.
   4203         @Override
   4204         boolean isEligibleForNewTasks() {
   4205             return false;
   4206         }
   4207 
   4208         private void setSurfaceIfReadyLocked() {
   4209             if (DEBUG_STACK) Slog.v(TAG_STACK, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn +
   4210                     " mContainerState=" + mContainerState + " mSurface=" + mSurface);
   4211             if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) {
   4212                 ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface);
   4213                 mContainerState = CONTAINER_STATE_HAS_SURFACE;
   4214             }
   4215         }
   4216     }
   4217 
   4218     /** Exactly one of these classes per Display in the system. Capable of holding zero or more
   4219      * attached {@link ActivityStack}s */
   4220     class ActivityDisplay {
   4221         /** Actual Display this object tracks. */
   4222         int mDisplayId;
   4223         Display mDisplay;
   4224         DisplayInfo mDisplayInfo = new DisplayInfo();
   4225 
   4226         /** All of the stacks on this display. Order matters, topmost stack is in front of all other
   4227          * stacks, bottommost behind. Accessed directly by ActivityManager package classes */
   4228         final ArrayList<ActivityStack> mStacks = new ArrayList<>();
   4229 
   4230         ActivityRecord mVisibleBehindActivity;
   4231 
   4232         ActivityDisplay() {
   4233         }
   4234 
   4235         // After instantiation, check that mDisplay is not null before using this. The alternative
   4236         // is for this to throw an exception if mDisplayManager.getDisplay() returns null.
   4237         ActivityDisplay(int displayId) {
   4238             final Display display = mDisplayManager.getDisplay(displayId);
   4239             if (display == null) {
   4240                 return;
   4241             }
   4242             init(display);
   4243         }
   4244 
   4245         void init(Display display) {
   4246             mDisplay = display;
   4247             mDisplayId = display.getDisplayId();
   4248             mDisplay.getDisplayInfo(mDisplayInfo);
   4249         }
   4250 
   4251         void attachActivities(ActivityStack stack, boolean onTop) {
   4252             if (DEBUG_STACK) Slog.v(TAG_STACK,
   4253                     "attachActivities: attaching " + stack + " to displayId=" + mDisplayId
   4254                     + " onTop=" + onTop);
   4255             if (onTop) {
   4256                 mStacks.add(stack);
   4257             } else {
   4258                 mStacks.add(0, stack);
   4259             }
   4260         }
   4261 
   4262         void detachActivitiesLocked(ActivityStack stack) {
   4263             if (DEBUG_STACK) Slog.v(TAG_STACK, "detachActivitiesLocked: detaching " + stack
   4264                     + " from displayId=" + mDisplayId);
   4265             mStacks.remove(stack);
   4266         }
   4267 
   4268         void setVisibleBehindActivity(ActivityRecord r) {
   4269             mVisibleBehindActivity = r;
   4270         }
   4271 
   4272         boolean hasVisibleBehindActivity() {
   4273             return mVisibleBehindActivity != null;
   4274         }
   4275 
   4276         @Override
   4277         public String toString() {
   4278             return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}";
   4279         }
   4280     }
   4281 
   4282     class VirtualActivityDisplay extends ActivityDisplay {
   4283         VirtualDisplay mVirtualDisplay;
   4284 
   4285         VirtualActivityDisplay(int width, int height, int density) {
   4286             DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
   4287             mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, null,
   4288                     VIRTUAL_DISPLAY_BASE_NAME, width, height, density, null,
   4289                     DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
   4290                     DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, null, null);
   4291 
   4292             init(mVirtualDisplay.getDisplay());
   4293 
   4294             mWindowManager.handleDisplayAdded(mDisplayId);
   4295         }
   4296 
   4297         void setSurface(Surface surface) {
   4298             if (mVirtualDisplay != null) {
   4299                 mVirtualDisplay.setSurface(surface);
   4300             }
   4301         }
   4302 
   4303         @Override
   4304         void detachActivitiesLocked(ActivityStack stack) {
   4305             super.detachActivitiesLocked(stack);
   4306             if (mVirtualDisplay != null) {
   4307                 mVirtualDisplay.release();
   4308                 mVirtualDisplay = null;
   4309             }
   4310         }
   4311 
   4312         @Override
   4313         public String toString() {
   4314             return "VirtualActivityDisplay={" + mDisplayId + "}";
   4315         }
   4316     }
   4317 
   4318     /**
   4319      * Adjust bounds to stay within stack bounds.
   4320      *
   4321      * Since bounds might be outside of stack bounds, this method tries to move the bounds in a way
   4322      * that keep them unchanged, but be contained within the stack bounds.
   4323      *
   4324      * @param bounds Bounds to be adjusted.
   4325      * @param stackBounds Bounds within which the other bounds should remain.
   4326      */
   4327     private static void fitWithinBounds(Rect bounds, Rect stackBounds) {
   4328         if (stackBounds == null || stackBounds.contains(bounds)) {
   4329             return;
   4330         }
   4331 
   4332         if (bounds.left < stackBounds.left || bounds.right > stackBounds.right) {
   4333             final int maxRight = stackBounds.right
   4334                     - (stackBounds.width() / FIT_WITHIN_BOUNDS_DIVIDER);
   4335             int horizontalDiff = stackBounds.left - bounds.left;
   4336             if ((horizontalDiff < 0 && bounds.left >= maxRight)
   4337                     || (bounds.left + horizontalDiff >= maxRight)) {
   4338                 horizontalDiff = maxRight - bounds.left;
   4339             }
   4340             bounds.left += horizontalDiff;
   4341             bounds.right += horizontalDiff;
   4342         }
   4343 
   4344         if (bounds.top < stackBounds.top || bounds.bottom > stackBounds.bottom) {
   4345             final int maxBottom = stackBounds.bottom
   4346                     - (stackBounds.height() / FIT_WITHIN_BOUNDS_DIVIDER);
   4347             int verticalDiff = stackBounds.top - bounds.top;
   4348             if ((verticalDiff < 0 && bounds.top >= maxBottom)
   4349                     || (bounds.top + verticalDiff >= maxBottom)) {
   4350                 verticalDiff = maxBottom - bounds.top;
   4351             }
   4352             bounds.top += verticalDiff;
   4353             bounds.bottom += verticalDiff;
   4354         }
   4355     }
   4356 
   4357     ActivityStack findStackBehind(ActivityStack stack) {
   4358         // TODO(multi-display): We are only looking for stacks on the default display.
   4359         final ActivityDisplay display = mActivityDisplays.get(Display.DEFAULT_DISPLAY);
   4360         if (display == null) {
   4361             return null;
   4362         }
   4363         final ArrayList<ActivityStack> stacks = display.mStacks;
   4364         for (int i = stacks.size() - 1; i >= 0; i--) {
   4365             if (stacks.get(i) == stack && i > 0) {
   4366                 return stacks.get(i - 1);
   4367             }
   4368         }
   4369         throw new IllegalStateException("Failed to find a stack behind stack=" + stack
   4370                 + " in=" + stacks);
   4371     }
   4372 
   4373     /**
   4374      * Puts a task into resizing mode during the next app transition.
   4375      *
   4376      * @param taskId the id of the task to put into resizing mode
   4377      */
   4378     private void setResizingDuringAnimation(int taskId) {
   4379         mResizingTasksDuringAnimation.add(taskId);
   4380         mWindowManager.setTaskDockedResizing(taskId, true);
   4381     }
   4382 
   4383     final int startActivityFromRecentsInner(int taskId, Bundle bOptions) {
   4384         final TaskRecord task;
   4385         final int callingUid;
   4386         final String callingPackage;
   4387         final Intent intent;
   4388         final int userId;
   4389         final ActivityOptions activityOptions = (bOptions != null)
   4390                 ? new ActivityOptions(bOptions) : null;
   4391         final int launchStackId = (activityOptions != null)
   4392                 ? activityOptions.getLaunchStackId() : INVALID_STACK_ID;
   4393         if (launchStackId == HOME_STACK_ID) {
   4394             throw new IllegalArgumentException("startActivityFromRecentsInner: Task "
   4395                     + taskId + " can't be launch in the home stack.");
   4396         }
   4397 
   4398         if (launchStackId == DOCKED_STACK_ID) {
   4399             mWindowManager.setDockedStackCreateState(
   4400                     activityOptions.getDockCreateMode(), null /* initialBounds */);
   4401 
   4402             // Defer updating the stack in which recents is until the app transition is done, to
   4403             // not run into issues where we still need to draw the task in recents but the
   4404             // docked stack is already created.
   4405             deferUpdateBounds(HOME_STACK_ID);
   4406             mWindowManager.prepareAppTransition(TRANSIT_DOCK_TASK_FROM_RECENTS, false);
   4407         }
   4408 
   4409         task = anyTaskForIdLocked(taskId, RESTORE_FROM_RECENTS, launchStackId);
   4410         if (task == null) {
   4411             continueUpdateBounds(HOME_STACK_ID);
   4412             mWindowManager.executeAppTransition();
   4413             throw new IllegalArgumentException(
   4414                     "startActivityFromRecentsInner: Task " + taskId + " not found.");
   4415         }
   4416 
   4417         // Since we don't have an actual source record here, we assume that the currently focused
   4418         // activity was the source.
   4419         final ActivityStack focusedStack = getFocusedStack();
   4420         final ActivityRecord sourceRecord =
   4421                 focusedStack != null ? focusedStack.topActivity() : null;
   4422 
   4423         if (launchStackId != INVALID_STACK_ID) {
   4424             if (task.stack.mStackId != launchStackId) {
   4425                 moveTaskToStackLocked(
   4426                         taskId, launchStackId, ON_TOP, FORCE_FOCUS, "startActivityFromRecents",
   4427                         ANIMATE);
   4428             }
   4429         }
   4430 
   4431         // If the user must confirm credentials (e.g. when first launching a work app and the
   4432         // Work Challenge is present) let startActivityInPackage handle the intercepting.
   4433         if (!mService.mUserController.shouldConfirmCredentials(task.userId)
   4434                 && task.getRootActivity() != null) {
   4435             mActivityMetricsLogger.notifyActivityLaunching();
   4436             mService.moveTaskToFrontLocked(task.taskId, 0, bOptions);
   4437             mActivityMetricsLogger.notifyActivityLaunched(ActivityManager.START_TASK_TO_FRONT,
   4438                     task.getTopActivity());
   4439 
   4440             // If we are launching the task in the docked stack, put it into resizing mode so
   4441             // the window renders full-screen with the background filling the void. Also only
   4442             // call this at the end to make sure that tasks exists on the window manager side.
   4443             if (launchStackId == DOCKED_STACK_ID) {
   4444                 setResizingDuringAnimation(taskId);
   4445             }
   4446 
   4447             mService.mActivityStarter.postStartActivityUncheckedProcessing(task.getTopActivity(),
   4448                     ActivityManager.START_TASK_TO_FRONT,
   4449                     sourceRecord != null ? sourceRecord.task.stack.mStackId : INVALID_STACK_ID,
   4450                     sourceRecord, task.stack);
   4451             return ActivityManager.START_TASK_TO_FRONT;
   4452         }
   4453         callingUid = task.mCallingUid;
   4454         callingPackage = task.mCallingPackage;
   4455         intent = task.intent;
   4456         intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
   4457         userId = task.userId;
   4458         int result = mService.startActivityInPackage(callingUid, callingPackage, intent, null,
   4459                 null, null, 0, 0, bOptions, userId, null, task);
   4460         if (launchStackId == DOCKED_STACK_ID) {
   4461             setResizingDuringAnimation(task.taskId);
   4462         }
   4463         return result;
   4464     }
   4465 
   4466     /**
   4467      * @return a list of activities which are the top ones in each visible stack. The first
   4468      * entry will be the focused activity.
   4469      */
   4470     public List<IBinder> getTopVisibleActivities() {
   4471         final ActivityDisplay display = mActivityDisplays.get(Display.DEFAULT_DISPLAY);
   4472         if (display == null) {
   4473             return Collections.EMPTY_LIST;
   4474         }
   4475         ArrayList<IBinder> topActivityTokens = new ArrayList<>();
   4476         final ArrayList<ActivityStack> stacks = display.mStacks;
   4477         for (int i = stacks.size() - 1; i >= 0; i--) {
   4478             ActivityStack stack = stacks.get(i);
   4479             if (stack.getStackVisibilityLocked(null) == ActivityStack.STACK_VISIBLE) {
   4480                 ActivityRecord top = stack.topActivity();
   4481                 if (top != null) {
   4482                     if (stack == mFocusedStack) {
   4483                         topActivityTokens.add(0, top.appToken);
   4484                     } else {
   4485                         topActivityTokens.add(top.appToken);
   4486                     }
   4487                 }
   4488             }
   4489         }
   4490         return topActivityTokens;
   4491     }
   4492 }
   4493