1270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner/*
2270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Copyright (C) 2013 The Android Open Source Project
3270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner *
4270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License");
5270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * you may not use this file except in compliance with the License.
6270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * You may obtain a copy of the License at
7270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner *
8270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner *      http://www.apache.org/licenses/LICENSE-2.0
9270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner *
10270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Unless required by applicable law or agreed to in writing, software
11270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS,
12270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * See the License for the specific language governing permissions and
14270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * limitations under the License.
15270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner */
16270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
17270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpackage com.android.server.am;
18270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
196170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.Manifest.permission.START_ANY_ACTIVITY;
2029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautnerimport static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
2129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautnerimport static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
226170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.content.pm.PackageManager.PERMISSION_GRANTED;
232420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.localLOGV;
2423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_CONFIGURATION;
25e7c58b6d7d761b93e785b0a399e5b00fdb82f4ceCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_FOCUS;
260eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_PAUSE;
277de0535701351d76b634ab18577269e8130749eaWale Ogunwaleimport static com.android.server.am.ActivityManagerService.DEBUG_RECENTS;
286170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_RESULTS;
290eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_STACK;
302420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_SWITCH;
318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_TASKS;
328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING;
3305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautnerimport static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG;
348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG;
3584984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
3684984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
3784984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE;
388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
392420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity;
4023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager;
41ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.app.ActivityManager.StackInfo;
4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions;
4323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals;
444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainer;
454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainerCallback;
46ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager;
4723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread;
4823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent;
491b012d302b56b4adf950035136d1d191a1936d5aJeff Haoimport android.app.ProfilerInfo;
5020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
5123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
522420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo;
535286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport android.app.StatusBarManager;
5435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monkimport android.app.admin.IDevicePolicyManager;
5523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
562219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
5723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
582219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
5923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
602219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
6123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
6223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
6323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
6423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.graphics.Point;
664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager;
674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager.DisplayListener;
684504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.DisplayManagerGlobal;
694504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.VirtualDisplay;
70ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManager;
71ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManagerInternal;
7223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
74b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug;
75ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler;
7623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
772219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
782420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message;
7923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
800eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport android.os.PowerManager;
817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautnerimport android.os.Process;
828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
835286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport android.os.ServiceManager;
8423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
856170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle;
8662515beee67307d8859beec521b7baedfa54b2b5Jason Monkimport android.provider.Settings;
8762515beee67307d8859beec521b7baedfa54b2b5Jason Monkimport android.provider.Settings.SettingNotFoundException;
8891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionSession;
8989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.util.ArraySet;
902420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog;
918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseArray;
932219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseIntArray;
95ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.view.Display;
964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.view.DisplayInfo;
97ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.view.InputEvent;
984504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.view.Surface;
9923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
10091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
10185d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackbornimport com.android.internal.content.ReferrerIntent;
102cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe;
1035286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport com.android.internal.statusbar.IStatusBarService;
104e069779dea07c77fb858a403c42020e39b3d9c60Jason Monkimport com.android.internal.widget.LockPatternUtils;
105ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport com.android.server.LocalServices;
1062420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
107ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService;
10823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
1095286d3ff47135976d66d67888cadca52ef2ab244justinzhang
1108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
1118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
112270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
1132219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
1148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
115270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerpublic final class ActivityStackSupervisor implements DisplayListener {
117de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG = ActivityManagerService.DEBUG || false;
118de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_ADD_REMOVE = DEBUG || false;
119de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_APP = DEBUG || false;
120d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner    static final boolean DEBUG_CONTAINERS = DEBUG || false;
121b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner    static final boolean DEBUG_IDLE = DEBUG || false;
12289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    static final boolean DEBUG_RELEASE = DEBUG || false;
123d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner    static final boolean DEBUG_SAVED_STATE = DEBUG || false;
124cc12f28e5dc6bd027971c995c7aab63dadcc0d35Winson Chung    static final boolean DEBUG_SCREENSHOTS = DEBUG || false;
12530bd3bb77b8bd1ac70723bcf7f1017fc40ea89b2Craig Mautner    static final boolean DEBUG_STATES = DEBUG || false;
12689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    static final boolean DEBUG_VISIBLE_BEHIND = DEBUG || false;
1272420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1282219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
129270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
130f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** How long we wait until giving up on the last activity telling us it is idle. */
131f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_TIMEOUT = 10*1000;
132f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1330eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** How long we can hold the sleep wake lock before giving up. */
1340eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT = 5*1000;
1350eea92c67b292b005c152641a12b920fe145826cCraig Mautner
1367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // How long we can hold the launch wake lock before giving up.
1377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT = 10*1000;
1387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
13905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG;
14005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1;
14105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2;
1420eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3;
1437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4;
1444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5;
1454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6;
1464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7;
147e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner    static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8;
1485286d3ff47135976d66d67888cadca52ef2ab244justinzhang    static final int LOCK_TASK_START_MSG = FIRST_SUPERVISOR_STACK_MSG + 9;
1495286d3ff47135976d66d67888cadca52ef2ab244justinzhang    static final int LOCK_TASK_END_MSG = FIRST_SUPERVISOR_STACK_MSG + 10;
150b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner    static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 11;
1514c07d0246fb37e6a77be2c5cdcdf55a989b90f75Craig Mautner    static final int CONTAINER_TASK_LIST_EMPTY_TIMEOUT = FIRST_SUPERVISOR_STACK_MSG + 12;
152bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_STACK_MSG + 13;
1534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
1544504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner    private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay";
1557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
15662515beee67307d8859beec521b7baedfa54b2b5Jason Monk    private static final String LOCK_TASK_TAG = "Lock-to-App";
15762515beee67307d8859beec521b7baedfa54b2b5Jason Monk
1585286d3ff47135976d66d67888cadca52ef2ab244justinzhang    /** Status Bar Service **/
1595286d3ff47135976d66d67888cadca52ef2ab244justinzhang    private IBinder mToken = new Binder();
1605286d3ff47135976d66d67888cadca52ef2ab244justinzhang    private IStatusBarService mStatusBarService;
16135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk    private IDevicePolicyManager mDevicePolicyManager;
1625286d3ff47135976d66d67888cadca52ef2ab244justinzhang
1637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // For debugging to make sure the caller when acquiring/releasing our
1647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // wake lock is the system process.
1657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final boolean VALIDATE_WAKE_LOCK_CALLER = false;
166f333327782e14688e1c198c1192172d51308e90bCraig Mautner
167270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
168270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
169ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ActivityStackSupervisorHandler mHandler;
170ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
171ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** Short cut */
172ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    WindowManagerService mWindowManager;
1734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    DisplayManager mDisplayManager;
174ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
1758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
176d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner    private int mLastStackId = HOME_STACK_ID;
1778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
1798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
1808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
1818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1822420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
1832420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
1842420ead0326bfd2587da6231be419e758dba1930Craig Mautner
185e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner    /** The stack containing the launcher app. Assumed to always be attached to
186e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner     * Display.DEFAULT_DISPLAY. */
1872219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
18820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
189e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner    /** The stack currently receiving input or launching the next activity. */
19029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    private ActivityStack mFocusedStack;
1918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** If this is the same as mFocusedStack then the activity on the top of the focused stack has
1934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner     * been resumed. If stacks are changing position this will hold the old stack until the new
194e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner     * stack becomes resumed after which it will be set to mFocusedStack. */
1954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    private ActivityStack mLastFocusedStack;
196de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
197de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are waiting for a new activity to become visible before completing
198de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * whatever operation they are supposed to do. */
199de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();
200de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
201ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next visible activity. */
202ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
203ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
204ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
205ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next launched activity. */
206ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
207ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
208ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
209de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are ready to be stopped, but waiting for the next activity to
210de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * settle down before doing so. */
211de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();
212de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
213f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of activities that are ready to be finished, but waiting for the previous activity to
214f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * settle down before doing so.  It contains ActivityRecord objects. */
215f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();
216f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2170eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** List of activities that are in the process of going to sleep. */
2180eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>();
2190eea92c67b292b005c152641a12b920fe145826cCraig Mautner
220f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** Used on user changes */
221f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>();
222f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2231a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    /** Used to queue up any background users being started */
2241a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    final ArrayList<UserStartedState> mStartingBackgroundUsers = new ArrayList<UserStartedState>();
2251a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani
226de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity
227de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * is being brought in front of us. */
228de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean mUserLeaving = false;
229de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2300eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** Set when we have taken too long waiting to go to sleep. */
2310eea92c67b292b005c152641a12b920fe145826cCraig Mautner    boolean mSleepTimeout = false;
2320eea92c67b292b005c152641a12b920fe145826cCraig Mautner
23358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima    /** Indicates if we are running on a Leanback-only (TV) device. Only initialized after
23458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima     * setWindowManager is called. **/
23558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima    private boolean mLeanbackOnlyDevice;
23658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
2370eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /**
2387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * We don't want to allow the device to go to sleep while in the process
2397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * of launching an activity.  This is primarily to allow alarm intent
2407ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * receivers to launch an activity and get that to run before the device
2417ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * goes back to sleep.
2427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     */
2432c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    PowerManager.WakeLock mLaunchingActivity;
2447ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2457ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    /**
2460eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * Set when the system is going to sleep, until we have
2470eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * successfully paused the current activity and released our wake lock.
2480eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * At that point the system is allowed to actually sleep.
2490eea92c67b292b005c152641a12b920fe145826cCraig Mautner     */
2502c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    PowerManager.WakeLock mGoingToSleep;
2510eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2524f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner    /** Stack id of the front stack when user switched, indexed by userId. */
2534f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner    SparseIntArray mUserStackInFront = new SparseIntArray(2);
25493529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
2554504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner    // TODO: Add listener for removal of references.
2564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
257d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner    private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>();
2584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
2594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** Mapping from displayId to display current state */
260f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    private final SparseArray<ActivityDisplay> mActivityDisplays =
261f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            new SparseArray<ActivityDisplay>();
2624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
263ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown    InputManagerInternal mInputManagerInternal;
264ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown
265aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    /** If non-null then the task specified remains in front and no other tasks may be started
266aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner     * until the task exits or #stopLockTaskMode() is called. */
267d7b8621bde44857ebb07130693a00f5f777887d4Jason Monk    TaskRecord mLockTaskModeTask;
268a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk    /** Whether lock task has been entered by an authorized app and cannot
269a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk     * be exited. */
270a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk    private boolean mLockTaskIsLocked;
27162515beee67307d8859beec521b7baedfa54b2b5Jason Monk    /**
27262515beee67307d8859beec521b7baedfa54b2b5Jason Monk     * Notifies the user when entering/exiting lock-task.
27362515beee67307d8859beec521b7baedfa54b2b5Jason Monk     */
27462515beee67307d8859beec521b7baedfa54b2b5Jason Monk    private LockTaskNotify mLockTaskNotify;
275aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
276ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    final ArrayList<PendingActivityLaunch> mPendingActivityLaunches
277ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            = new ArrayList<PendingActivityLaunch>();
278ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
27942d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner    /** Used to keep resumeTopActivityLocked() from being entered recursively */
28042d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner    boolean inResumeTopActivity;
28142d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner
282ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    /**
283ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner     * Description of a request to start a new activity, which has been held
284ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner     * due to app switches being disabled.
285ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner     */
286ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    static class PendingActivityLaunch {
287ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        final ActivityRecord r;
288ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        final ActivityRecord sourceRecord;
289ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        final int startFlags;
290ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        final ActivityStack stack;
291ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
292ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord,
293ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                int _startFlags, ActivityStack _stack) {
294ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            r = _r;
295ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            sourceRecord = _sourceRecord;
296ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            startFlags = _startFlags;
297ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            stack = _stack;
298ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        }
299ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    }
300ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
3014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service) {
302270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
3032c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown        mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper());
3042c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
3052c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
3062c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
3072c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
3082c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize our wakelocks afterwards.
3092c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
3102c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    void initPowerManagement() {
3114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE);
3120eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
3137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity =
3147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
3157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.setReferenceCounted(false);
3162219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
3172219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
3185286d3ff47135976d66d67888cadca52ef2ab244justinzhang    // This function returns a IStatusBarService. The value is from ServiceManager.
3195286d3ff47135976d66d67888cadca52ef2ab244justinzhang    // getService and is cached.
3205286d3ff47135976d66d67888cadca52ef2ab244justinzhang    private IStatusBarService getStatusBarService() {
3215286d3ff47135976d66d67888cadca52ef2ab244justinzhang        synchronized (mService) {
3225286d3ff47135976d66d67888cadca52ef2ab244justinzhang            if (mStatusBarService == null) {
3235286d3ff47135976d66d67888cadca52ef2ab244justinzhang                mStatusBarService = IStatusBarService.Stub.asInterface(
3245286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    ServiceManager.checkService(Context.STATUS_BAR_SERVICE));
3255286d3ff47135976d66d67888cadca52ef2ab244justinzhang                if (mStatusBarService == null) {
3265286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    Slog.w("StatusBarManager", "warning: no STATUS_BAR_SERVICE");
3275286d3ff47135976d66d67888cadca52ef2ab244justinzhang                }
3285286d3ff47135976d66d67888cadca52ef2ab244justinzhang            }
3295286d3ff47135976d66d67888cadca52ef2ab244justinzhang            return mStatusBarService;
3305286d3ff47135976d66d67888cadca52ef2ab244justinzhang        }
3315286d3ff47135976d66d67888cadca52ef2ab244justinzhang    }
3325286d3ff47135976d66d67888cadca52ef2ab244justinzhang
33335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk    private IDevicePolicyManager getDevicePolicyManager() {
33435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk        synchronized (mService) {
33535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk            if (mDevicePolicyManager == null) {
33635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                mDevicePolicyManager = IDevicePolicyManager.Stub.asInterface(
33735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                    ServiceManager.checkService(Context.DEVICE_POLICY_SERVICE));
33835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                if (mDevicePolicyManager == null) {
33935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                    Slog.w(TAG, "warning: no DEVICE_POLICY_SERVICE");
34035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                }
34135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk            }
34235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk            return mDevicePolicyManager;
34335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk        }
34435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk    }
34535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk
346ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void setWindowManager(WindowManagerService wm) {
3474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
3484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mWindowManager = wm;
3494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplayManager =
3514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    (DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
3524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplayManager.registerDisplayListener(this, null);
3534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            Display[] displays = mDisplayManager.getDisplays();
3554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) {
3564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final int displayId = displays[displayNdx].getDisplayId();
357e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
3581a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                if (activityDisplay.mDisplay == null) {
3591a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                    throw new IllegalStateException("Default Display does not exist");
3601a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                }
361e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplays.put(displayId, activityDisplay);
3624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
3634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
364f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            createStackOnDisplay(HOME_STACK_ID, Display.DEFAULT_DISPLAY);
3654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mHomeStack = mFocusedStack = mLastFocusedStack = getStack(HOME_STACK_ID);
366ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown
367ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
36858e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
36958e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima            // Initialize this here, now that we can get a valid reference to PackageManager.
37058e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima            mLeanbackOnlyDevice = isLeanbackOnlyDevice();
3714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
372270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
373270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
3748de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi    void notifyActivityDrawnForKeyguard() {
3755314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner        if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen("");
3768de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        mWindowManager.notifyActivityDrawnForKeyguard();
377270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
378270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
379ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    ActivityStack getFocusedStack() {
3804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return mFocusedStack;
38120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
38220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
383de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getLastStack() {
3844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return mLastFocusedStack;
3852219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
3862219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
3874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    // TODO: Split into two methods isFrontStack for any visible stack and isFrontmostStack for the
3884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    // top of all visible stacks.
389de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean isFrontStack(ActivityStack stack) {
390df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
391df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        if (parent != null) {
392df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            stack = parent.task.stack;
393df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        }
394e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ArrayList<ActivityStack> stacks = stack.mStacks;
3954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (stacks != null && !stacks.isEmpty()) {
3964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return stack == stacks.get(stacks.size() - 1);
3974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
3984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return false;
39920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
40020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
401299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner    void moveHomeStack(boolean toFront, String reason) {
402e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ArrayList<ActivityStack> stacks = mHomeStack.mStacks;
403de313753d0fd0173d0558518d9a410fdc0127c76Craig Mautner        final int topNdx = stacks.size() - 1;
4044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (topNdx <= 0) {
4054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return;
4064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
4074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ActivityStack topStack = stacks.get(topNdx);
4084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final boolean homeInFront = topStack == mHomeStack;
4094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (homeInFront != toFront) {
4104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mLastFocusedStack = topStack;
4114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            stacks.remove(mHomeStack);
4124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            stacks.add(toFront ? topNdx : 0, mHomeStack);
4134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mFocusedStack = stacks.get(topNdx);
4144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: topStack old=" + topStack + " new="
4154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    + mFocusedStack);
416de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
417de313753d0fd0173d0558518d9a410fdc0127c76Craig Mautner        EventLog.writeEvent(EventLogTags.AM_HOME_STACK_MOVED,
418de313753d0fd0173d0558518d9a410fdc0127c76Craig Mautner                mCurrentUser, toFront ? 1 : 0, stacks.get(topNdx).getStackId(),
419299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner                mFocusedStack == null ? -1 : mFocusedStack.getStackId(), reason);
420de313753d0fd0173d0558518d9a410fdc0127c76Craig Mautner
421f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        if (mService.mBooting || !mService.mBooted) {
422f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner            final ActivityRecord r = topRunningActivityLocked();
423f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner            if (r != null && r.idle) {
424f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner                checkFinishBootingLocked();
425f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner            }
426f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        }
427de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
428de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
429299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner    void moveHomeStackTaskToTop(int homeStackTaskType, String reason) {
43084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
43184984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            mWindowManager.showRecentApps();
43284984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            return;
43384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        }
434299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner        moveHomeStack(true, reason);
43584984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        mHomeStack.moveHomeStackTaskToTop(homeStackTaskType);
4368e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    }
4378e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner
438299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner    boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev, String reason) {
4397622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn        if (!mService.mBooting && !mService.mBooted) {
4407622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn            // Not ready yet!
4417622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn            return false;
4427622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn        }
4437622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn
44484984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
44584984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            mWindowManager.showRecentApps();
44684984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            return false;
44784984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        }
448299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner        moveHomeStackTaskToTop(homeStackTaskType, reason);
44969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (prev != null) {
45084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
45169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
45284984faf530e525b066e28710d0f9beb32142ec5Craig Mautner
453a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner        ActivityRecord r = mHomeStack.topRunningActivityLocked(null);
45484984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        // if (r != null && (r.isHomeActivity() || r.isRecentsActivity())) {
455719e621186adc1ba5a365bddea01cbe73bb26b02Craig Mautner        if (r != null && r.isHomeActivity()) {
456299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner            mService.setFocusedActivityLocked(r, reason);
45705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            return resumeTopActivitiesLocked(mHomeStack, prev, null);
45869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
459299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner        return mService.startHomeActivityLocked(mCurrentUser, reason);
46069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    }
46169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner
4628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
463e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        int numDisplays = mActivityDisplays.size();
4644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
465e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
4664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
4674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ActivityStack stack = stacks.get(stackNdx);
4684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                TaskRecord task = stack.taskForIdLocked(id);
4694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (task != null) {
4704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return task;
4714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
4728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
4738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
4747de0535701351d76b634ab18577269e8130749eaWale Ogunwale
4757de0535701351d76b634ab18577269e8130749eaWale Ogunwale        // Don't give up! Look in recents.
4767de0535701351d76b634ab18577269e8130749eaWale Ogunwale        if (DEBUG_RECENTS) Slog.v(TAG, "Looking for task id=" + id + " in recents");
4777de0535701351d76b634ab18577269e8130749eaWale Ogunwale        TaskRecord task = mService.recentTaskForIdLocked(id);
4787de0535701351d76b634ab18577269e8130749eaWale Ogunwale        if (task == null) {
4797de0535701351d76b634ab18577269e8130749eaWale Ogunwale            if (DEBUG_RECENTS) Slog.d(TAG, "\tDidn't find task id=" + id + " in recents");
4807de0535701351d76b634ab18577269e8130749eaWale Ogunwale            return null;
4817de0535701351d76b634ab18577269e8130749eaWale Ogunwale        }
4827de0535701351d76b634ab18577269e8130749eaWale Ogunwale
4837de0535701351d76b634ab18577269e8130749eaWale Ogunwale        if (!restoreRecentTaskLocked(task)) {
4847de0535701351d76b634ab18577269e8130749eaWale Ogunwale            if (DEBUG_RECENTS) Slog.w(TAG, "Couldn't restore task id=" + id + " found in recents");
4857de0535701351d76b634ab18577269e8130749eaWale Ogunwale            return null;
4867de0535701351d76b634ab18577269e8130749eaWale Ogunwale        }
4877de0535701351d76b634ab18577269e8130749eaWale Ogunwale        if (DEBUG_RECENTS) Slog.w(TAG, "Restored task id=" + id + " from in recents");
4887de0535701351d76b634ab18577269e8130749eaWale Ogunwale        return task;
4898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
4908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
4916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    ActivityRecord isInAnyStackLocked(IBinder token) {
492e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        int numDisplays = mActivityDisplays.size();
4934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
494e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
4954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
4964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord r = stacks.get(stackNdx).isInStackLocked(token);
4974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (r != null) {
4984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return r;
4994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
5006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
5016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
5026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return null;
5036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
5046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
505ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    void setNextTaskId(int taskId) {
506ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (taskId > mCurTaskId) {
507ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            mCurTaskId = taskId;
508ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
509ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
510ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
5118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
5128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
5138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
5148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
5158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
5168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
5178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
5188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
5198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
521de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityRecord resumedAppLocked() {
522ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        ActivityStack stack = getFocusedStack();
523ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (stack == null) {
524ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return null;
525ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
526de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityRecord resumedActivity = stack.mResumedActivity;
527de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (resumedActivity == null || resumedActivity.app == null) {
528de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            resumedActivity = stack.mPausingActivity;
529de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (resumedActivity == null || resumedActivity.app == null) {
530de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resumedActivity = stack.topRunningActivityLocked(null);
531de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
532de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
533de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return resumedActivity;
534de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
535de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
536ff072725e39b8c6928d6ca2d7e263d7d081a2288Dianne Hackborn    boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
53720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
5384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        boolean didSomething = false;
539e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
540e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
5414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
5434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (!isFrontStack(stack)) {
5444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    continue;
5454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
5464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ActivityRecord hr = stack.topRunningActivityLocked(null);
5474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (hr != null) {
5484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (hr.app == null && app.uid == hr.info.applicationInfo.uid
5494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            && processName.equals(hr.processName)) {
5504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        try {
5512c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount                            if (realStartActivityLocked(hr, app, true, true)) {
5524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                                didSomething = true;
5534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            }
554ff072725e39b8c6928d6ca2d7e263d7d081a2288Dianne Hackborn                        } catch (RemoteException e) {
5554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            Slog.w(TAG, "Exception in new application when starting activity "
5564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                                  + hr.intent.getComponent().flattenToShortString(), e);
5574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            throw e;
55820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
55920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
56020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
56120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
56220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
563b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (!didSomething) {
564b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
565b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        }
56620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
56720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
56820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
56920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
570e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
571e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
5724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
57434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                if (!isFrontStack(stack) || stack.numActivities() == 0) {
5754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    continue;
5764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
5774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord resumedActivity = stack.mResumedActivity;
5784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (resumedActivity == null || !resumedActivity.idle) {
57934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    if (DEBUG_STATES) Slog.d(TAG, "allResumedActivitiesIdle: stack="
58034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                             + stack.mStackId + " " + resumedActivity + " not idle");
5814a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return false;
5824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
58320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
58420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
58520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
58620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
58720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
588de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesComplete() {
589e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
590e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
5914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
5934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
5944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    final ActivityRecord r = stack.mResumedActivity;
5954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (r != null && r.state != ActivityState.RESUMED) {
5964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        return false;
5974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
598de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
599de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
600de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
601de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        // TODO: Not sure if this should check if all Paused are complete too.
6024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (DEBUG_STACK) Slog.d(TAG,
6034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                "allResumedActivitiesComplete: mLastFocusedStack changing from=" +
6044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                mLastFocusedStack + " to=" + mFocusedStack);
6054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mLastFocusedStack = mFocusedStack;
606de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
607de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
608de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
609de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesVisible() {
610e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
611e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
6124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
6134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
6144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord r = stack.mResumedActivity;
6154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (r != null && (!r.nowVisible || r.waitingVisible)) {
6164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return false;
6174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
618de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
619de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
620de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
621de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
622de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
6232acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner    /**
6242acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * Pause all activities in either all of the stacks or just the back stacks.
6252acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving().
6262acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @return true if any activity was paused as a result of this call.
6272acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     */
628a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn    boolean pauseBackStacks(boolean userLeaving, boolean resuming, boolean dontWait) {
629cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        boolean someActivityPaused = false;
630e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
631e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
6324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
6334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
6344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (!isFrontStack(stack) && stack.mResumedActivity != null) {
6354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack +
6364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            " mResumedActivity=" + stack.mResumedActivity);
637a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    someActivityPaused |= stack.startPausingLocked(userLeaving, false, resuming,
638a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                            dontWait);
6394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
640cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
641cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
642cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        return someActivityPaused;
643cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
644cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
645de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allPausedActivitiesComplete() {
646ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        boolean pausing = true;
647e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
648e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
6494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
6504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
6514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord r = stack.mPausingActivity;
6524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (r != null && r.state != ActivityState.PAUSED
6534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        && r.state != ActivityState.STOPPED
6544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        && r.state != ActivityState.STOPPING) {
6554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (DEBUG_STATES) {
6564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state);
6574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        pausing = false;
6584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    } else {
6594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        return false;
6604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
661ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
662de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
663de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
664ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return pausing;
665de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
666de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
667a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn    void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping,
668a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            boolean resuming, boolean dontWait) {
6698a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock        // TODO: Put all stacks in supervisor and iterate through them instead.
670df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
671df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
672df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
673df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                final ActivityStack stack = stacks.get(stackNdx);
674df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                if (stack.mResumedActivity != null &&
675df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                        stack.mActivityContainer.mParentActivity == parent) {
676a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    stack.startPausingLocked(userLeaving, uiSleeping, resuming, dontWait);
677df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                }
678df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            }
679df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        }
680df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner    }
681df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
682ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityVisibleLocked(ActivityRecord r) {
6836cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        sendWaitingVisibleReportLocked(r);
6846cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn    }
6856cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn
6866cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn    void sendWaitingVisibleReportLocked(ActivityRecord r) {
6876cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        boolean changed = false;
688858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
689ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            WaitResult w = mWaitingActivityVisible.get(i);
6906cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn            if (w.who == null) {
6916cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                changed = true;
6926cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.timeout = false;
6936cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                if (r != null) {
6946cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                    w.who = new ComponentName(r.info.packageName, r.info.name);
6956cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                }
6966cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
6976cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.thisTime = w.totalTime;
698ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
699ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
7006cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        if (changed) {
7016cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn            mService.notifyAll();
7026cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        }
703ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
704ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
705ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
706ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            long thisTime, long totalTime) {
7076cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        boolean changed = false;
708ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
709c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner            WaitResult w = mWaitingActivityLaunched.remove(i);
7106cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn            if (w.who == null) {
7116cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                changed = true;
7126cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.timeout = timeout;
7136cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                if (r != null) {
7146cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                    w.who = new ComponentName(r.info.packageName, r.info.name);
7156cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                }
7166cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.thisTime = thisTime;
7176cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.totalTime = totalTime;
718ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
719ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
7206cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        if (changed) {
7216cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn            mService.notifyAll();
7226cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        }
723ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
724ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
72529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    ActivityRecord topRunningActivityLocked() {
7261602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        final ActivityStack focusedStack = getFocusedStack();
7271602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        ActivityRecord r = focusedStack.topRunningActivityLocked(null);
7281602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        if (r != null) {
7291602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            return r;
73029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
7311602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner
7324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        // Return to the home stack.
733e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        final ArrayList<ActivityStack> stacks = mHomeStack.mStacks;
7344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
7354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final ActivityStack stack = stacks.get(stackNdx);
736ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (stack != focusedStack && isFrontStack(stack)) {
73729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                r = stack.topRunningActivityLocked(null);
73829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                if (r != null) {
73929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    return r;
74029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                }
74129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
74229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
74329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        return null;
74429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
74529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
74609233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn    void getTasksLocked(int maxNum, List<RunningTaskInfo> list, int callingUid, boolean allowed) {
747c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // Gather all of the running tasks for each stack into runningTaskLists.
7484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<ArrayList<RunningTaskInfo>> runningTaskLists =
7494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                new ArrayList<ArrayList<RunningTaskInfo>>();
750e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        final int numDisplays = mActivityDisplays.size();
7514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
752e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
7534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
7544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
7554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>();
7564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                runningTaskLists.add(stackTaskList);
75709233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn                stack.getTasksLocked(stackTaskList, callingUid, allowed);
75820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
75920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
760c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner
761c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // The lists are already sorted from most recent to oldest. Just pull the most recent off
762c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // each list and add it to list. Stop when all lists are empty or maxNum reached.
763c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        while (maxNum > 0) {
764c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            long mostRecentActiveTime = Long.MIN_VALUE;
765c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            ArrayList<RunningTaskInfo> selectedStackList = null;
7664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numTaskLists = runningTaskLists.size();
7674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numTaskLists; ++stackNdx) {
7684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists.get(stackNdx);
769c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                if (!stackTaskList.isEmpty()) {
770c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    final long lastActiveTime = stackTaskList.get(0).lastActiveTime;
771c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    if (lastActiveTime > mostRecentActiveTime) {
772c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        mostRecentActiveTime = lastActiveTime;
773c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        selectedStackList = stackTaskList;
774c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    }
775c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                }
776c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
777c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            if (selectedStackList != null) {
778c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                list.add(selectedStackList.remove(0));
779c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                --maxNum;
780c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            } else {
781c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                break;
782c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
783c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        }
78420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
78520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
7871b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            ProfilerInfo profilerInfo, int userId) {
78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
79223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
79723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
79823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
79923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
80623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
80723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
80823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
80923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
81023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
81123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
81323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
81423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
81523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
81623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
81723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
81823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
82023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
8221b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            if (profilerInfo != null) {
82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
8241b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo);
82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
82723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
82923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
831299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason) {
832299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner        moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE, reason);
83395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn        startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null,
83495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                0, 0, 0, null, false, null, null, null);
8358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
8368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
83891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            String callingPackage, Intent intent, String resolvedType,
83991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
8401b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            IBinder resultTo, String resultWho, int requestCode, int startFlags,
8411b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            ProfilerInfo profilerInfo, WaitResult outResult, Configuration config,
84289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            Bundle options, int userId, IActivityContainer iContainer, TaskRecord inTask) {
84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
84523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
84623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
84723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
84823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
84923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
85023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
85123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
85223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
85323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
8541b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                profilerInfo, userId);
85523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
856e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityContainer container = (ActivityContainer)iContainer;
85723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
85895465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            final int realCallingPid = Binder.getCallingPid();
85995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            final int realCallingUid = Binder.getCallingUid();
86023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
86123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
86223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
86323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
86495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                callingPid = realCallingPid;
86595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                callingUid = realCallingUid;
86623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
86723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
86823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
86923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
870e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ActivityStack stack;
871e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (container == null || container.mStack.isOnHomeDisplay()) {
872e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                stack = getFocusedStack();
873e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            } else {
874e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                stack = container.mStack;
875e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
876de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            stack.mConfigWillChange = config != null
87723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
87823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
879de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    "Starting activity when config will change = " + stack.mConfigWillChange);
88023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
88123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
88223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
88323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
88423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
88523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
88623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
88723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
88823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
88923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
89023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
89195465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                        int appCallingUid = callingUid;
89223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
89323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
89423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
89595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                                appCallingUid = callerApp.info.uid;
89623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
89723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
89876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                                      + " (pid=" + callingPid + ") when starting: "
89923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
90023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
90123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
90223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
90323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
90423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
90523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
90623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
90795465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                                appCallingUid, userId, null, null, 0, new Intent[] { intent },
90823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
90923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
91023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
91123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
91223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
91323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
91423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
91523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
91623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
91723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
91823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
91923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
92023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
92123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
92223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
92323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
92423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
92523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
92623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
92723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
92823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
92923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
93023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
93123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
93223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
93323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
93423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
93523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
93623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
93723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
93823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
93923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
94023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
94123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
94223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
94323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
94423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
94523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
94623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
94723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
94823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
94923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
95023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
95191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            int res = startActivityLocked(caller, intent, resolvedType, aInfo,
95291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    voiceSession, voiceInteractor, resultTo, resultWho,
95395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                    requestCode, callingPid, callingUid, callingPackage,
95495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                    realCallingPid, realCallingUid, startFlags, options,
95589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    componentSpecified, null, container, inTask);
95623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
95785c11a8831ba9572813f122674b3680ae4d14010Craig Mautner            Binder.restoreCallingIdentity(origId);
95885c11a8831ba9572813f122674b3680ae4d14010Craig Mautner
959de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (stack.mConfigWillChange) {
96023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
96123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
96223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
96323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
96423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
96523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
966de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stack.mConfigWillChange = false;
96723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
96823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
96923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
97023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
97123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
97223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
97323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
97423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
975ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWaitingActivityLaunched.add(outResult);
97623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
97723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
97823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
97923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
98023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
98123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
98223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
983de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityRecord r = stack.topRunningActivityLocked(null);
9846cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                    if (r.nowVisible && r.state == ActivityState.RESUMED) {
98523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
98623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
98723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
98823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
98923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
99023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
991ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                        mWaitingActivityVisible.add(outResult);
99223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
99323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
99423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
99523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
99623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
99723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
99823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
99923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
100023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
100123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
100223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
100323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
100423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
100523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
100623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
100723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
100823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
100923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
101023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
101123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
101223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
101323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
101423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
101523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
101623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
101723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
101823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
101923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
102023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
102123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
102223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
102323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
102423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
102523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
102623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
102723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
102823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
102923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
103023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
103123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
103276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                ActivityRecord[] outActivity = new ActivityRecord[1];
103323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
103423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
103523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
103623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
103723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
103823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
103923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
104023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
104123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
104223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
104323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
104423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
104523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
104623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
104723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
104823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
104923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
10501b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 0, null, userId);
105123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
105223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
105323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
105423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
105523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
105623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
105723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
105823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
105923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
106023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
106123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
106223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
106323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
106423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
106523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
106623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
10676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
106895465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                            aInfo, null, null, resultTo, null, -1, callingPid, callingUid,
106995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                            callingPackage, callingPid, callingUid,
107089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                            0, theseOptions, componentSpecified, outActivity, null, null);
107123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
107223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
107323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
107423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
107523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
107623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
107723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
107823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
107923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
108023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
108123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
108223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
108323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
108423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
10852420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
10862c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount            ProcessRecord app, boolean andResume, boolean checkConfig)
10872420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
10882420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10892420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
1090a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner        if (false) Slog.d(TAG, "realStartActivity: setting app visibility true");
1091ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager.setAppVisibility(r.appToken, true);
10922420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10932420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
10942420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
10952420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10962420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
10972420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
10982420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
10992420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
11002420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
11012420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
11022420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
1103ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            Configuration config = mWindowManager.updateOrientationFromAppTokens(
11042420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
11052420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
11062420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
11072420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
11082420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11092420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
11102420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
11112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
11122420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
11132420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11142420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
11152420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11162420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
11172420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
11182420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
11192420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
1120db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateLruProcessLocked(app, true, null);
1121db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateOomAdjLocked();
11222420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11232420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
11242420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
11252420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
11262420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
11272420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11282420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
112985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn            List<ReferrerIntent> newIntents = null;
11302420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
11312420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
11322420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
11332420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11342420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
11352420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
11362420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
11372420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
11382420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
11392420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
11402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
11412420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
11422420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
1143ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (r.isHomeActivity() && r.isNotResolverActivity()) {
11444ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                // Home process is the root process of the task.
11454ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                mService.mHomeProcess = r.task.mActivities.get(0).app;
11462420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11472420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
11482420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
11492420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
11502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
11512420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
11522420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
11532420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
11542420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
11552420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
11562420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
11572420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
11582420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
11592420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
11602420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11612420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
11622420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
11632420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
11642420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
11652420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
11662420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
11672420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
11682420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
11692420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
11702420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
11712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
11722420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
11732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
11742420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
11752420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
1176cfbe9be5b3b701d95fb24fa0f7c8d9be43eec776Adam Powell
11771b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            ProfilerInfo profilerInfo = profileFile != null
11781b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    ? new ProfilerInfo(profileFile, profileFd, mService.mSamplingInterval,
11791b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    mService.mAutoStopProfiler) : null;
1180a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);
11812420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
11821b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
118385d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    r.compat, r.launchedFromPackage, r.task.voiceInteractor, app.repProcState,
118485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    r.icicle, r.persistentState, results, newIntents, !andResume,
118585d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    mService.isNextTransitionForward(), profilerInfo);
11862420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11872420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
11882420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
11892420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
11902420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
11912420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
11922420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
11932420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
11942420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
11952420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
11962420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
11972420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
11982420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
11992420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
12002420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
12012420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
12022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
12032420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
12042420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
12052420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
12062420ead0326bfd2587da6231be419e758dba1930Craig Mautner
12072420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
12082420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
12092420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
12102420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
12112420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
12122420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
12132420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
12144a8dddbf18fedb33bb2c725db489669a141e1d73Craig Mautner                mService.appDiedLocked(app);
12152420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
12162420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
12172420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
12182420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
12192420ead0326bfd2587da6231be419e758dba1930Craig Mautner
12202420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
12212420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
12222420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
12232420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
12242420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
12252420ead0326bfd2587da6231be419e758dba1930Craig Mautner
12262420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
12272420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
12282420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
12292420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
12302420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
12312420ead0326bfd2587da6231be419e758dba1930Craig Mautner
12322420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
12332420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
12342420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
12352420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
12362420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
12372420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
12382420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
12392420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
12402420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
12412420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
12422420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
12432420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
12442420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
12452420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
12462420ead0326bfd2587da6231be419e758dba1930Craig Mautner
12472420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
12482420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
12492420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
12502420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
1251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (isFrontStack(stack)) {
12522420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
12532420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
12542420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1255465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn        // Update any services we are bound to that might care about whether
1256465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn        // their client may have activities.
1257465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn        mService.mServices.updateServiceConnectionActivitiesLocked(r.app);
1258465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn
12592420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
12602420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
12612420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1262e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
12632c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount            boolean andResume, boolean checkConfig) {
1264e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
1265e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
12663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                r.info.applicationInfo.uid, true);
1267e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1268e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
1269e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1270e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
1271e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
1272237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
1273237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        || !"android".equals(r.info.packageName)) {
1274237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // Don't add this if it is a platform component that is marked
1275237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // to run in multiple processes, because this is actually
1276237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // part of the framework so doesn't make sense to track as a
1277237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // separate apk in the process.
1278f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
1279f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            mService.mProcessStats);
1280237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                }
12812c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount                realStartActivityLocked(r, app, andResume, checkConfig);
1282e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
1283e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
1284e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
1285e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
1286e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
1287e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1288e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
1289e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
1290e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
1291e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1292e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
12933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                "activity", r.intent.getComponent(), false, false, true);
1294e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
1295e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
12966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
129791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Intent intent, String resolvedType, ActivityInfo aInfo,
129891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
129991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IBinder resultTo, String resultWho, int requestCode,
130095465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            int callingPid, int callingUid, String callingPackage,
130195465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            int realCallingPid, int realCallingUid, int startFlags, Bundle options,
130289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container,
130389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            TaskRecord inTask) {
13046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
13056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
13076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
13086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
13096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
13106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
13116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
13126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
13136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
13146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
13156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
13166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
13176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
13216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
13226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
132302a4aa261c28df2466234106d61282289276b462Craig Mautner                    + "} from uid " + callingUid
13249ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                    + " on display " + (container == null ? (mFocusedStack == null ?
13259ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                            Display.DEFAULT_DISPLAY : mFocusedStack.mDisplayId) :
13269ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                            (container.mActivityDisplay == null ? Display.DEFAULT_DISPLAY :
13279ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                                    container.mActivityDisplay.mDisplayId)));
13286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
13316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
13326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
13336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
13346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
13356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
13366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
13376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
13386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
13396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
13406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
134391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final int launchFlags = intent.getFlags();
13446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
134595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) {
13466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
13476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
13486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
13496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
13506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
13516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
13536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
13546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
13556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
13566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
13571b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                resultRecord.removeResultsLocked(sourceRecord, resultWho, requestCode);
13586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13593026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn            if (sourceRecord.launchedFromUid == callingUid) {
13603026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // The new activity is being launched from the same uid as the previous
13613026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // activity in the flow, and asking to forward its result back to the
13623026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // previous.  In this case the activity is serving as a trampoline between
13633026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // the two, so we also want to update its launchedFromPackage to be the
13643026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // same as the previous activity.  Note that this is safe, since we know
13653026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // these two packages come from the same uid; the caller could just as
13663026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // well have supplied that same package name itself.  This specifially
13673026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // deals with the case of an intent picker/chooser being launched in the app
13683026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // flow to redirect to an activity picked by the user, where we want the final
13693026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // activity to consider it to have been launched by the previous app activity.
13703026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                callingPackage = sourceRecord.launchedFromPackage;
13713026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn            }
13726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
13756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
13766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
13776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
13786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
13816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
13826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
13836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
13846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
138691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (err == ActivityManager.START_SUCCESS && sourceRecord != null
138791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                && sourceRecord.task.voiceSession != null) {
138891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // If this activity is being launched as part of a voice session, we need
138991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // to ensure that it is safe to do so.  If the upcoming activity will also
139091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // be part of the voice session, we can only launch it if it has explicitly
139191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // said it supports the VOICE category, or it is a part of the calling app.
1392f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
139391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) {
139491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                try {
139595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                    if (!AppGlobals.getPackageManager().activitySupportsIntent(
139695465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                            intent.getComponent(), intent, resolvedType)) {
139791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
139891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    }
139991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                } catch (RemoteException e) {
140091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
140191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                }
140291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
140391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
140491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
140591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (err == ActivityManager.START_SUCCESS && voiceSession != null) {
140691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // If the caller is starting a new voice session, just make sure the target
140791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // is actually allowing it to run this way.
140891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
140991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(),
141091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        intent, resolvedType)) {
141191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
141291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                }
141391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
141491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
141591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
141691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
141791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
1418cd5d198d7e852bc68871a279afbaa1b94e86a023louis_chang        final ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
1419cd5d198d7e852bc68871a279afbaa1b94e86a023louis_chang
14206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
14216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
14226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
14236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
14246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
14256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
14276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
14286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
14306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
14316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
14326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
14336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
14346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
14356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
14366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
14376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
14386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
14396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
14416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
14426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
14436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
14446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
14456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
14466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
14476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
14486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
14496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
14506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
14516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
14536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
14546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1456dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
1457b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver                callingPid, resolvedType, aInfo.applicationInfo);
14585e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver
14596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
14606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
14616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
14626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
14636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
14645e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                abort |= !mService.mController.activityStarting(watchIntent,
14656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
14666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
14676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
14686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14695e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        }
14706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
14715e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        if (abort) {
14725e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            if (resultRecord != null) {
14735e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
14746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
14756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14765e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // We pretend to the caller that it was really started, but
14775e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // they will just get a cancel result.
14785e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            ActivityOptions.abort(options);
14795e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            return ActivityManager.START_SUCCESS;
14806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
14826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
1483e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho,
1484233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner                requestCode, componentSpecified, this, container, options);
14856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
14866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
14876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1489ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = getFocusedStack();
149091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (voiceSession == null && (stack.mResumedActivity == null
149191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                || stack.mResumedActivity.info.applicationInfo.uid != callingUid)) {
149295465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid,
149395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                    realCallingPid, realCallingUid, "Activity start")) {
14946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
1495de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, stack);
1496ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                mPendingActivityLaunches.add(pal);
14976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
14986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
14996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
15006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
15016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
15026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
15036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
15046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
15056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
15066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
15076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
15086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
15096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
15106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
15116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
15126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1513ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        doPendingActivityLaunchesLocked(false);
15146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
151591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor,
151689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                startFlags, true, options, inTask);
151710385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner
15188de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        if (err < 0) {
151910385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner            // If someone asked to have the keyguard dismissed on the next
15206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
15216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
15226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
15238de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi            notifyActivityDrawnForKeyguard();
15246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
15256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
15266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
15276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
15281b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner    ActivityStack adjustStackFocus(ActivityRecord r, boolean newTask) {
15291d001b670e34fe887488047f525a5430154626e1Craig Mautner        final TaskRecord task = r.task;
153058e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
153158e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        // On leanback only devices we should keep all activities in the same stack.
153258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        if (!mLeanbackOnlyDevice &&
153358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima                (r.isApplicationActivity() || (task != null && task.isApplicationTask()))) {
1534ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (task != null) {
1535d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                final ActivityStack taskStack = task.stack;
1536e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                if (taskStack.isOnHomeDisplay()) {
1537e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    if (mFocusedStack != taskStack) {
1538e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                        if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: Setting " +
1539e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                                "focused stack to r=" + r + " task=" + task);
1540e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                        mFocusedStack = taskStack;
1541e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    } else {
1542e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                        if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1543e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                            "adjustStackFocus: Focused stack already=" + mFocusedStack);
1544e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    }
1545858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                }
1546d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                return taskStack;
1547858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1548ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1549e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ActivityContainer container = r.mInitialActivityContainer;
1550e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (container != null) {
1551e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                // The first time put it on the desired stack, after this put on task stack.
1552e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                r.mInitialActivityContainer = null;
1553e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                return container.mStack;
1554e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
1555e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner
15561b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner            if (mFocusedStack != mHomeStack && (!newTask ||
15571b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                    mFocusedStack.mActivityContainer.isEligibleForNewTasks())) {
1558ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1559ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        "adjustStackFocus: Have a focused stack=" + mFocusedStack);
1560ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                return mFocusedStack;
1561de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
1562ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1563e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks;
1564e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1565e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ActivityStack stack = homeDisplayStacks.get(stackNdx);
1566e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                if (!stack.isHomeStack()) {
1567e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1568e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                            "adjustStackFocus: Setting focused stack=" + stack);
1569e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    mFocusedStack = stack;
1570e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    return mFocusedStack;
1571ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
15721d001b670e34fe887488047f525a5430154626e1Craig Mautner            }
1573ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
15744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            // Need to create an app stack for this user.
1575f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
1576ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
1577ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    " stackId=" + stackId);
1578ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            mFocusedStack = getStack(stackId);
157929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return mFocusedStack;
1580de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1581de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return mHomeStack;
1582de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
1583de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
1584299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner    void setFocusedStack(ActivityRecord r, String reason) {
15854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (r != null) {
158612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            final TaskRecord task = r.task;
158712ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            boolean isHomeActivity = !r.isApplicationActivity();
158812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            if (!isHomeActivity && task != null) {
158912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                isHomeActivity = !task.isApplicationTask();
159012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            }
159112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            if (!isHomeActivity && task != null) {
159212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                final ActivityRecord parent = task.stack.mActivityContainer.mParentActivity;
159312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                isHomeActivity = parent != null && parent.isHomeActivity();
159412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            }
1595299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner            moveHomeStack(isHomeActivity, reason);
159629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
159729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
159829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
159989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord,
160091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags,
160189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            boolean doResume, Bundle options, TaskRecord inTask) {
16028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final Intent intent = r.intent;
16038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final int callingUid = r.launchedFromUid;
16048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1605d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        // In some flows in to this function, we retrieve the task record and hold on to it
1606d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        // without a lock before calling back in to here...  so the task at this point may
1607d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        // not actually be in recents.  Check for that, and if it isn't in recents just
1608d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        // consider it invalid.
1609d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        if (inTask != null && !inTask.inRecents) {
1610d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            Slog.w(TAG, "Starting activity in task not in recents: " + inTask);
1611d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            inTask = null;
1612d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        }
1613d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
1614ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner        final boolean launchSingleTop = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP;
1615a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner        final boolean launchSingleInstance = r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE;
1616a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner        final boolean launchSingleTask = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK;
16178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1618a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner        int launchFlags = intent.getFlags();
1619f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 &&
1620a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                (launchSingleInstance || launchSingleTask)) {
1621f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // We have a conflict between the Intent and the Activity manifest, manifest wins.
1622f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " +
1623f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    "\"singleInstance\" or \"singleTask\"");
1624f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            launchFlags &=
1625f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    ~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
1626f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        } else {
1627f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            switch (r.info.documentLaunchMode) {
1628f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                case ActivityInfo.DOCUMENT_LAUNCH_NONE:
1629f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    break;
1630f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING:
1631f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
1632f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    break;
1633f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS:
1634f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
1635f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    break;
1636f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                case ActivityInfo.DOCUMENT_LAUNCH_NEVER:
1637f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    launchFlags &= ~Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
1638f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    break;
1639f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            }
1640f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        }
1641bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner
164289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        final boolean launchTaskBehind = r.mLaunchTaskBehind
164389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                && !launchSingleTask && !launchSingleInstance
164489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                && (launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0;
1645f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner
1646f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1647f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // For whatever reason this activity is being launched into a new
1648f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // task...  yet the caller has requested a result back.  Well, that
1649f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // is pretty messed up, so instead immediately send back a cancel
1650f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // and let the new task continue launched as normal without a
1651f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // dependency on its originator.
1652f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
1653f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            r.resultTo.task.stack.sendActivityResultLocked(-1,
1654f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    r.resultTo, r.resultWho, r.requestCode,
1655f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    Activity.RESULT_CANCELED, null);
1656f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            r.resultTo = null;
1657f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        }
1658f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner
1659f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && r.resultTo == null) {
1660f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1661f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        }
1662f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner
166389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // If we are actually going to launch in to a new task, there are some cases where
166489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // we further want to do multiple task.
166589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
166689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (launchTaskBehind
166789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    || r.info.documentLaunchMode == ActivityInfo.DOCUMENT_LAUNCH_ALWAYS) {
166889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
166989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
167089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
167189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // We'll invoke onUserLeaving before onPause only if the launching
16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // activity did not explicitly state that this is an automated launch.
1674a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner        mUserLeaving = (launchFlags & Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
1675de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving);
16768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the caller has asked not to resume at this point, we make note
16788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // of this in the record so that we can skip it when trying to find
16798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // the top running activity.
16808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (!doResume) {
16818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.delayedResume = true;
16828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1684a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner        ActivityRecord notTop =
1685a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner                (launchFlags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
16868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the onlyIfNeeded flag is set, then we can do this if the activity
16888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // being launched is the same as the one making the call...  or, as
16898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // a special case, if we do not know the caller then we count the
16908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // current top activity as the caller.
16918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
16928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord checkedCaller = sourceRecord;
16938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (checkedCaller == null) {
1694ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop);
16958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!checkedCaller.realActivity.equals(r.realActivity)) {
16978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // Caller is not the same as launcher, so always needed.
16988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
16998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
17008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
17018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean addingToTask = false;
17038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        TaskRecord reuseTask = null;
170489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
170589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // If the caller is not coming from another activity, but has given us an
170689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // explicit task into which they would like us to launch the new activity,
170789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // then let's see about doing that.
1708d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        if (sourceRecord == null && inTask != null && inTask.stack != null) {
1709d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            final Intent baseIntent = inTask.getBaseIntent();
1710d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            final ActivityRecord root = inTask.getRootActivity();
1711d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (baseIntent == null) {
1712d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                ActivityOptions.abort(options);
1713d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                throw new IllegalArgumentException("Launching into task without base intent: "
1714d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        + inTask);
1715d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            }
1716d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
171789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // If this task is empty, then we are adding the first activity -- it
171889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // determines the root, and must be launching as a NEW_TASK.
1719d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (launchSingleInstance || launchSingleTask) {
1720d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                if (!baseIntent.getComponent().equals(r.intent.getComponent())) {
1721d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    ActivityOptions.abort(options);
1722d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    throw new IllegalArgumentException("Trying to launch singleInstance/Task "
1723d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                            + r + " into different task " + inTask);
172489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
1725d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                if (root != null) {
1726d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    ActivityOptions.abort(options);
1727d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    throw new IllegalArgumentException("Caller with inTask " + inTask
1728d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                            + " has root " + root + " but target is singleInstance/Task");
1729d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                }
1730d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            }
1731d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
1732d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // If task is empty, then adopt the interesting intent launch flags in to the
1733d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // activity being started.
1734d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (root == null) {
1735d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                final int flagsOfInterest = Intent.FLAG_ACTIVITY_NEW_TASK
1736d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        | Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT
1737d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS;
1738d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                launchFlags = (launchFlags&~flagsOfInterest)
1739d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        | (baseIntent.getFlags()&flagsOfInterest);
1740d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                intent.setFlags(launchFlags);
174189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                inTask.setIntent(r);
1742962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                addingToTask = true;
174389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
1744962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            // If the task is not empty and the caller is asking to start it as the root
1745962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            // of a new task, then we don't actually want to start this on the task.  We
1746962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            // will bring the task to the front, and possibly give it a new intent.
1747d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            } else if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1748962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                addingToTask = false;
1749962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn
1750962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            } else {
1751962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                addingToTask = true;
175289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
1753962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn
175489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            reuseTask = inTask;
175589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        } else {
175689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            inTask = null;
175789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
175889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
1759a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        if (inTask == null) {
1760a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            if (sourceRecord == null) {
1761a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // This activity is not being started from another...  in this
1762a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // case we -always- start a new task.
1763a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 && inTask == null) {
1764a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
1765a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                            "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
1766a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1767a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                }
1768a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
1769a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // The original activity who is starting us is running as a single
1770a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // instance...  this new activity it is starting must go on its
1771a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // own task.
1772a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1773a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            } else if (launchSingleInstance || launchSingleTask) {
1774a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // The activity being started is a single instance...  it always
1775a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // gets launched into its own task.
1776a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1777a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            }
1778a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        }
1779a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn
1780a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        ActivityInfo newTaskInfo = null;
1781a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        Intent newTaskIntent = null;
1782a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        ActivityStack sourceStack;
1783a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        if (sourceRecord != null) {
1784a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            if (sourceRecord.finishing) {
1785a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // If the source is finishing, we can't further count it as our source.  This
1786a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // is because the task it is associated with may now be empty and on its way out,
1787a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // so we don't want to blindly throw it in to that task.  Instead we will take
1788a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // the NEW_TASK flow and try to find a task for it. But save the task information
1789a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // so it can be used when creating the new task.
1790a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
1791a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    Slog.w(TAG, "startActivity called from finishing " + sourceRecord
1792a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                            + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
1793a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1794a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    newTaskInfo = sourceRecord.info;
1795a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    newTaskIntent = sourceRecord.task.intent;
1796a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                }
1797a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                sourceRecord = null;
1798a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                sourceStack = null;
1799a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            } else {
1800a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                sourceStack = sourceRecord.task.stack;
1801a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            }
1802a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        } else {
1803a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            sourceStack = null;
1804a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        }
1805a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn
1806a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        boolean movedHome = false;
1807a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        ActivityStack targetStack;
1808a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn
1809a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        intent.setFlags(launchFlags);
1810a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn
181189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // We may want to try to place the new activity in to an existing task.  We always
181289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // do this if the target activity is singleTask or singleInstance; we will also do
181389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // this if NEW_TASK has been requested, and there is not an additional qualifier telling
181489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // us to still place it in a new task: multi task, always doc mode, or being asked to
181589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // launch this as a new task behind the current one.
1816d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner        if (((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
1817d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner                (launchFlags & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
1818a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                || launchSingleInstance || launchSingleTask) {
1819d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // If bring to front is requested, and no result is requested and we have not
1820d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // been given an explicit task to launch in to, and
18218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // we can find a task that was started with this same
18228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // component, then instead of launching bring that one to the front.
1823d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (inTask == null && r.resultTo == null) {
18248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // See if there is a task to bring to the front.  If this is
18258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // a SINGLE_INSTANCE activity, there can be one and only one
18268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // instance of it in the history, and it is always in its own
18278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // unique task, so we do a special search.
1828a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                ActivityRecord intentActivity = !launchSingleInstance ?
1829a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                        findTaskLocked(r) : findActivityLocked(intent, r.info);
18308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (intentActivity != null) {
1831aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                    if (isLockTaskModeViolation(intentActivity.task)) {
1832a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk                        showLockTaskToast();
18330175b882b5e021907c307ab0e455bff014ad8784Craig Mautner                        Slog.e(TAG, "startActivityUnchecked: Attempt to violate Lock Task Mode");
1834aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                        return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
1835aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                    }
183629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null) {
183729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        r.task = intentActivity.task;
183829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    }
18398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack = intentActivity.task.stack;
18400f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
18412a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack
18422a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                            + " from " + intentActivity);
1843299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner                    targetStack.moveToFront("intentActivityFound");
18448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (intentActivity.task.intent == null) {
18458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // This task was started because of movement of
18468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the activity based on affinity...  now that we
18478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // are actually launching it, we can assign the
18488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // base intent.
1849fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                        intentActivity.task.setIntent(r);
18508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
18518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the target task is not in the front, then we need
18528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to bring it to the front...  except...  well, with
18538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
18548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to have the same behavior as if a new instance was
18558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // being started, which means not bringing it to the front
18568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // if the caller is not itself in the front.
1857165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    final ActivityStack lastStack = getLastStack();
1858165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    ActivityRecord curTop = lastStack == null?
1859165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                            null : lastStack.topRunningNonDelayedActivityLocked(notTop);
186044f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                    boolean movedToFront = false;
18617504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                    if (curTop != null && (curTop.task != intentActivity.task ||
18627504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                            curTop.task != lastStack.topTask())) {
18638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
1864d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                        if (sourceRecord == null || (sourceStack.topActivity() != null &&
1865d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                                sourceStack.topActivity().task == sourceRecord.task)) {
18668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // We really do want to push this one into the
18678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // user's face, right now.
1868bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                            if (launchTaskBehind && sourceRecord != null) {
1869a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                                intentActivity.setTaskToAffiliateWith(sourceRecord.task);
1870a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                            }
18718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            movedHome = true;
1872299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner                            targetStack.moveTaskToFrontLocked(intentActivity.task, r, options,
1873299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner                                    "bringingFoundTaskToFront");
1874de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            if ((launchFlags &
187529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
187629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
1877e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner                                // Caller wants to appear on home activity.
187884984faf530e525b066e28710d0f9beb32142ec5Craig Mautner                                intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
1879de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            }
18808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            options = null;
188144f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            movedToFront = true;
18828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
18838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
18848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the caller has requested that the target task be
18858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // reset, then do so.
18868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
18878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
18888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
18898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
18908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We don't need to start a new activity, and
18918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the client said not to do anything if that
18928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is the case, so this is it!  And for paranoia, make
18938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
18948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
189505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                            resumeTopActivitiesLocked(targetStack, null, options);
189644f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi
189744f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            // Make sure to notify Keyguard as well if we are not running an app
189844f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            // transition later.
189944f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            if (!movedToFront) {
190044f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                                notifyActivityDrawnForKeyguard();
190144f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            }
19028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
19038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
19048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
19058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
19068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
19078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags &
19088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
19098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
19108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The caller has requested to completely replace any
19118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task with its new activity.  Well that should
19128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // not be too hard...
19138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask = intentActivity.task;
19148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.performClearTaskLocked();
1915fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                        reuseTask.setIntent(r);
19168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
1917a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                            || launchSingleInstance || launchSingleTask) {
19188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this situation we want to remove all activities
19198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from the task up to the one being started.  In most
19208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // cases this means we are resetting the task to its
19218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // initial state.
19228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ActivityRecord top =
19238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.performClearTaskLocked(r, launchFlags);
19248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (top != null) {
19258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (top.frontOfTask) {
19268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // Activity aliases may mean we use different
19278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intents for the top activity, so make sure
19288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the task now has the identity of the new
19298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intent.
1930fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                                top.task.setIntent(r);
19318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
19328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
19338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    r, top.task);
193485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
19358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
19368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // A special case: we need to
19378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // start the activity because it is not currently
19388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // running, and the caller has asked to clear the
19398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // current task to have this activity at the top.
19408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
19418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // Now pretend like this activity is being started
19428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // by the top of its task, so it is put in the
19438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // right place.
19448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
19458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
19468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (r.realActivity.equals(intentActivity.task.realActivity)) {
19478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case the top activity on the task is the
19488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // same as the one being launched, so we take that
19498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // as a request to bring the task to the foreground.
19508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // If the top activity in the task is the root
19518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // activity, deliver this new intent to it if it
19528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // desires.
1953ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 || launchSingleTop)
19548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                && intentActivity.realActivity.equals(r.realActivity)) {
19558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r,
19568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    intentActivity.task);
19578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (intentActivity.frontOfTask) {
1958fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                                intentActivity.task.setIntent(r);
19598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
196085d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                            intentActivity.deliverNewIntentLocked(callingUid, r.intent,
196185d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                                    r.launchedFromPackage);
19628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else if (!r.intent.filterEquals(intentActivity.task.intent)) {
19638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // In this case we are launching the root activity
19648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // of the task, but with a different intent.  We
19658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // should start a new instance on top.
19668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
19678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
19688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
19698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
19708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case an activity is being launched in to an
19718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task, without resetting that task.  This
19728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is typically the situation of launching an activity
19738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from a notification or shortcut.  We want to place
19748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the new activity on top of the current task.
19758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        addingToTask = true;
19768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        sourceRecord = intentActivity;
19778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (!intentActivity.task.rootWasReset) {
19788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case we are launching in to an existing task
19798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // that has not yet been started from its front door.
19808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The current task has been brought to the front.
19818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // Ideally, we'd probably like to place this new task
19828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // at the bottom of its stack, but that's a little hard
19838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // to do with the current organization of the code so
19848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // for now we'll just drop it.
1985fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                        intentActivity.task.setIntent(r);
19868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
19878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (!addingToTask && reuseTask == null) {
19888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We didn't do anything...  but it was needed (a.k.a., client
19898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // don't use that intent!)  And for paranoia, make
19908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
19918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1992de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            targetStack.resumeTopActivityLocked(null, options);
199344f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            if (!movedToFront) {
199444f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                                // Make sure to notify Keyguard as well if we are not running an app
199544f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                                // transition later.
199644f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                                notifyActivityDrawnForKeyguard();
199744f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            }
19988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
19998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
20008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
20018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_TASK_TO_FRONT;
20028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
20038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
20048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
20068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
20078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //String uri = r.intent.toURI();
20088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Intent intent2 = new Intent(uri);
20098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "Given intent: " + r.intent);
20108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "URI is: " + uri);
20118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "To intent: " + intent2);
20128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
20138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.packageName != null) {
20148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If the activity being launched is the same as the one currently
20158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // at the top, then we need to check if it should only be launched
20168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // once.
2017ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ActivityStack topStack = getFocusedStack();
2018de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop);
20198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (top != null && r.resultTo == null) {
20208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
20218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (top.app != null && top.app.thread != null) {
2022d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner                        if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
2023ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner                            || launchSingleTop || launchSingleTask) {
20248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top,
20258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    top.task);
20268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // For paranoia, make sure we have correctly
20278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // resumed the top activity.
20280f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                            topStack.mLastPausedActivity = null;
20298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (doResume) {
203005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                                resumeTopActivitiesLocked();
20318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
20328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
20338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
20348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // We don't need to start a new activity, and
20358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the client said not to do anything if that
20368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // is the case, so this is it!
20378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
20388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
203985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
20408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            return ActivityManager.START_DELIVERED_TO_TOP;
20418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
20428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
20438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
20448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
20468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
20478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo != null) {
2048de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho,
2049de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.requestCode, Activity.RESULT_CANCELED, null);
20508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityOptions.abort(options);
20528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            return ActivityManager.START_CLASS_NOT_FOUND;
20538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
20548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
20558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean newTask = false;
20568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean keepCurTransition = false;
20578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
2058bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        TaskRecord taskToAffiliate = launchTaskBehind && sourceRecord != null ?
2059a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                sourceRecord.task : null;
2060a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner
20618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // Should this be considered a new task?
2062962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn        if (r.resultTo == null && inTask == null && !addingToTask
2063f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
2064aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            if (isLockTaskModeViolation(reuseTask)) {
2065aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
2066aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
2067aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            }
2068d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            newTask = true;
2069d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            targetStack = adjustStackFocus(r, newTask);
2070bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            if (!launchTaskBehind) {
2071299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner                targetStack.moveToFront("startingNewTask");
2072bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            }
20738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (reuseTask == null) {
20748862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                r.setTask(targetStack.createTaskRecord(getNextTaskId(),
20758862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                        newTaskInfo != null ? newTaskInfo : r.info,
20768862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                        newTaskIntent != null ? newTaskIntent : intent,
2077bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        voiceSession, voiceInteractor, !launchTaskBehind /* toTop */),
2078bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        taskToAffiliate);
2079de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
2080de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.task);
20818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else {
2082a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                r.setTask(reuseTask, taskToAffiliate);
20838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!movedHome) {
2085de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if ((launchFlags &
2086de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
2087de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
2088de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // Caller wants to appear on home activity, so before starting
2089de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // their own activity we will bring home to the front.
209084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner                    r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
2091de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
20928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord != null) {
2094a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner            final TaskRecord sourceTask = sourceRecord.task;
2095aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            if (isLockTaskModeViolation(sourceTask)) {
2096aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
2097aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
2098aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            }
2099525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            targetStack = sourceTask.stack;
2100299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner            targetStack.moveToFront("sourceStackToFront");
2101737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner            final TaskRecord topTask = targetStack.topTask();
2102737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner            if (topTask != sourceTask) {
2103299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner                targetStack.moveTaskToFrontLocked(sourceTask, r, options, "sourceTaskToFront");
2104737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner            }
2105a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner            if (!addingToTask && (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
21068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are adding the activity to an existing
21078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // task, but the caller has asked to clear that task if the
21088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // activity is already running.
2109525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags);
21108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                keepCurTransition = true;
21118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
21128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
211385d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
21148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // For paranoia, make sure we have correctly
21158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // resumed the top activity.
21160f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
21178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
21188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
21198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
21208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityOptions.abort(options);
21218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
21228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
21238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else if (!addingToTask &&
21248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
21258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are launching an activity in our own task
21268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // that may already be running somewhere in the history, and
21278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // we want to shuffle it to the front of the stack if so.
2128525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r);
21298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
2130de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    final TaskRecord task = top.task;
2131de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    task.moveActivityToFrontLocked(top);
2132de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task);
21338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.updateOptionsLocked(options);
213485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
21350f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
21368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
21378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
21388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
21398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
21408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
21418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
21428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // An existing activity is starting this new activity, so we want
21438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // to keep the new one in the same task as the one that is starting
21448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // it.
2145a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner            r.setTask(sourceTask, null);
21468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
21472a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    + " in existing task " + r.task + " from source " + sourceRecord);
21488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
214989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        } else if (inTask != null) {
215089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // The calling is asking that the new activity be started in an explicit
215189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // task it has provided to us.
215289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (isLockTaskModeViolation(inTask)) {
215389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
215489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
215589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
215689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            targetStack = inTask.stack;
2157299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner            targetStack.moveTaskToFrontLocked(inTask, r, options, "inTaskToFront");
2158d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
2159d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // Check whether we should actually launch the new activity in to the task,
2160d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // or just reuse the current activity on top.
2161d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            ActivityRecord top = inTask.getTopActivity();
2162d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (top != null && top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
2163d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
2164d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        || launchSingleTop || launchSingleTask) {
2165d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task);
2166d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
2167d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        // We don't need to start a new activity, and
2168d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        // the client said not to do anything if that
2169d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        // is the case, so this is it!
2170d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
2171d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    }
217285d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
2173d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
2174d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                }
2175d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            }
2176d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
2177962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            if (!addingToTask) {
2178962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                // We don't actually want to have this activity added to the task, so just
2179962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                // stop here but still tell the caller that we consumed the intent.
2180962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                ActivityOptions.abort(options);
2181962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                return ActivityManager.START_TASK_TO_FRONT;
2182962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            }
2183962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn
218489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            r.setTask(inTask, null);
218589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
218689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    + " in explicit task " + r.task);
218789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
21888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
21898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This not being started from an existing activity, and not part
21908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // of a new task...  just put it in the top task, though these days
21918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // this case should never happen.
21921b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner            targetStack = adjustStackFocus(r, newTask);
2193299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner            targetStack.moveToFront("addingToTopTask");
21941602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            ActivityRecord prev = targetStack.topActivity();
2195c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner            r.setTask(prev != null ? prev.task : targetStack.createTaskRecord(getNextTaskId(),
2196a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                            r.info, intent, null, null, true), null);
219795e9daab03d0349a69940625c7f718175f371581Craig Mautner            mWindowManager.moveTaskToTop(r.task.taskId);
21988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
21998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in new guessed " + r.task);
22008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
22018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
22028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
2203c6cf95c0f5f7250c65e40c441fe58d8cbfd114c9Nicolas Prevot                intent, r.getUriPermissionsLocked(), r.userId);
22048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
220576e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner        if (sourceRecord != null && sourceRecord.isRecentsActivity()) {
220676e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner            r.task.setTaskToReturnTo(RECENTS_ACTIVITY_TYPE);
220776e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner        }
22088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (newTask) {
22098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
22108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
22118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
22120f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner        targetStack.mLastPausedActivity = null;
22138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
2214bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        if (!launchTaskBehind) {
2215bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            // Don't set focus on an activity that's going to the back.
2216299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner            mService.setFocusedActivityLocked(r, "startedActivity");
2217bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        }
22188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return ActivityManager.START_SUCCESS;
22198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
22208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
2221ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    final void doPendingActivityLaunchesLocked(boolean doResume) {
2222ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        while (!mPendingActivityLaunches.isEmpty()) {
2223ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            PendingActivityLaunch pal = mPendingActivityLaunches.remove(0);
2224aa9b0f15753541ff8e4d62e6497c11800c737077Craig Mautner            startActivityUncheckedLocked(pal.r, pal.sourceRecord, null, null, pal.startFlags,
222589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    doResume && mPendingActivityLaunches.isEmpty(), null, null);
2226ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        }
2227ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    }
2228ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
22297f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner    void removePendingActivityLaunchesLocked(ActivityStack stack) {
2230ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        for (int palNdx = mPendingActivityLaunches.size() - 1; palNdx >= 0; --palNdx) {
2231ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            PendingActivityLaunch pal = mPendingActivityLaunches.get(palNdx);
22327f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner            if (pal.stack == stack) {
2233ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                mPendingActivityLaunches.remove(palNdx);
2234ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            }
2235ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        }
2236ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    }
2237ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
22387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    void acquireLaunchWakelock() {
22397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
22407ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
22417ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
22427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.acquire();
22437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
22447ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // To be safe, don't allow the wake lock to be held for too long.
22457ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
22467ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
22477ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    }
22487ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2249f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner    /**
2250f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner     * Called when the frontmost task is idle.
2251f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner     * @return the state of mService.mBooting before this was called.
2252f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner     */
2253f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner    private boolean checkFinishBootingLocked() {
2254f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        final boolean booting = mService.mBooting;
2255f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        boolean enableScreen = false;
2256f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        mService.mBooting = false;
2257f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        if (!mService.mBooted) {
2258f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner            mService.mBooted = true;
2259f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner            enableScreen = true;
2260f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        }
2261f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        if (booting || enableScreen) {
2262f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner            mService.postFinishBooting(booting, enableScreen);
2263f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        }
2264f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner        return booting;
2265f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner    }
2266f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner
2267f333327782e14688e1c198c1192172d51308e90bCraig Mautner    // Checked.
2268f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
2269f333327782e14688e1c198c1192172d51308e90bCraig Mautner            Configuration config) {
2270f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
2271f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2272f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> stops = null;
2273f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> finishes = null;
2274f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<UserStartedState> startingUsers = null;
2275f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NS = 0;
2276f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NF = 0;
2277f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean booting = false;
2278f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean activityRemoved = false;
2279f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2280f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord r = ActivityRecord.forToken(token);
2281f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (r != null) {
2282b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" +
2283b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner                    Debug.getCallers(4));
2284f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
2285f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r.finishLaunchTickingLocked();
22867ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (fromTimeout) {
22877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
22887ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
2289f333327782e14688e1c198c1192172d51308e90bCraig Mautner
22907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // This is a hack to semi-deal with a race condition
22917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // in the client where it can be constructed with a
22927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // newer configuration from when we asked it to launch.
22937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We'll update with whatever configuration it now says
22947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // it used to launch.
22957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (config != null) {
22967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                r.configuration = config;
22977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
2298f333327782e14688e1c198c1192172d51308e90bCraig Mautner
22997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We are now idle.  If someone is waiting for a thumbnail from
23007ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // us, we can now deliver.
23017ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            r.idle = true;
23027ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
23037ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
23049449a6162e275531857464acc2279894d5d6a240Dianne Hackborn            if (isFrontStack(r.task.stack) || fromTimeout) {
2305f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner                booting = checkFinishBootingLocked();
23067ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
23077ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
23087ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
23097ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (allResumedActivitiesIdle()) {
23107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (r != null) {
23117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.scheduleAppGcsLocked();
23127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
23137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
23147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
23157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
23167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER &&
23177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        Binder.getCallingUid() != Process.myUid()) {
23187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
2319f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
23207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
2321f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
23227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
2323f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2324f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2325f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Atomically retrieve all of the other things to do.
2326f333327782e14688e1c198c1192172d51308e90bCraig Mautner        stops = processStoppingActivitiesLocked(true);
2327f333327782e14688e1c198c1192172d51308e90bCraig Mautner        NS = stops != null ? stops.size() : 0;
2328f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if ((NF=mFinishingActivities.size()) > 0) {
2329f333327782e14688e1c198c1192172d51308e90bCraig Mautner            finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
2330f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mFinishingActivities.clear();
2331f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2332f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2333f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mStartingUsers.size() > 0) {
2334f333327782e14688e1c198c1192172d51308e90bCraig Mautner            startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
2335f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mStartingUsers.clear();
2336f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2337f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2338f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Stop any activities that are scheduled to do so but have been
2339f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
2340f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NS; i++) {
2341f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = stops.get(i);
2342f333327782e14688e1c198c1192172d51308e90bCraig Mautner            final ActivityStack stack = r.task.stack;
2343f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (r.finishing) {
2344f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
2345f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else {
2346f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.stopActivityLocked(r);
2347f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
2348f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2349f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2350f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Finish any activities that are scheduled to do so but have been
2351f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
2352f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NF; i++) {
2353f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = finishes.get(i);
2354ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            activityRemoved |= r.task.stack.destroyActivityLocked(r, true, "finish-idle");
2355f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2356f333327782e14688e1c198c1192172d51308e90bCraig Mautner
23577622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn        if (!booting) {
23581a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            // Complete user switch
23591a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            if (startingUsers != null) {
23601a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                for (int i = 0; i < startingUsers.size(); i++) {
23611a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                    mService.finishUserSwitch(startingUsers.get(i));
23621a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                }
23631a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            }
23641a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            // Complete starting up of background users
23651a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            if (mStartingBackgroundUsers.size() > 0) {
23661a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                startingUsers = new ArrayList<UserStartedState>(mStartingBackgroundUsers);
23671a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                mStartingBackgroundUsers.clear();
23681a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                for (int i = 0; i < startingUsers.size(); i++) {
23691a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                    mService.finishUserBoot(startingUsers.get(i));
23701a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                }
2371f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
2372f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2373f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2374f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mService.trimApplications();
2375f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //dump();
2376f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //mWindowManager.dump();
2377f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2378f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (activityRemoved) {
237905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            resumeTopActivitiesLocked();
2380f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2381f333327782e14688e1c198c1192172d51308e90bCraig Mautner
23827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        return r;
2383f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2384f333327782e14688e1c198c1192172d51308e90bCraig Mautner
23858e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    boolean handleAppDiedLocked(ProcessRecord app) {
23861909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner        boolean hasVisibleActivities = false;
2387e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2388e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
23894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
23904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                hasVisibleActivities |= stacks.get(stackNdx).handleAppDiedLocked(app);
23914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
23928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
23931909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner        return hasVisibleActivities;
23948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
23958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
23968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
2397e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2398e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
23994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
24004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stacks.get(stackNdx).closeSystemDialogsLocked();
24014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
24028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
24038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
240593529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    void removeUserLocked(int userId) {
24064f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        mUserStackInFront.delete(userId);
240793529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    }
240893529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
24098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
24108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
24118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
24128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
24138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
2414e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2415e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
24174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
24184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
24194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
24204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    didSomething = true;
24214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
24228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
24238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
24248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
24258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2427a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    void updatePreviousProcessLocked(ActivityRecord r) {
2428a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now that this process has stopped, we may want to consider
2429a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // it to be the previous app to try to keep around in case
2430a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // the user wants to return to it.
2431a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
2432a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // First, found out what is currently the foreground app, so that
2433a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // we don't blow away the previous app if this activity is being
2434a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // hosted by the process that is actually still the foreground.
2435a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        ProcessRecord fgApp = null;
2436e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2437e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
24394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
24404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
24414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (stack.mResumedActivity != null) {
24424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        fgApp = stack.mResumedActivity.app;
24434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    } else if (stack.mPausingActivity != null) {
24444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        fgApp = stack.mPausingActivity.app;
24454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
24464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    break;
2447a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                }
2448a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            }
2449a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2450a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
2451a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now set this one as the previous process, only if that really
2452a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // makes sense to.
2453a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        if (r.app != null && fgApp != null && r.app != fgApp
2454a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
24554ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                && r.app != mService.mHomeProcess) {
2456a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcess = r.app;
2457a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
2458a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2459a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    }
2460a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
246105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked() {
246205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return resumeTopActivitiesLocked(null, null, null);
246305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
246405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
246505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target,
246605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            Bundle targetOptions) {
246705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        if (targetStack == null) {
246805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            targetStack = getFocusedStack();
246905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        }
247012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner        // Do targetStack first.
247105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        boolean result = false;
247212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner        if (isFrontStack(targetStack)) {
247312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            result = targetStack.resumeTopActivityLocked(target, targetOptions);
247412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner        }
2475e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2476e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
24784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
247912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                if (stack == targetStack) {
248012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                    // Already started above.
248112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                    continue;
248212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                }
24834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
248412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                    stack.resumeTopActivityLocked(null);
248505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                }
2486f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            }
24878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
248805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return result;
24898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
24918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
2492e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2493e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
24954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
24964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
24974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stack.finishTopRunningActivityLocked(app);
24984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
24998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
25008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
25018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
25026ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn    void finishVoiceTask(IVoiceInteractionSession session) {
25036ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
25046ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
25056ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn            final int numStacks = stacks.size();
25066ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
25076ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                final ActivityStack stack = stacks.get(stackNdx);
25086ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                stack.finishVoiceTask(session);
25096ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn            }
25106ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn        }
25116ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn    }
25126ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn
2513299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner    void findTaskToMoveToFrontLocked(TaskRecord task, int flags, Bundle options, String reason) {
2514aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) {
2515aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            mUserLeaving = true;
25168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2517aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) {
2518aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            // Caller wants the home activity moved with it.  To accomplish this,
2519aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            // we'll just indicate that this task returns to the home task.
252084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
2521aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
2522299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner        task.stack.moveTaskToFrontLocked(task, null, options, reason);
2523aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack="
2524aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                + task.stack);
25258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
25268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2527967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ActivityStack getStack(int stackId) {
2528f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer activityContainer = mActivityContainers.get(stackId);
2529f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        if (activityContainer != null) {
2530f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            return activityContainer.mStack;
25318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
25328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
25338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
25348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2535967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ArrayList<ActivityStack> getStacks() {
25364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<ActivityStack> allStacks = new ArrayList<ActivityStack>();
2537e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2538e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            allStacks.addAll(mActivityDisplays.valueAt(displayNdx).mStacks);
25394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
25404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return allStacks;
25414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
25424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
25434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    IBinder getHomeActivityToken() {
2544ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        ActivityRecord homeActivity = getHomeActivity();
2545ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        if (homeActivity != null) {
2546ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            return homeActivity.appToken;
2547ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
2548ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        return null;
2549ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner    }
2550ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
2551ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner    ActivityRecord getHomeActivity() {
25524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final ArrayList<TaskRecord> tasks = mHomeStack.getAllTasks();
25534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
25544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final TaskRecord task = tasks.get(taskNdx);
25554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            if (task.isHomeTask()) {
25564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ArrayList<ActivityRecord> activities = task.mActivities;
25574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
25584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    final ActivityRecord r = activities.get(activityNdx);
25594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (r.isHomeActivity()) {
2560ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner                        return r;
25614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
25624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
25634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
25644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
25654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return null;
25664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
25674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
25684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    ActivityContainer createActivityContainer(ActivityRecord parentActivity,
25694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            IActivityContainerCallback callback) {
2570d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        ActivityContainer activityContainer =
2571d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                new VirtualActivityContainer(parentActivity, callback);
2572f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        mActivityContainers.put(activityContainer.mStackId, activityContainer);
2573d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        if (DEBUG_CONTAINERS) Slog.d(TAG, "createActivityContainer: " + activityContainer);
2574f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        parentActivity.mChildContainers.add(activityContainer);
2575f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        return activityContainer;
25764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
25774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
257834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner    void removeChildActivityContainers(ActivityRecord parentActivity) {
2579f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers;
2580f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) {
2581f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            ActivityContainer container = childStacks.remove(containerNdx);
2582d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            if (DEBUG_CONTAINERS) Slog.d(TAG, "removeChildActivityContainers: removing " +
2583d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    container);
2584f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            container.release();
258534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
258634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner    }
258734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner
258895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner    void deleteActivityContainer(IActivityContainer container) {
258995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        ActivityContainer activityContainer = (ActivityContainer)container;
259095da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        if (activityContainer != null) {
2591d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            if (DEBUG_CONTAINERS) Slog.d(TAG, "deleteActivityContainer: ",
2592d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    new RuntimeException("here").fillInStackTrace());
259395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            final int stackId = activityContainer.mStackId;
259495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            mActivityContainers.remove(stackId);
259595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            mWindowManager.removeStack(stackId);
259695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        }
259795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner    }
259895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner
2599f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    private int createStackOnDisplay(int stackId, int displayId) {
2600e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
2601e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        if (activityDisplay == null) {
26024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return -1;
26034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
26044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
2605f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer activityContainer = new ActivityContainer(stackId);
2606f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        mActivityContainers.put(stackId, activityContainer);
2607e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        activityContainer.attachToDisplayLocked(activityDisplay);
26084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return stackId;
2609967212cb542e6eeb308678367b53381bff984c31Craig Mautner    }
2610967212cb542e6eeb308678367b53381bff984c31Craig Mautner
26114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    int getNextStackId() {
2612858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        while (true) {
2613858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (++mLastStackId <= HOME_STACK_ID) {
2614858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                mLastStackId = HOME_STACK_ID + 1;
2615858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
2616858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (getStack(mLastStackId) == null) {
2617858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                break;
26188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
26198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2620858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        return mLastStackId;
26218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
26228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
26237de0535701351d76b634ab18577269e8130749eaWale Ogunwale    private boolean restoreRecentTaskLocked(TaskRecord task) {
26247de0535701351d76b634ab18577269e8130749eaWale Ogunwale        ActivityStack stack = null;
26257de0535701351d76b634ab18577269e8130749eaWale Ogunwale        // Determine stack to restore task to.
26267de0535701351d76b634ab18577269e8130749eaWale Ogunwale        if (mLeanbackOnlyDevice) {
26277de0535701351d76b634ab18577269e8130749eaWale Ogunwale            // There is only one stack for lean back devices.
26287de0535701351d76b634ab18577269e8130749eaWale Ogunwale            stack = mHomeStack;
26297de0535701351d76b634ab18577269e8130749eaWale Ogunwale        } else {
26307de0535701351d76b634ab18577269e8130749eaWale Ogunwale            // Look for the top stack on the home display that isn't the home stack.
26317de0535701351d76b634ab18577269e8130749eaWale Ogunwale            final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks;
26327de0535701351d76b634ab18577269e8130749eaWale Ogunwale            for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) {
26337de0535701351d76b634ab18577269e8130749eaWale Ogunwale                final ActivityStack tmpStack = homeDisplayStacks.get(stackNdx);
26347de0535701351d76b634ab18577269e8130749eaWale Ogunwale                if (!tmpStack.isHomeStack()) {
26357de0535701351d76b634ab18577269e8130749eaWale Ogunwale                    stack = tmpStack;
26367de0535701351d76b634ab18577269e8130749eaWale Ogunwale                    break;
26377de0535701351d76b634ab18577269e8130749eaWale Ogunwale                }
2638ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
2639ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
26407de0535701351d76b634ab18577269e8130749eaWale Ogunwale
26417de0535701351d76b634ab18577269e8130749eaWale Ogunwale        if (stack == null) {
26427de0535701351d76b634ab18577269e8130749eaWale Ogunwale            // We couldn't find a stack to restore the task to. Possible if are restoring recents
26437de0535701351d76b634ab18577269e8130749eaWale Ogunwale            // before an application stack is created...Go ahead and create one on the default
26447de0535701351d76b634ab18577269e8130749eaWale Ogunwale            // display.
26457de0535701351d76b634ab18577269e8130749eaWale Ogunwale            stack = getStack(createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY));
2646f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner            // Restore home stack to top.
2647299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner            moveHomeStack(true, "restoreRecentTask");
26487de0535701351d76b634ab18577269e8130749eaWale Ogunwale            if (DEBUG_RECENTS)
26497de0535701351d76b634ab18577269e8130749eaWale Ogunwale                Slog.v(TAG, "Created stack=" + stack + " for recents restoration.");
26507de0535701351d76b634ab18577269e8130749eaWale Ogunwale        }
26517de0535701351d76b634ab18577269e8130749eaWale Ogunwale
26527de0535701351d76b634ab18577269e8130749eaWale Ogunwale        if (stack == null) {
26537de0535701351d76b634ab18577269e8130749eaWale Ogunwale            // What does this mean??? Not sure how we would get here...
26547de0535701351d76b634ab18577269e8130749eaWale Ogunwale            if (DEBUG_RECENTS)
26557de0535701351d76b634ab18577269e8130749eaWale Ogunwale                Slog.v(TAG, "Unable to find/create stack to restore recent task=" + task);
26567de0535701351d76b634ab18577269e8130749eaWale Ogunwale            return false;
26577de0535701351d76b634ab18577269e8130749eaWale Ogunwale        }
26587de0535701351d76b634ab18577269e8130749eaWale Ogunwale
26597de0535701351d76b634ab18577269e8130749eaWale Ogunwale        stack.addTask(task, false, false);
26607de0535701351d76b634ab18577269e8130749eaWale Ogunwale        if (DEBUG_RECENTS)
26617de0535701351d76b634ab18577269e8130749eaWale Ogunwale            Slog.v(TAG, "Added restored task=" + task + " to stack=" + stack);
26627de0535701351d76b634ab18577269e8130749eaWale Ogunwale        final ArrayList<ActivityRecord> activities = task.mActivities;
26637de0535701351d76b634ab18577269e8130749eaWale Ogunwale        for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
26647de0535701351d76b634ab18577269e8130749eaWale Ogunwale            final ActivityRecord r = activities.get(activityNdx);
26657de0535701351d76b634ab18577269e8130749eaWale Ogunwale            mWindowManager.addAppToken(0, r.appToken, task.taskId, stack.mStackId,
26667de0535701351d76b634ab18577269e8130749eaWale Ogunwale                    r.info.screenOrientation, r.fullscreen,
26677de0535701351d76b634ab18577269e8130749eaWale Ogunwale                    (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0,
26687de0535701351d76b634ab18577269e8130749eaWale Ogunwale                    r.userId, r.info.configChanges, task.voiceSession != null,
26697de0535701351d76b634ab18577269e8130749eaWale Ogunwale                    r.mLaunchTaskBehind);
26707de0535701351d76b634ab18577269e8130749eaWale Ogunwale        }
26717de0535701351d76b634ab18577269e8130749eaWale Ogunwale        return true;
2672ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
2673ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
2674299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner    void moveTaskToStackLocked(int taskId, int stackId, boolean toTop) {
2675b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        final TaskRecord task = anyTaskForIdLocked(taskId);
2676b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        if (task == null) {
2677b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner            return;
2678b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        }
26798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
26808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
26818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
26828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
26838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2684299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner        task.stack.removeTask(task, "moveTaskToStack");
2685c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        stack.addTask(task, toTop, true);
2686b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        mWindowManager.addTask(taskId, stackId, toTop);
268705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        resumeTopActivitiesLocked();
26888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
26898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2690ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityRecord findTaskLocked(ActivityRecord r) {
26912a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn        if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r);
2692e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2693e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
26944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
26954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
26964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (!r.isApplicationActivity() && !stack.isHomeStack()) {
26971b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                    if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (home activity) " + stack);
26981b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                    continue;
26991b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                }
27001b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                if (!stack.mActivityContainer.isEligibleForNewTasks()) {
27011b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                    if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (new task not allowed) " +
27021b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                            stack);
27034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    continue;
27044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
27054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord ar = stack.findTaskLocked(r);
27064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (ar != null) {
27074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return ar;
27084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
27098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
27108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
27112a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn        if (DEBUG_TASKS) Slog.d(TAG, "No task found");
27128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
27138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
27148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
27158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
2716e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2717e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
27184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
27194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord ar = stacks.get(stackNdx).findActivityLocked(intent, info);
27204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (ar != null) {
27214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return ar;
27224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
27238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
27248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
27258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
27268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
27278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
27288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
27290eea92c67b292b005c152641a12b920fe145826cCraig Mautner        scheduleSleepTimeout();
27300eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mGoingToSleep.isHeld()) {
27310eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.acquire();
27327ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
27337ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
27347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
27350eea92c67b292b005c152641a12b920fe145826cCraig Mautner                }
27367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
27377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
27380eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
27398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2740ce15e157a6cf56fc73961ccb8c5ab18b1bf70280Amith Yamasani        checkReadyForSleepLocked();
27418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
27428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
27438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
27440eea92c67b292b005c152641a12b920fe145826cCraig Mautner        goingToSleepLocked();
27450eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2746f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        boolean timedout = false;
27470eea92c67b292b005c152641a12b920fe145826cCraig Mautner        final long endTime = System.currentTimeMillis() + timeout;
27480eea92c67b292b005c152641a12b920fe145826cCraig Mautner        while (true) {
27490eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean cantShutdown = false;
2750e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2751e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
27524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
27534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    cantShutdown |= stacks.get(stackNdx).checkReadyForSleepLocked();
27544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
27550eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
27560eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (cantShutdown) {
27570eea92c67b292b005c152641a12b920fe145826cCraig Mautner                long timeRemaining = endTime - System.currentTimeMillis();
27580eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (timeRemaining > 0) {
27598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
27600eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        mService.wait(timeRemaining);
27618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
27628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
27630eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } else {
27640eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    Slog.w(TAG, "Activity manager shutdown timed out");
27650eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    timedout = true;
27660eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    break;
27678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
27680eea92c67b292b005c152641a12b920fe145826cCraig Mautner            } else {
27690eea92c67b292b005c152641a12b920fe145826cCraig Mautner                break;
27708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
27718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
27720eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27730eea92c67b292b005c152641a12b920fe145826cCraig Mautner        // Force checkReadyForSleep to complete.
27740eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = true;
27750eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
27760eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
27788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
27798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
27808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
27810eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
27820eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
27830eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
27840eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
2785e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2786e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
27874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
27884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
27894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stack.awakeFromSleepingLocked();
27904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
27914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    resumeTopActivitiesLocked();
27924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
27935314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner            }
27948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
27950eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.clear();
27960eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
27970eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27980eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void activitySleptLocked(ActivityRecord r) {
27990eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.remove(r);
28000eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
28010eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
28020eea92c67b292b005c152641a12b920fe145826cCraig Mautner
28030eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void checkReadyForSleepLocked() {
28040eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mService.isSleepingOrShuttingDown()) {
28050eea92c67b292b005c152641a12b920fe145826cCraig Mautner            // Do not care.
28060eea92c67b292b005c152641a12b920fe145826cCraig Mautner            return;
28070eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
28080eea92c67b292b005c152641a12b920fe145826cCraig Mautner
28090eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mSleepTimeout) {
28100eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean dontSleep = false;
2811e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2812e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
28134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
28144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    dontSleep |= stacks.get(stackNdx).checkReadyForSleepLocked();
28154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
28160eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
28170eea92c67b292b005c152641a12b920fe145826cCraig Mautner
28180eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mStoppingActivities.size() > 0) {
28190eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to stop; can't sleep yet.
28200eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
28210eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mStoppingActivities.size() + " activities");
28220eea92c67b292b005c152641a12b920fe145826cCraig Mautner                scheduleIdleLocked();
28230eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
28240eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
28250eea92c67b292b005c152641a12b920fe145826cCraig Mautner
28260eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mGoingToSleepActivities.size() > 0) {
28270eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to sleep; can't sleep yet.
28280eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
28290eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mGoingToSleepActivities.size() + " activities");
28300eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
28310eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
28320eea92c67b292b005c152641a12b920fe145826cCraig Mautner
28330eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (dontSleep) {
28340eea92c67b292b005c152641a12b920fe145826cCraig Mautner                return;
28350eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
28360eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
28370eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2838e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2839e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
28404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
28414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stacks.get(stackNdx).goToSleep();
28424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
28430eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
28440eea92c67b292b005c152641a12b920fe145826cCraig Mautner
28450eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
28460eea92c67b292b005c152641a12b920fe145826cCraig Mautner
28470eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
28480eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
28490eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
28500eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mService.mShuttingDown) {
28510eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mService.notifyAll();
28520eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
28538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
28548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2855ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean reportResumedActivityLocked(ActivityRecord r) {
2856ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = r.task.stack;
2857ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (isFrontStack(stack)) {
28585782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey            mService.updateUsageStats(r, true);
2859ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2860ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (allResumedActivitiesComplete()) {
2861ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
2862ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.executeAppTransition();
2863ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return true;
2864ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2865ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return false;
2866ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2867ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
28688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
2869e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2870e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
28714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
28724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
28734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
28744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stack.handleAppCrashLocked(app);
28754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
28768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
28778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
28788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
28794b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima    boolean requestVisibleBehindLocked(ActivityRecord r, boolean visible) {
2880ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        final ActivityStack stack = r.task.stack;
2881ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        if (stack == null) {
28824b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: r=" + r + " visible=" +
28834b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima                    visible + " stack is null");
2884ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            return false;
2885ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
28864b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        final boolean isVisible = stack.hasVisibleBehindActivity();
28874b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind r=" + r + " visible=" +
28884b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima                visible + " isVisible=" + isVisible);
2889ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
2890ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        final ActivityRecord top = topRunningActivityLocked();
28914b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        if (top == null || top == r || (visible == isVisible)) {
28924b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: quick return");
28934b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            stack.setVisibleBehindActivity(visible ? r : null);
2894ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            return true;
2895ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
2896ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
2897ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        // A non-top activity is reporting a visibility change.
2898aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner        if (visible && top.fullscreen) {
2899aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            // Let the caller know that it can't be seen.
29004b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: returning top.fullscreen="
290134ff492978d30569e694f7427be430dce66cac06Jose Lima                    + top.fullscreen + " top.state=" + top.state + " top.app=" + top.app +
2902ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner                    " top.app.thread=" + top.app.thread);
2903ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            return false;
290434ff492978d30569e694f7427be430dce66cac06Jose Lima        } else if (!visible && stack.getVisibleBehindActivity() != r) {
290534ff492978d30569e694f7427be430dce66cac06Jose Lima            // Only the activity set as currently visible behind should actively reset its
290634ff492978d30569e694f7427be430dce66cac06Jose Lima            // visible behind state.
290734ff492978d30569e694f7427be430dce66cac06Jose Lima            if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: returning visible="
290834ff492978d30569e694f7427be430dce66cac06Jose Lima                    + visible + " stack.getVisibleBehindActivity()=" +
290934ff492978d30569e694f7427be430dce66cac06Jose Lima                    stack.getVisibleBehindActivity() + " r=" + r);
291034ff492978d30569e694f7427be430dce66cac06Jose Lima            return false;
2911ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
2912ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
29134b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        stack.setVisibleBehindActivity(visible ? r : null);
29144b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        if (!visible) {
2915fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner            // Make the activity immediately above r opaque.
2916fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner            final ActivityRecord next = stack.findNextTranslucentActivity(r);
2917fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner            if (next != null) {
2918fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner                mService.convertFromTranslucent(next.appToken);
2919fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner            }
2920fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner        }
2921aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner        if (top.app != null && top.app.thread != null) {
2922aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            // Notify the top app of the change.
2923aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            try {
2924aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner                top.app.thread.scheduleBackgroundVisibleBehindChanged(top.appToken, visible);
2925aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            } catch (RemoteException e) {
2926aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            }
2927ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
2928ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        return true;
2929ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner    }
2930ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
2931bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    // Called when WindowManager has finished animating the launchingBehind activity to the back.
2932bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    void handleLaunchTaskBehindCompleteLocked(ActivityRecord r) {
2933bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        r.mLaunchTaskBehind = false;
2934bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        final TaskRecord task = r.task;
2935bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        task.setLastThumbnail(task.stack.screenshotActivities(r));
2936bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        mService.addRecentTaskLocked(task);
2937740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung        mService.notifyTaskStackChangedLocked();
2938bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        mWindowManager.setAppVisibility(r.appToken, false);
2939bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    }
2940bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner
2941bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    void scheduleLaunchTaskBehindComplete(IBinder token) {
2942bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        mHandler.obtainMessage(LAUNCH_TASK_BEHIND_COMPLETE, token).sendToTarget();
2943bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    }
2944bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner
2945de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
2946580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // First the front stacks. In case any are not fullscreen and are in front of home.
2947e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2948e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
29494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int topStackNdx = stacks.size() - 1;
29504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) {
29514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
2952729cb2391f8eedbab9af1d0ef62febb0b56292ccJose Lima                stack.ensureActivitiesVisibleLocked(starting, configChanges);
2953580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
29548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
29558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
29568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
29578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
2958e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2959e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
29604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
29614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
29624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
2963ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner                stack.scheduleDestroyActivities(app, reason);
29644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
29658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
29668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
29678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
296889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    void releaseSomeActivitiesLocked(ProcessRecord app, String reason) {
296989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // Examine all activities currently running in the process.
297089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        TaskRecord firstTask = null;
297189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // Tasks is non-null only if two or more tasks are found.
297289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        ArraySet<TaskRecord> tasks = null;
297389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        if (DEBUG_RELEASE) Slog.d(TAG, "Trying to release some activities in " + app);
297489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        for (int i=0; i<app.activities.size(); i++) {
297589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            ActivityRecord r = app.activities.get(i);
297689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // First, if we find an activity that is in the process of being destroyed,
297789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // then we just aren't going to do anything for now; we want things to settle
297889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // down before we try to prune more activities.
297989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (r.finishing || r.state == ActivityState.DESTROYING
298089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    || r.state == ActivityState.DESTROYED) {
298189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (DEBUG_RELEASE) Slog.d(TAG, "Abort release; already destroying: " + r);
298289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                return;
298389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
298489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // Don't consider any activies that are currently not in a state where they
298589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // can be destroyed.
298689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (r.visible || !r.stopped || !r.haveState
298789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    || r.state == ActivityState.RESUMED || r.state == ActivityState.PAUSING
298889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    || r.state == ActivityState.PAUSED || r.state == ActivityState.STOPPING) {
298989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (DEBUG_RELEASE) Slog.d(TAG, "Not releasing in-use activity: " + r);
299089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                continue;
299189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
299289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (r.task != null) {
299389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (DEBUG_RELEASE) Slog.d(TAG, "Collecting release task " + r.task
299489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        + " from " + r);
299589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (firstTask == null) {
299689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    firstTask = r.task;
299789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                } else if (firstTask != r.task) {
299889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    if (tasks == null) {
299989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        tasks = new ArraySet<>();
300089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        tasks.add(firstTask);
300189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    }
300289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    tasks.add(r.task);
300389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
300489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
300589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
300689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        if (tasks == null) {
300789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (DEBUG_RELEASE) Slog.d(TAG, "Didn't find two or more tasks to release");
300889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            return;
300989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
301089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // If we have activities in multiple tasks that are in a position to be destroyed,
301189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // let's iterate through the tasks and release the oldest one.
301289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        final int numDisplays = mActivityDisplays.size();
301389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
301489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
301589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // Step through all stacks starting from behind, to hit the oldest things first.
301689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            for (int stackNdx = 0; stackNdx < stacks.size(); stackNdx++) {
301789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                final ActivityStack stack = stacks.get(stackNdx);
301889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                // Try to release activities in this stack; if we manage to, we are done.
301989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (stack.releaseSomeActivitiesLocked(app, tasks, reason) > 0) {
302089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    return;
302189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
302289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
302389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
302489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    }
302589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
30268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
30274f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId());
30284f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID);
30292420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
3030ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
3031858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStartingUsers.add(uss);
3032e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
3033e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
30344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
3035e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ActivityStack stack = stacks.get(stackNdx);
3036e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                stack.switchUserLocked(userId);
3037dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                TaskRecord task = stack.topTask();
3038dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                if (task != null) {
3039dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                    mWindowManager.moveTaskToTop(task.taskId);
3040dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                }
30414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
3042ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        }
3043858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
30444f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        ActivityStack stack = getStack(restoreStackId);
30454f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        if (stack == null) {
30464f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner            stack = mHomeStack;
30474f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        }
30484f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        final boolean homeInFront = stack.isHomeStack();
3049e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        if (stack.isOnHomeDisplay()) {
3050299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner            moveHomeStack(homeInFront, "switchUserOnHomeDisplay");
3051dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina            TaskRecord task = stack.topTask();
3052dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina            if (task != null) {
3053dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                mWindowManager.moveTaskToTop(task.taskId);
3054dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina            }
3055e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        } else {
3056e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            // Stack was moved to another display while user was swapped out.
3057299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner            resumeHomeStackTask(HOME_ACTIVITY_TYPE, null, "switchUserOnOtherDisplay");
3058e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        }
305993529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        return homeInFront;
30602219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
30612219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
30621a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    /**
30631a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     * Add background users to send boot completed events to.
30641a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     * @param userId The user being started in the background
30651a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     * @param uss The state object for the user.
30661a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     */
30671a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    public void startBackgroundUserLocked(int userId, UserStartedState uss) {
30681a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani        mStartingBackgroundUsers.add(uss);
30691a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    }
30701a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani
3071de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
3072de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        int N = mStoppingActivities.size();
3073de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (N <= 0) return null;
3074de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
3075de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ArrayList<ActivityRecord> stops = null;
3076de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
3077de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean nowVisible = allResumedActivitiesVisible();
3078de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int i=0; i<N; i++) {
3079de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord s = mStoppingActivities.get(i);
3080a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
3081de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + nowVisible + " waitingVisible=" + s.waitingVisible
3082de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + " finishing=" + s.finishing);
3083de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (s.waitingVisible && nowVisible) {
3084de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mWaitingVisibleActivities.remove(s);
3085de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                s.waitingVisible = false;
3086de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (s.finishing) {
3087de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // If this activity is finishing, it is sitting on top of
3088de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // everyone else but we now know it is no longer needed...
3089de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // so get rid of it.  Otherwise, we need to go through the
3090de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // normal flow and hide it once we determine that it is
3091de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // hidden by the activities in front of it.
3092de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
3093ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWindowManager.setAppVisibility(s.appToken, false);
3094de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
3095de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
3096de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) {
3097de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
3098de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (stops == null) {
3099de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    stops = new ArrayList<ActivityRecord>();
3100de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
3101de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stops.add(s);
3102de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStoppingActivities.remove(i);
3103de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                N--;
3104de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                i--;
3105de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
3106de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
3107de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
3108de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return stops;
3109de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
3110de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
3111cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    void validateTopActivitiesLocked() {
31124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        // FIXME
31134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner/*        for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
31144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final ActivityStack stack = stacks.get(stackNdx);
3115cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityRecord r = stack.topRunningActivityLocked(null);
3116f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner            final ActivityState state = r == null ? ActivityState.DESTROYED : r.state;
3117cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (isFrontStack(stack)) {
3118cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r == null) {
3119cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: null top activity, stack=" + stack);
3120cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                } else {
3121f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    final ActivityRecord pausing = stack.mPausingActivity;
3122f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (pausing != null && pausing == r) {
3123cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r +
3124f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
3125cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
3126f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) {
3127cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r +
3128f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                                " state=" + state);
3129cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
3130cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
3131cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            } else {
3132f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                final ActivityRecord resumed = stack.mResumedActivity;
3133f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (resumed != null && resumed == r) {
3134cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r +
3135f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        " state=" + state);
3136cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
3137f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (r != null && (state == ActivityState.INITIALIZING
3138f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        || state == ActivityState.RESUMED)) {
3139cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: activity in back resumed r=" + r +
3140f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
3141cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
3142cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
3143cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
31444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner*/
314576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner    }
314676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner
3147270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
3148d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack);
31494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                pw.print(" mLastFocusedStack="); pw.println(mLastFocusedStack);
3150d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout);
3151d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId);
3152d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
315395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers);
3154270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
31558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
315620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
3157ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack().getDumpActivitiesLocked(name);
315820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
315920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
3160390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage,
3161390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            boolean needSep, String prefix) {
3162390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        if (activity != null) {
3163390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (dumpPackage == null || dumpPackage.equals(activity.packageName)) {
3164390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                if (needSep) {
3165390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    pw.println();
3166390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                }
3167390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.print(prefix);
3168390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println(activity);
31697ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                return true;
3170390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
3171390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        }
31727ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return false;
3173390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    }
3174390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn
31758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
31768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
31777ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean printed = false;
31787ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean needSep = false;
3179e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) {
3180e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx);
3181ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            pw.print("Display #"); pw.print(activityDisplay.mDisplayId);
3182737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner                    pw.println(" (activities from top to bottom):");
3183e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
3184737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
31854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
31864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                StringBuilder stackHeader = new StringBuilder(128);
31874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stackHeader.append("  Stack #");
31884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stackHeader.append(stack.mStackId);
31894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stackHeader.append(":");
31904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage,
31914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        needSep, stackHeader.toString());
31924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, "    ", "Run", false,
31934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        !dumpAll, false, dumpPackage, true,
31944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        "    Running activities (most recent first):", null);
31954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
31964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                needSep = printed;
31974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep,
31984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        "    mPausingActivity: ");
31994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (pr) {
32004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    printed = true;
32014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    needSep = false;
32024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
32034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep,
32044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        "    mResumedActivity: ");
32057ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                if (pr) {
32067ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    printed = true;
32074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    needSep = false;
32084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
32094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (dumpAll) {
32104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep,
32114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            "    mLastPausedActivity: ");
32124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (pr) {
32134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        printed = true;
32144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        needSep = true;
32154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
32164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage,
32174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            needSep, "    mLastNoHistoryActivity: ");
32187ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                }
32194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                needSep = printed;
32208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
32218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
32228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
32237ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mFinishingActivities, "  ", "Fin", false, !dumpAll,
32247ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to finish:", null);
32257ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mStoppingActivities, "  ", "Stop", false, !dumpAll,
32267ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to stop:", null);
32277ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, "  ", "Wait", false, !dumpAll,
32287ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting for another to become visible:",
32297ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                null);
32307ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
32317ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
32327ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
32337ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
3234de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
32357ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return printed;
32368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
32378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
3238390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
32398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
32407ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            String dumpPackage, boolean needNL, String header1, String header2) {
32418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
3242390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String innerPrefix = null;
3243390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String[] args = null;
3244390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        boolean printed = false;
32458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
32468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
32478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
32488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
32498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
3250390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (innerPrefix == null) {
3251390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                innerPrefix = prefix + "      ";
3252390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                args = new String[0];
3253390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
3254390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            printed = true;
32558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
32568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
3257390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println("");
32588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
32598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
32607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header1 != null) {
32617ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header1);
32627ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header1 = null;
32637ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
32647ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header2 != null) {
32657ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header2);
32667ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header2 = null;
3267390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
32688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
32698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
32708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
32718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
32728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
32738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
32748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
32758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
32768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
32778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
32788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
32798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
32808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
32818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
32828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
32838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
32848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
32858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
32868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
32878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
32888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
32898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
32908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
32918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
32928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
32938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
32948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
32958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
32968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
32978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
32988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
32998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
33008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
33018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
33028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
33038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
33048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
33058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
33068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
33078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
33088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
33098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
33108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
33118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
33128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
33138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
33148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
33158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
33168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
33178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
3318390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        return printed;
33198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
3320ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
3321f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void scheduleIdleTimeoutLocked(ActivityRecord next) {
3322b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4));
3323c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
3324c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
3325f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
3326f333327782e14688e1c198c1192172d51308e90bCraig Mautner
3327f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final void scheduleIdleLocked() {
332805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(IDLE_NOW_MSG);
3329f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
3330f333327782e14688e1c198c1192172d51308e90bCraig Mautner
3331f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void removeTimeoutsForActivityLocked(ActivityRecord r) {
3332b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4));
3333f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
3334f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
3335f333327782e14688e1c198c1192172d51308e90bCraig Mautner
333605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    final void scheduleResumeTopActivities() {
333734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) {
333834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
333934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
334005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
334105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
33420eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void removeSleepTimeouts() {
33430eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = false;
33440eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
33450eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
33460eea92c67b292b005c152641a12b920fe145826cCraig Mautner
33470eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final void scheduleSleepTimeout() {
33480eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
33490eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT);
33500eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
33510eea92c67b292b005c152641a12b920fe145826cCraig Mautner
33524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    @Override
33534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void onDisplayAdded(int displayId) {
3354d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        Slog.v(TAG, "Display added displayId=" + displayId);
33554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0));
33564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    @Override
33594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void onDisplayRemoved(int displayId) {
3360d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        Slog.v(TAG, "Display removed displayId=" + displayId);
33614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0));
33624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    @Override
33654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void onDisplayChanged(int displayId) {
3366d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        Slog.v(TAG, "Display changed displayId=" + displayId);
33674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0));
33684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void handleDisplayAddedLocked(int displayId) {
33714504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        boolean newDisplay;
33724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
33734504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            newDisplay = mActivityDisplays.get(displayId) == null;
33744504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            if (newDisplay) {
33754504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner                ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
33761a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                if (activityDisplay.mDisplay == null) {
33771a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                    Slog.w(TAG, "Display " + displayId + " gone before initialization complete");
33781a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                    return;
33791a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                }
33804504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner                mActivityDisplays.put(displayId, activityDisplay);
33814504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            }
33824504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        }
33834504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        if (newDisplay) {
33844504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            mWindowManager.onDisplayAdded(displayId);
33854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void handleDisplayRemovedLocked(int displayId) {
33894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
3390e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
3391e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (activityDisplay != null) {
3392e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
33934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
339434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    stacks.get(stackNdx).mActivityContainer.detachLocked();
33954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
3396e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplays.remove(displayId);
33974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
33984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mWindowManager.onDisplayRemoved(displayId);
34004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
34014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
34024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void handleDisplayChangedLocked(int displayId) {
34034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
3404e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
3405e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (activityDisplay != null) {
34064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                // TODO: Update the bounds.
34074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
34084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
34094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mWindowManager.onDisplayChanged(displayId);
34104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
34114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
34124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    StackInfo getStackInfo(ActivityStack stack) {
34134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        StackInfo info = new StackInfo();
34144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mWindowManager.getStackBounds(stack.mStackId, info.bounds);
34154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.displayId = Display.DEFAULT_DISPLAY;
34164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.stackId = stack.mStackId;
34174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
34184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<TaskRecord> tasks = stack.getAllTasks();
34194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final int numTasks = tasks.size();
34204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        int[] taskIds = new int[numTasks];
34214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        String[] taskNames = new String[numTasks];
34224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int i = 0; i < numTasks; ++i) {
34234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final TaskRecord task = tasks.get(i);
34244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            taskIds[i] = task.taskId;
34254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            taskNames[i] = task.origActivity != null ? task.origActivity.flattenToString()
34264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    : task.realActivity != null ? task.realActivity.flattenToString()
34274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    : task.getTopActivity() != null ? task.getTopActivity().packageName
34284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    : "unknown";
34294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
34304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.taskIds = taskIds;
34314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.taskNames = taskNames;
34324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return info;
34334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
34344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
34354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    StackInfo getStackInfoLocked(int stackId) {
34364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ActivityStack stack = getStack(stackId);
34374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (stack != null) {
34384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return getStackInfo(stack);
34394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
34404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return null;
34414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
34424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
34434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    ArrayList<StackInfo> getAllStackInfosLocked() {
34444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<StackInfo> list = new ArrayList<StackInfo>();
3445e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) {
3446e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
34474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int ndx = stacks.size() - 1; ndx >= 0; --ndx) {
34484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                list.add(getStackInfo(stacks.get(ndx)));
34494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
34504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
34514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return list;
34524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
34534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3454a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk    void showLockTaskToast() {
3455a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk        mLockTaskNotify.showToast(mLockTaskIsLocked);
3456a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk    }
3457a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk
3458299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner    void setLockTaskModeLocked(TaskRecord task, boolean isLocked, String reason) {
3459aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (task == null) {
34603bd90617ec07a1093139de39591a624b21468e46Christopher Tate            // Take out of lock task mode if necessary
34613bd90617ec07a1093139de39591a624b21468e46Christopher Tate            if (mLockTaskModeTask != null) {
34623bd90617ec07a1093139de39591a624b21468e46Christopher Tate                final Message lockTaskMsg = Message.obtain();
34633bd90617ec07a1093139de39591a624b21468e46Christopher Tate                lockTaskMsg.arg1 = mLockTaskModeTask.userId;
34643bd90617ec07a1093139de39591a624b21468e46Christopher Tate                lockTaskMsg.what = LOCK_TASK_END_MSG;
34653bd90617ec07a1093139de39591a624b21468e46Christopher Tate                mLockTaskModeTask = null;
34663bd90617ec07a1093139de39591a624b21468e46Christopher Tate                mHandler.sendMessage(lockTaskMsg);
34673bd90617ec07a1093139de39591a624b21468e46Christopher Tate            }
3468aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            return;
3469aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
3470aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (isLockTaskModeViolation(task)) {
3471aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            Slog.e(TAG, "setLockTaskMode: Attempt to start a second Lock Task Mode task.");
3472aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            return;
3473aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
3474aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        mLockTaskModeTask = task;
3475299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner        findTaskToMoveToFrontLocked(task, 0, null, reason);
3476aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        resumeTopActivitiesLocked();
34773bd90617ec07a1093139de39591a624b21468e46Christopher Tate
34783bd90617ec07a1093139de39591a624b21468e46Christopher Tate        final Message lockTaskMsg = Message.obtain();
347935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk        lockTaskMsg.obj = mLockTaskModeTask.intent.getComponent().getPackageName();
348035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk        lockTaskMsg.arg1 = mLockTaskModeTask.userId;
34815286d3ff47135976d66d67888cadca52ef2ab244justinzhang        lockTaskMsg.what = LOCK_TASK_START_MSG;
3482a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk        lockTaskMsg.arg2 = !isLocked ? 1 : 0;
34835286d3ff47135976d66d67888cadca52ef2ab244justinzhang        mHandler.sendMessage(lockTaskMsg);
3484aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
3485aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
3486aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    boolean isLockTaskModeViolation(TaskRecord task) {
3487aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        return mLockTaskModeTask != null && mLockTaskModeTask != task;
3488aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
3489aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
3490aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    void endLockTaskModeIfTaskEnding(TaskRecord task) {
3491aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (mLockTaskModeTask != null && mLockTaskModeTask == task) {
3492835495c1175cd159635997ecff4281eb51e72fe6Jason Monk            final Message lockTaskMsg = Message.obtain();
3493835495c1175cd159635997ecff4281eb51e72fe6Jason Monk            lockTaskMsg.arg1 = mLockTaskModeTask.userId;
3494835495c1175cd159635997ecff4281eb51e72fe6Jason Monk            lockTaskMsg.what = LOCK_TASK_END_MSG;
3495aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            mLockTaskModeTask = null;
3496835495c1175cd159635997ecff4281eb51e72fe6Jason Monk            mHandler.sendMessage(lockTaskMsg);
3497aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
3498aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
3499aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
3500aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    boolean isInLockTaskMode() {
3501aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        return mLockTaskModeTask != null;
3502aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
3503aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
3504ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    private final class ActivityStackSupervisorHandler extends Handler {
3505f333327782e14688e1c198c1192172d51308e90bCraig Mautner
3506ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public ActivityStackSupervisorHandler(Looper looper) {
3507ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            super(looper);
3508ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
3509ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
3510f333327782e14688e1c198c1192172d51308e90bCraig Mautner        void activityIdleInternal(ActivityRecord r) {
3511f333327782e14688e1c198c1192172d51308e90bCraig Mautner            synchronized (mService) {
3512f333327782e14688e1c198c1192172d51308e90bCraig Mautner                activityIdleInternalLocked(r != null ? r.appToken : null, true, null);
3513f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
35147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
35157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
3516ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        @Override
3517ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public void handleMessage(Message msg) {
3518ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            switch (msg.what) {
3519f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_TIMEOUT_MSG: {
35205eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
3521f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    if (mService.mDidDexOpt) {
3522f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.mDidDexOpt = false;
3523f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
3524f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        nmsg.obj = msg.obj;
3525f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
3526f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        return;
3527f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
3528f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // We don't at this point know if the activity is fullscreen,
3529f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // so we need to be conservative and assume it isn't.
3530f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
3531f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
3532f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_NOW_MSG: {
35335eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
3534f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
3535f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
353605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                case RESUME_TOP_ACTIVITY_MSG: {
353705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    synchronized (mService) {
353805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                        resumeTopActivitiesLocked();
353905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    }
354005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } break;
35410eea92c67b292b005c152641a12b920fe145826cCraig Mautner                case SLEEP_TIMEOUT_MSG: {
35420eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    synchronized (mService) {
35430eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        if (mService.isSleepingOrShuttingDown()) {
35440eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
35450eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            mSleepTimeout = true;
35460eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            checkReadyForSleepLocked();
35470eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        }
35480eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    }
35490eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } break;
35507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                case LAUNCH_TIMEOUT_MSG: {
35517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    if (mService.mDidDexOpt) {
35527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mService.mDidDexOpt = false;
35537ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
35547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        return;
35557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
35567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    synchronized (mService) {
35577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        if (mLaunchingActivity.isHeld()) {
35587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
35597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            if (VALIDATE_WAKE_LOCK_CALLER
35607ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                    && Binder.getCallingUid() != Process.myUid()) {
35617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                throw new IllegalStateException("Calling must be system uid");
35627ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            }
35637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            mLaunchingActivity.release();
35647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        }
35657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
35667ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                } break;
35674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                case HANDLE_DISPLAY_ADDED: {
35684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    handleDisplayAddedLocked(msg.arg1);
35694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                } break;
35704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                case HANDLE_DISPLAY_CHANGED: {
35714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    handleDisplayChangedLocked(msg.arg1);
35724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                } break;
35734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                case HANDLE_DISPLAY_REMOVED: {
35744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    handleDisplayRemovedLocked(msg.arg1);
35754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                } break;
3576e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                case CONTAINER_CALLBACK_VISIBILITY: {
3577e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    final ActivityContainer container = (ActivityContainer) msg.obj;
3578d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    final IActivityContainerCallback callback = container.mCallback;
3579d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    if (callback != null) {
3580d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        try {
3581d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                            callback.setVisible(container.asBinder(), msg.arg1 == 1);
3582d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        } catch (RemoteException e) {
3583d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        }
3584e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    }
3585d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                } break;
35865286d3ff47135976d66d67888cadca52ef2ab244justinzhang                case LOCK_TASK_START_MSG: {
35875286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    // When lock task starts, we disable the status bars.
35885286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    try {
358962515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        if (mLockTaskNotify == null) {
359062515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            mLockTaskNotify = new LockTaskNotify(mService.mContext);
359162515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        }
359262515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        mLockTaskNotify.show(true);
35932961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk                        mLockTaskIsLocked = msg.arg2 == 0;
35945286d3ff47135976d66d67888cadca52ef2ab244justinzhang                        if (getStatusBarService() != null) {
359562515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            int flags =
359662515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    StatusBarManager.DISABLE_MASK ^ StatusBarManager.DISABLE_BACK;
35972961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk                            if (!mLockTaskIsLocked) {
359862515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                flags ^= StatusBarManager.DISABLE_HOME
359962515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                        | StatusBarManager.DISABLE_RECENT;
360062515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            }
360162515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            getStatusBarService().disable(flags, mToken,
360262515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    mService.mContext.getPackageName());
36035286d3ff47135976d66d67888cadca52ef2ab244justinzhang                        }
360462515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG);
360535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                        if (getDevicePolicyManager() != null) {
360635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                            getDevicePolicyManager().notifyLockTaskModeChanged(true,
360762515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    (String)msg.obj, msg.arg1);
360835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                        }
36095286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    } catch (RemoteException ex) {
36105286d3ff47135976d66d67888cadca52ef2ab244justinzhang                        throw new RuntimeException(ex);
36115286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    }
3612b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner                } break;
36135286d3ff47135976d66d67888cadca52ef2ab244justinzhang                case LOCK_TASK_END_MSG: {
36145286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    // When lock task ends, we enable the status bars.
36155286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    try {
361662515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        if (getStatusBarService() != null) {
361762515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            getStatusBarService().disable(StatusBarManager.DISABLE_NONE, mToken,
361862515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    mService.mContext.getPackageName());
361962515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        }
362062515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        mWindowManager.reenableKeyguard(mToken);
362135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                        if (getDevicePolicyManager() != null) {
362235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                            getDevicePolicyManager().notifyLockTaskModeChanged(false, null,
362335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                                    msg.arg1);
362435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                        }
362562515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        if (mLockTaskNotify == null) {
362662515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            mLockTaskNotify = new LockTaskNotify(mService.mContext);
362762515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        }
362862515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        mLockTaskNotify.show(false);
362962515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        try {
363094cfd9d7c42287c18bde29aa1ae34944eb448f45Jason Monk                            boolean shouldLockKeyguard = Settings.Secure.getInt(
363162515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    mService.mContext.getContentResolver(),
363294cfd9d7c42287c18bde29aa1ae34944eb448f45Jason Monk                                    Settings.Secure.LOCK_TO_APP_EXIT_LOCKED) != 0;
36332961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk                            if (!mLockTaskIsLocked && shouldLockKeyguard) {
363462515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                mWindowManager.lockNow(null);
36357779bf1ce8243d9f856c05db3cc5a37a8227a970Jason Monk                                mWindowManager.dismissKeyguard();
3636e069779dea07c77fb858a403c42020e39b3d9c60Jason Monk                                new LockPatternUtils(mService.mContext)
3637e069779dea07c77fb858a403c42020e39b3d9c60Jason Monk                                        .requireCredentialEntry(UserHandle.USER_ALL);
363862515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            }
363962515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        } catch (SettingNotFoundException e) {
364062515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            // No setting, don't lock.
364162515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        }
36425286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    } catch (RemoteException ex) {
36435286d3ff47135976d66d67888cadca52ef2ab244justinzhang                        throw new RuntimeException(ex);
36445286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    }
3645b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner                } break;
3646d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                case CONTAINER_CALLBACK_TASK_LIST_EMPTY: {
3647d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    final ActivityContainer container = (ActivityContainer) msg.obj;
3648d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    final IActivityContainerCallback callback = container.mCallback;
3649d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    if (callback != null) {
3650d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        try {
3651d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                            callback.onAllActivitiesComplete(container.asBinder());
3652d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        } catch (RemoteException e) {
3653d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        }
3654d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    }
3655d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                } break;
3656d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                case CONTAINER_TASK_LIST_EMPTY_TIMEOUT: {
3657d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    synchronized (mService) {
3658d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                        Slog.w(TAG, "Timeout waiting for all activities in task to finish. " +
3659d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                                msg.obj);
3660ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                        final ActivityContainer container = (ActivityContainer) msg.obj;
3661ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                        container.mStack.finishAllActivitiesLocked(true);
3662ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                        container.onTaskListEmptyLocked();
3663d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    }
3664d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                } break;
3665bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                case LAUNCH_TASK_BEHIND_COMPLETE: {
3666bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                    synchronized (mService) {
3667bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        ActivityRecord r = ActivityRecord.forToken((IBinder) msg.obj);
3668bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        if (r != null) {
3669bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                            handleLaunchTaskBehindCompleteLocked(r);
3670bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        }
3671bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                    }
3672bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                } break;
3673ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
3674ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
3675ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
3676ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3677b081a59a0fdec88dd9b0f68b45c2f625f751d625Ying Wang    class ActivityContainer extends android.app.IActivityContainer.Stub {
36787f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner        final static int FORCE_NEW_TASK_FLAGS = Intent.FLAG_ACTIVITY_NEW_TASK |
3679e6d80f4ce433e16dc72ea3291801169eb507a695Craig Mautner                Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION;
36804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final int mStackId;
3681f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        IActivityContainerCallback mCallback = null;
36824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final ActivityStack mStack;
3683f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityRecord mParentActivity = null;
3684f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        String mIdString;
3685ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3686e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner        boolean mVisible = true;
3687e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner
36884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        /** Display this ActivityStack is currently on. Null if not attached to a Display. */
3689e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityDisplay mActivityDisplay;
36904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3691f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final static int CONTAINER_STATE_HAS_SURFACE = 0;
3692f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final static int CONTAINER_STATE_NO_SURFACE = 1;
3693f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final static int CONTAINER_STATE_FINISHING = 2;
3694f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        int mContainerState = CONTAINER_STATE_HAS_SURFACE;
3695f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3696f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer(int stackId) {
36974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            synchronized (mService) {
36984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                mStackId = stackId;
36994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                mStack = new ActivityStack(this);
3700f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mIdString = "ActivtyContainer{" + mStackId + "}";
370134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "Creating " + this);
37024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
3703ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner        }
3704ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3705e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        void attachToDisplayLocked(ActivityDisplay activityDisplay) {
370634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "attachToDisplayLocked: " + this
370734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    + " to display=" + activityDisplay);
3708e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mActivityDisplay = activityDisplay;
3709e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStack.mDisplayId = activityDisplay.mDisplayId;
3710e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStack.mStacks = activityDisplay.mStacks;
3711e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner
3712e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            activityDisplay.attachActivities(mStack);
3713df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mWindowManager.attachStack(mStackId, activityDisplay.mDisplayId);
37144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
37154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
37164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3717ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        public void attachToDisplay(int displayId) {
37184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            synchronized (mService) {
3719e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
3720e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                if (activityDisplay == null) {
37214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return;
37224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
3723e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                attachToDisplayLocked(activityDisplay);
37244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
37254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
37264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
37274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3728ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        public int getDisplayId() {
3729d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            synchronized (mService) {
3730d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                if (mActivityDisplay != null) {
3731d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    return mActivityDisplay.mDisplayId;
3732d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                }
3733e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
3734e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            return -1;
37354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
37364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3737ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        @Override
3738ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        public boolean injectEvent(InputEvent event) {
3739ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            final long origId = Binder.clearCallingIdentity();
3740ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            try {
3741d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                synchronized (mService) {
3742d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    if (mActivityDisplay != null) {
3743d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                        return mInputManagerInternal.injectInputEvent(event,
3744d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                                mActivityDisplay.mDisplayId,
3745d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                                InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
3746d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    }
3747ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                }
3748ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                return false;
3749ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            } finally {
3750ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                Binder.restoreCallingIdentity(origId);
3751ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            }
3752ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        }
3753ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown
3754f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
3755f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public void release() {
3756d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            synchronized (mService) {
3757d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                if (mContainerState == CONTAINER_STATE_FINISHING) {
3758d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    return;
3759d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                }
3760d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                mContainerState = CONTAINER_STATE_FINISHING;
3761d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner
3762d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                final Message msg =
3763d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                        mHandler.obtainMessage(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this);
3764ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                mHandler.sendMessageDelayed(msg, 2000);
3765d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner
3766d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                long origId = Binder.clearCallingIdentity();
3767d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                try {
3768ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                    mStack.finishAllActivitiesLocked(false);
37697f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner                    removePendingActivityLaunchesLocked(mStack);
3770d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                } finally {
3771d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    Binder.restoreCallingIdentity(origId);
3772d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                }
3773d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            }
3774f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3775f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
37766025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner        protected void detachLocked() {
377734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display="
377834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    + mActivityDisplay + " Callers=" + Debug.getCallers(2));
3779e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (mActivityDisplay != null) {
3780e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplay.detachActivitiesLocked(mStack);
3781e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplay = null;
3782e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mStack.mDisplayId = -1;
3783e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mStack.mStacks = null;
3784df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                mWindowManager.detachStack(mStackId);
37854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
37864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
37874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
37884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3789e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        public final int startActivity(Intent intent) {
3790df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mService.enforceNotIsolatedCaller("ActivityContainer.startActivity");
3791e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            int userId = mService.handleIncomingUser(Binder.getCallingPid(),
3792409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn                    Binder.getCallingUid(), mCurrentUser, false,
3793409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn                    ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null);
3794e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            // TODO: Switch to user app stacks here.
37957f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner            intent.addFlags(FORCE_NEW_TASK_FLAGS);
3796e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            String mimeType = intent.getType();
3797e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (mimeType == null && intent.getData() != null
3798e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    && "content".equals(intent.getData().getScheme())) {
3799e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mimeType = mService.getProviderMimeType(intent.getData(), userId);
3800e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
38011b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            return startActivityMayWait(null, -1, null, intent, mimeType, null, null, null, null, 0,
38021b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    0, null, null, null, null, userId, this, null);
38034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
38044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
38054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3806df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        public final int startActivityIntentSender(IIntentSender intentSender) {
3807df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender");
3808df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
3809df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            if (!(intentSender instanceof PendingIntentRecord)) {
3810df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                throw new IllegalArgumentException("Bad PendingIntent object");
3811df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            }
3812df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
3813df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            return ((PendingIntentRecord)intentSender).sendInner(0, null, null, null, null, null,
38147f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner                    null, 0, FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this);
3815df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        }
3816df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
3817247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        private void checkEmbeddedAllowedInner(Intent intent, String resolvedType) {
3818247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            int userId = mService.handleIncomingUser(Binder.getCallingPid(),
3819409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn                    Binder.getCallingUid(), mCurrentUser, false,
3820409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn                    ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null);
3821247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            if (resolvedType == null) {
3822247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                resolvedType = intent.getType();
3823247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                if (resolvedType == null && intent.getData() != null
3824247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                        && "content".equals(intent.getData().getScheme())) {
3825247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                    resolvedType = mService.getProviderMimeType(intent.getData(), userId);
3826247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                }
3827247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            }
38281b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId);
382905678d5a3136a747a2e7eaccca0ad148c52a2d00Craig Mautner            if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) {
3830247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                throw new SecurityException(
3831247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                        "Attempt to embed activity that has not set allowEmbedded=\"true\"");
3832247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            }
3833247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        }
3834247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner
3835247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        /** Throw a SecurityException if allowEmbedded is not true */
3836247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        @Override
3837247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        public final void checkEmbeddedAllowed(Intent intent) {
3838247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            checkEmbeddedAllowedInner(intent, null);
3839247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        }
3840247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner
3841247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        /** Throw a SecurityException if allowEmbedded is not true */
3842247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        @Override
3843247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        public final void checkEmbeddedAllowedIntentSender(IIntentSender intentSender) {
3844247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            if (!(intentSender instanceof PendingIntentRecord)) {
3845247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                throw new IllegalArgumentException("Bad PendingIntent object");
3846247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            }
3847247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender;
3848247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            checkEmbeddedAllowedInner(pendingIntent.key.requestIntent,
3849247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                    pendingIntent.key.requestResolvedType);
3850247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        }
3851247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner
3852df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        @Override
38534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        public IBinder asBinder() {
38544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return this;
38554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
38564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
38574504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        @Override
3858f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public void setSurface(Surface surface, int width, int height, int density) {
3859df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface");
38604504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        }
38614504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner
38624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ActivityStackSupervisor getOuter() {
38634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return ActivityStackSupervisor.this;
38644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
38654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3866d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        boolean isAttachedLocked() {
3867e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            return mActivityDisplay != null;
38684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
38694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
38704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        void getBounds(Point outBounds) {
3871d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            synchronized (mService) {
3872d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    if (mActivityDisplay != null) {
3873d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    mActivityDisplay.getBounds(outBounds);
3874d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                } else {
3875d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    outBounds.set(0, 0);
3876d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                }
38774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
3878ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner        }
387934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner
38806985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        // TODO: Make sure every change to ActivityRecord.visible results in a call to this.
3881e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner        void setVisible(boolean visible) {
3882e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner            if (mVisible != visible) {
3883e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                mVisible = visible;
3884e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                if (mCallback != null) {
3885e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0,
3886e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                            0 /* unused */, this).sendToTarget();
3887e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                }
3888e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner            }
3889e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner        }
3890e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner
38916985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        void setDrawn() {
38926985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        }
38936985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
38941b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        // You can always start a new task on a regular ActivityStack.
38951b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        boolean isEligibleForNewTasks() {
38961b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner            return true;
38971b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        }
38981b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner
3899d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        void onTaskListEmptyLocked() {
3900d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner        }
3901d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner
390234b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        @Override
390334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        public String toString() {
390434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            return mIdString + (mActivityDisplay == null ? "N" : "A");
390534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
3906ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner    }
3907ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3908f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    private class VirtualActivityContainer extends ActivityContainer {
3909f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        Surface mSurface;
39106985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        boolean mDrawn = false;
3911f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3912f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) {
3913f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            super(getNextStackId());
3914f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mParentActivity = parent;
3915f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mCallback = callback;
3916f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mContainerState = CONTAINER_STATE_NO_SURFACE;
3917d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}";
3918f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3919f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3920f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
3921f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public void setSurface(Surface surface, int width, int height, int density) {
3922f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            super.setSurface(surface, width, height, density);
3923f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3924f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            synchronized (mService) {
3925f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                final long origId = Binder.clearCallingIdentity();
3926f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                try {
3927f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    setSurfaceLocked(surface, width, height, density);
3928f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                } finally {
3929f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    Binder.restoreCallingIdentity(origId);
3930f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                }
3931f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3932f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3933f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3934f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        private void setSurfaceLocked(Surface surface, int width, int height, int density) {
3935f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mContainerState == CONTAINER_STATE_FINISHING) {
3936f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                return;
3937f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3938f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            VirtualActivityDisplay virtualActivityDisplay =
3939f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    (VirtualActivityDisplay) mActivityDisplay;
3940f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (virtualActivityDisplay == null) {
3941f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                virtualActivityDisplay =
39426985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                        new VirtualActivityDisplay(width, height, density);
3943f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mActivityDisplay = virtualActivityDisplay;
3944f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay);
3945f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                attachToDisplayLocked(virtualActivityDisplay);
3946f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3947f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3948f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mSurface != null) {
3949f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mSurface.release();
3950f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3951f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
39526985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            mSurface = surface;
3953f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (surface != null) {
3954f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mStack.resumeTopActivityLocked(null);
3955f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            } else {
3956f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mContainerState = CONTAINER_STATE_NO_SURFACE;
39576985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                ((VirtualActivityDisplay) mActivityDisplay).setSurface(null);
3958d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner                if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
3959a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    mStack.startPausingLocked(false, true, false, false);
3960d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner                }
3961f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
39626985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
3963d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            setSurfaceIfReadyLocked();
39646985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
3965f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display="
3966f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    + virtualActivityDisplay);
39676985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        }
3968f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
39696985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        @Override
3970d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        boolean isAttachedLocked() {
3971d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            return mSurface != null && super.isAttachedLocked();
3972d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner        }
3973d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner
3974d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner        @Override
39756985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        void setDrawn() {
39766985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            synchronized (mService) {
39776985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                mDrawn = true;
3978d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                setSurfaceIfReadyLocked();
39796985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            }
39806985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        }
39816985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
39821b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        // Never start a new task on an ActivityView if it isn't explicitly specified.
39831b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        @Override
39841b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        boolean isEligibleForNewTasks() {
39851b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner            return false;
39861b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        }
39871b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner
39886025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner        void onTaskListEmptyLocked() {
39896025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner            mHandler.removeMessages(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this);
39906025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner            detachLocked();
39916025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner            deleteActivityContainer(this);
39926025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner            mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget();
39936025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner        }
39946025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner
3995d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        private void setSurfaceIfReadyLocked() {
3996d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn +
39976985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                    " mContainerState=" + mContainerState + " mSurface=" + mSurface);
39986985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) {
39996985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface);
40006985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                mContainerState = CONTAINER_STATE_HAS_SURFACE;
40016985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            }
4002f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
4003f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    }
4004f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
40054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** Exactly one of these classes per Display in the system. Capable of holding zero or more
40064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner     * attached {@link ActivityStack}s */
4007f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    class ActivityDisplay {
40084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        /** Actual Display this object tracks. */
400934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        int mDisplayId;
401034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        Display mDisplay;
401134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        DisplayInfo mDisplayInfo = new DisplayInfo();
40124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
40134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        /** All of the stacks on this display. Order matters, topmost stack is in front of all other
40144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner         * stacks, bottommost behind. Accessed directly by ActivityManager package classes */
4015e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        final ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
40164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
40174b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        ActivityRecord mVisibleBehindActivity;
4018ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
4019f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityDisplay() {
4020f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
40214504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner
40221a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner        // After instantiation, check that mDisplay is not null before using this. The alternative
40231a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner        // is for this to throw an exception if mDisplayManager.getDisplay() returns null.
4024e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityDisplay(int displayId) {
40251a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner            final Display display = mDisplayManager.getDisplay(displayId);
40261a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner            if (display == null) {
40271a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                return;
40281a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner            }
40291a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner            init(display);
40304504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        }
40314504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner
4032f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        void init(Display display) {
40334504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            mDisplay = display;
40344504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            mDisplayId = display.getDisplayId();
40354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplay.getDisplayInfo(mDisplayInfo);
40364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
40374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
40384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        void attachActivities(ActivityStack stack) {
4039e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (DEBUG_STACK) Slog.v(TAG, "attachActivities: attaching " + stack + " to displayId="
4040e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    + mDisplayId);
4041e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStacks.add(stack);
40424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
40434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
4044e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        void detachActivitiesLocked(ActivityStack stack) {
404534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            if (DEBUG_STACK) Slog.v(TAG, "detachActivitiesLocked: detaching " + stack
4046e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    + " from displayId=" + mDisplayId);
4047e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStacks.remove(stack);
40484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
40494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
40504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        void getBounds(Point bounds) {
40514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplay.getDisplayInfo(mDisplayInfo);
40524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            bounds.x = mDisplayInfo.appWidth;
40534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            bounds.y = mDisplayInfo.appHeight;
4054ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner        }
405534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner
40564b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        void setVisibleBehindActivity(ActivityRecord r) {
40574b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            mVisibleBehindActivity = r;
4058ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
4059ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
40604b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        boolean hasVisibleBehindActivity() {
40614b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            return mVisibleBehindActivity != null;
4062ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
4063ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
406434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        @Override
406534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        public String toString() {
4066f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}";
4067f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
4068f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    }
4069f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4070f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    class VirtualActivityDisplay extends ActivityDisplay {
4071f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        VirtualDisplay mVirtualDisplay;
4072f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
40736985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        VirtualActivityDisplay(int width, int height, int density) {
4074f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
4075c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, null,
4076c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                    VIRTUAL_DISPLAY_BASE_NAME, width, height, density, null,
4077c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                    DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
4078c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                    DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, null, null);
4079f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4080f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            init(mVirtualDisplay.getDisplay());
4081f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4082f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mWindowManager.handleDisplayAdded(mDisplayId);
4083f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
4084f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4085f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        void setSurface(Surface surface) {
4086f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mVirtualDisplay != null) {
4087f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mVirtualDisplay.setSurface(surface);
4088f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
4089f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
4090f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4091f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
4092f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        void detachActivitiesLocked(ActivityStack stack) {
4093f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            super.detachActivitiesLocked(stack);
4094f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mVirtualDisplay != null) {
4095f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mVirtualDisplay.release();
4096f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mVirtualDisplay = null;
4097f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
4098f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
4099f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4100f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
4101f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public String toString() {
4102f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            return "VirtualActivityDisplay={" + mDisplayId + "}";
410334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
4104ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner    }
410558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
410658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima    private boolean isLeanbackOnlyDevice() {
410758e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        boolean onLeanbackOnly = false;
410858e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        try {
410958e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima            onLeanbackOnly = AppGlobals.getPackageManager().hasSystemFeature(
411058e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima                    PackageManager.FEATURE_LEANBACK_ONLY);
411158e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        } catch (RemoteException e) {
411258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima            // noop
411358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        }
411458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
411558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        return onLeanbackOnly;
411658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima    }
4117270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
4118