ActivityStackSupervisor.java revision 30bd3bb77b8bd1ac70723bcf7f1017fc40ea89b2
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;
276170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_RESULTS;
280eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_STACK;
292420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_SWITCH;
308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_TASKS;
318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING;
3205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautnerimport static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG;
338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG;
3484984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
3584984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
3684984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE;
378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
382420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity;
3923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager;
40ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.app.ActivityManager.StackInfo;
4123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions;
4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals;
434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainer;
444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainerCallback;
45ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager;
4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread;
4723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent;
481b012d302b56b4adf950035136d1d191a1936d5aJeff Haoimport android.app.ProfilerInfo;
4920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
5023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
512420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo;
525286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport android.app.StatusBarManager;
5335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monkimport android.app.admin.IDevicePolicyManager;
5423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
552219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
5623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
572219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
5823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
592219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
6023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
6123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
6223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
6323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.graphics.Point;
654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager;
664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager.DisplayListener;
674504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.DisplayManagerGlobal;
684504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.VirtualDisplay;
69ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManager;
70ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManagerInternal;
7123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
73b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug;
74ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler;
7523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
762219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
772420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message;
7823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
790eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport android.os.PowerManager;
807ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautnerimport android.os.Process;
818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
825286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport android.os.ServiceManager;
8323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
846170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle;
8562515beee67307d8859beec521b7baedfa54b2b5Jason Monkimport android.provider.Settings;
8662515beee67307d8859beec521b7baedfa54b2b5Jason Monkimport android.provider.Settings.SettingNotFoundException;
8791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionSession;
8889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.util.ArraySet;
892420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog;
908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseArray;
922219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseIntArray;
94ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.view.Display;
954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.view.DisplayInfo;
96ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.view.InputEvent;
974504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.view.Surface;
9823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
9991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
10085d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackbornimport com.android.internal.content.ReferrerIntent;
101cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe;
1025286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport com.android.internal.statusbar.IStatusBarService;
103e069779dea07c77fb858a403c42020e39b3d9c60Jason Monkimport com.android.internal.widget.LockPatternUtils;
104ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport com.android.server.LocalServices;
1052420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
106ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService;
10723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
1085286d3ff47135976d66d67888cadca52ef2ab244justinzhang
1098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
1108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
111270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
1122219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
1138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
114270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerpublic final class ActivityStackSupervisor implements DisplayListener {
116de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG = ActivityManagerService.DEBUG || false;
117de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_ADD_REMOVE = DEBUG || false;
118de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_APP = DEBUG || false;
119d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner    static final boolean DEBUG_CONTAINERS = DEBUG || false;
120b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner    static final boolean DEBUG_IDLE = DEBUG || false;
12189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    static final boolean DEBUG_RELEASE = DEBUG || false;
122d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner    static final boolean DEBUG_SAVED_STATE = DEBUG || false;
123cc12f28e5dc6bd027971c995c7aab63dadcc0d35Winson Chung    static final boolean DEBUG_SCREENSHOTS = DEBUG || false;
12430bd3bb77b8bd1ac70723bcf7f1017fc40ea89b2Craig Mautner    static final boolean DEBUG_STATES = DEBUG || false;
12589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    static final boolean DEBUG_VISIBLE_BEHIND = DEBUG || false;
1262420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1272219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
128270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
129f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** How long we wait until giving up on the last activity telling us it is idle. */
130f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_TIMEOUT = 10*1000;
131f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1320eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** How long we can hold the sleep wake lock before giving up. */
1330eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT = 5*1000;
1340eea92c67b292b005c152641a12b920fe145826cCraig Mautner
1357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // How long we can hold the launch wake lock before giving up.
1367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT = 10*1000;
1377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
13805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG;
13905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1;
14005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2;
1410eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3;
1427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4;
1434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5;
1444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6;
1454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7;
146e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner    static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8;
1475286d3ff47135976d66d67888cadca52ef2ab244justinzhang    static final int LOCK_TASK_START_MSG = FIRST_SUPERVISOR_STACK_MSG + 9;
1485286d3ff47135976d66d67888cadca52ef2ab244justinzhang    static final int LOCK_TASK_END_MSG = FIRST_SUPERVISOR_STACK_MSG + 10;
149b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner    static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 11;
1504c07d0246fb37e6a77be2c5cdcdf55a989b90f75Craig Mautner    static final int CONTAINER_TASK_LIST_EMPTY_TIMEOUT = FIRST_SUPERVISOR_STACK_MSG + 12;
151bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_STACK_MSG + 13;
1524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
1534504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner    private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay";
1547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
15562515beee67307d8859beec521b7baedfa54b2b5Jason Monk    private static final String LOCK_TASK_TAG = "Lock-to-App";
15662515beee67307d8859beec521b7baedfa54b2b5Jason Monk
1575286d3ff47135976d66d67888cadca52ef2ab244justinzhang    /** Status Bar Service **/
1585286d3ff47135976d66d67888cadca52ef2ab244justinzhang    private IBinder mToken = new Binder();
1595286d3ff47135976d66d67888cadca52ef2ab244justinzhang    private IStatusBarService mStatusBarService;
16035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk    private IDevicePolicyManager mDevicePolicyManager;
1615286d3ff47135976d66d67888cadca52ef2ab244justinzhang
1627ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // For debugging to make sure the caller when acquiring/releasing our
1637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // wake lock is the system process.
1647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final boolean VALIDATE_WAKE_LOCK_CALLER = false;
165f333327782e14688e1c198c1192172d51308e90bCraig Mautner
166270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
167270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
168ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ActivityStackSupervisorHandler mHandler;
169ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
170ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** Short cut */
171ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    WindowManagerService mWindowManager;
1724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    DisplayManager mDisplayManager;
173ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
1748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
175d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner    private int mLastStackId = HOME_STACK_ID;
1768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
1788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
1798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
1808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1812420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
1822420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
1832420ead0326bfd2587da6231be419e758dba1930Craig Mautner
184e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner    /** The stack containing the launcher app. Assumed to always be attached to
185e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner     * Display.DEFAULT_DISPLAY. */
1862219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
18720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
188e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner    /** The stack currently receiving input or launching the next activity. */
18929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    private ActivityStack mFocusedStack;
1908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** If this is the same as mFocusedStack then the activity on the top of the focused stack has
1924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner     * been resumed. If stacks are changing position this will hold the old stack until the new
193e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner     * stack becomes resumed after which it will be set to mFocusedStack. */
1944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    private ActivityStack mLastFocusedStack;
195de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
196de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are waiting for a new activity to become visible before completing
197de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * whatever operation they are supposed to do. */
198de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();
199de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
200ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next visible activity. */
201ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
202ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
203ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
204ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next launched activity. */
205ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
206ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
207ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
208de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are ready to be stopped, but waiting for the next activity to
209de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * settle down before doing so. */
210de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();
211de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
212f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of activities that are ready to be finished, but waiting for the previous activity to
213f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * settle down before doing so.  It contains ActivityRecord objects. */
214f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();
215f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2160eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** List of activities that are in the process of going to sleep. */
2170eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>();
2180eea92c67b292b005c152641a12b920fe145826cCraig Mautner
219f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** Used on user changes */
220f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>();
221f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2221a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    /** Used to queue up any background users being started */
2231a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    final ArrayList<UserStartedState> mStartingBackgroundUsers = new ArrayList<UserStartedState>();
2241a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani
225de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity
226de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * is being brought in front of us. */
227de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean mUserLeaving = false;
228de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2290eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** Set when we have taken too long waiting to go to sleep. */
2300eea92c67b292b005c152641a12b920fe145826cCraig Mautner    boolean mSleepTimeout = false;
2310eea92c67b292b005c152641a12b920fe145826cCraig Mautner
23258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima    /** Indicates if we are running on a Leanback-only (TV) device. Only initialized after
23358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima     * setWindowManager is called. **/
23458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima    private boolean mLeanbackOnlyDevice;
23558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
2360eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /**
2377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * We don't want to allow the device to go to sleep while in the process
2387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * of launching an activity.  This is primarily to allow alarm intent
2397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * receivers to launch an activity and get that to run before the device
2407ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * goes back to sleep.
2417ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     */
2422c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    PowerManager.WakeLock mLaunchingActivity;
2437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2447ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    /**
2450eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * Set when the system is going to sleep, until we have
2460eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * successfully paused the current activity and released our wake lock.
2470eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * At that point the system is allowed to actually sleep.
2480eea92c67b292b005c152641a12b920fe145826cCraig Mautner     */
2492c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    PowerManager.WakeLock mGoingToSleep;
2500eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2514f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner    /** Stack id of the front stack when user switched, indexed by userId. */
2524f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner    SparseIntArray mUserStackInFront = new SparseIntArray(2);
25393529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
2544504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner    // TODO: Add listener for removal of references.
2554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
256d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner    private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>();
2574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
2584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** Mapping from displayId to display current state */
259f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    private final SparseArray<ActivityDisplay> mActivityDisplays =
260f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            new SparseArray<ActivityDisplay>();
2614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
262ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown    InputManagerInternal mInputManagerInternal;
263ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown
264aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    /** If non-null then the task specified remains in front and no other tasks may be started
265aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner     * until the task exits or #stopLockTaskMode() is called. */
266d7b8621bde44857ebb07130693a00f5f777887d4Jason Monk    TaskRecord mLockTaskModeTask;
267a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk    /** Whether lock task has been entered by an authorized app and cannot
268a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk     * be exited. */
269a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk    private boolean mLockTaskIsLocked;
27062515beee67307d8859beec521b7baedfa54b2b5Jason Monk    /**
27162515beee67307d8859beec521b7baedfa54b2b5Jason Monk     * Notifies the user when entering/exiting lock-task.
27262515beee67307d8859beec521b7baedfa54b2b5Jason Monk     */
27362515beee67307d8859beec521b7baedfa54b2b5Jason Monk    private LockTaskNotify mLockTaskNotify;
274aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
275ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    final ArrayList<PendingActivityLaunch> mPendingActivityLaunches
276ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            = new ArrayList<PendingActivityLaunch>();
277ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
27842d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner    /** Used to keep resumeTopActivityLocked() from being entered recursively */
27942d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner    boolean inResumeTopActivity;
28042d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner
281ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    /**
282ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner     * Description of a request to start a new activity, which has been held
283ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner     * due to app switches being disabled.
284ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner     */
285ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    static class PendingActivityLaunch {
286ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        final ActivityRecord r;
287ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        final ActivityRecord sourceRecord;
288ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        final int startFlags;
289ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        final ActivityStack stack;
290ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
291ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord,
292ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                int _startFlags, ActivityStack _stack) {
293ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            r = _r;
294ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            sourceRecord = _sourceRecord;
295ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            startFlags = _startFlags;
296ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            stack = _stack;
297ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        }
298ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    }
299ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
3004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service) {
301270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
3022c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown        mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper());
3032c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
3042c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
3052c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
3062c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
3072c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize our wakelocks afterwards.
3082c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
3092c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    void initPowerManagement() {
3104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE);
3110eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
3127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity =
3137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
3147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.setReferenceCounted(false);
3152219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
3162219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
3175286d3ff47135976d66d67888cadca52ef2ab244justinzhang    // This function returns a IStatusBarService. The value is from ServiceManager.
3185286d3ff47135976d66d67888cadca52ef2ab244justinzhang    // getService and is cached.
3195286d3ff47135976d66d67888cadca52ef2ab244justinzhang    private IStatusBarService getStatusBarService() {
3205286d3ff47135976d66d67888cadca52ef2ab244justinzhang        synchronized (mService) {
3215286d3ff47135976d66d67888cadca52ef2ab244justinzhang            if (mStatusBarService == null) {
3225286d3ff47135976d66d67888cadca52ef2ab244justinzhang                mStatusBarService = IStatusBarService.Stub.asInterface(
3235286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    ServiceManager.checkService(Context.STATUS_BAR_SERVICE));
3245286d3ff47135976d66d67888cadca52ef2ab244justinzhang                if (mStatusBarService == null) {
3255286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    Slog.w("StatusBarManager", "warning: no STATUS_BAR_SERVICE");
3265286d3ff47135976d66d67888cadca52ef2ab244justinzhang                }
3275286d3ff47135976d66d67888cadca52ef2ab244justinzhang            }
3285286d3ff47135976d66d67888cadca52ef2ab244justinzhang            return mStatusBarService;
3295286d3ff47135976d66d67888cadca52ef2ab244justinzhang        }
3305286d3ff47135976d66d67888cadca52ef2ab244justinzhang    }
3315286d3ff47135976d66d67888cadca52ef2ab244justinzhang
33235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk    private IDevicePolicyManager getDevicePolicyManager() {
33335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk        synchronized (mService) {
33435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk            if (mDevicePolicyManager == null) {
33535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                mDevicePolicyManager = IDevicePolicyManager.Stub.asInterface(
33635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                    ServiceManager.checkService(Context.DEVICE_POLICY_SERVICE));
33735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                if (mDevicePolicyManager == null) {
33835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                    Slog.w(TAG, "warning: no DEVICE_POLICY_SERVICE");
33935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                }
34035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk            }
34135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk            return mDevicePolicyManager;
34235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk        }
34335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk    }
34435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk
345ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void setWindowManager(WindowManagerService wm) {
3464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
3474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mWindowManager = wm;
3484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplayManager =
3504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    (DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
3514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplayManager.registerDisplayListener(this, null);
3524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            Display[] displays = mDisplayManager.getDisplays();
3544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) {
3554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final int displayId = displays[displayNdx].getDisplayId();
356e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
3571a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                if (activityDisplay.mDisplay == null) {
3581a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                    throw new IllegalStateException("Default Display does not exist");
3591a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                }
360e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplays.put(displayId, activityDisplay);
3614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
3624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
363f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            createStackOnDisplay(HOME_STACK_ID, Display.DEFAULT_DISPLAY);
3644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mHomeStack = mFocusedStack = mLastFocusedStack = getStack(HOME_STACK_ID);
365ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown
366ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
36758e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
36858e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima            // Initialize this here, now that we can get a valid reference to PackageManager.
36958e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima            mLeanbackOnlyDevice = isLeanbackOnlyDevice();
3704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
371270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
372270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
3738de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi    void notifyActivityDrawnForKeyguard() {
3745314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner        if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen("");
3758de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        mWindowManager.notifyActivityDrawnForKeyguard();
376270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
377270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
378ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    ActivityStack getFocusedStack() {
3794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return mFocusedStack;
38020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
38120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
382de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getLastStack() {
3834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return mLastFocusedStack;
3842219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
3852219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
3864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    // TODO: Split into two methods isFrontStack for any visible stack and isFrontmostStack for the
3874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    // top of all visible stacks.
388de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean isFrontStack(ActivityStack stack) {
389df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
390df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        if (parent != null) {
391df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            stack = parent.task.stack;
392df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        }
393e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ArrayList<ActivityStack> stacks = stack.mStacks;
3944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (stacks != null && !stacks.isEmpty()) {
3954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return stack == stacks.get(stacks.size() - 1);
3964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
3974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return false;
39820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
39920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
400de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void moveHomeStack(boolean toFront) {
401e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ArrayList<ActivityStack> stacks = mHomeStack.mStacks;
4024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        int topNdx = stacks.size() - 1;
4034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (topNdx <= 0) {
4044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return;
4054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
4064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ActivityStack topStack = stacks.get(topNdx);
4074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final boolean homeInFront = topStack == mHomeStack;
4084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (homeInFront != toFront) {
4094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mLastFocusedStack = topStack;
4104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            stacks.remove(mHomeStack);
4114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            stacks.add(toFront ? topNdx : 0, mHomeStack);
4124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mFocusedStack = stacks.get(topNdx);
4134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: topStack old=" + topStack + " new="
4144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    + mFocusedStack);
415de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
416de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
417de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
41884984faf530e525b066e28710d0f9beb32142ec5Craig Mautner    void moveHomeStackTaskToTop(int homeStackTaskType) {
41984984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
42084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            mWindowManager.showRecentApps();
42184984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            return;
42284984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        }
42369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        moveHomeStack(true);
42484984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        mHomeStack.moveHomeStackTaskToTop(homeStackTaskType);
4258e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    }
4268e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner
42784984faf530e525b066e28710d0f9beb32142ec5Craig Mautner    boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev) {
4287622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn        if (!mService.mBooting && !mService.mBooted) {
4297622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn            // Not ready yet!
4307622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn            return false;
4317622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn        }
4327622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn
43384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
43484984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            mWindowManager.showRecentApps();
43584984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            return false;
43684984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        }
43784984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        moveHomeStackTaskToTop(homeStackTaskType);
43869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (prev != null) {
43984984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
44069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
44184984faf530e525b066e28710d0f9beb32142ec5Craig Mautner
442a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner        ActivityRecord r = mHomeStack.topRunningActivityLocked(null);
44384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        // if (r != null && (r.isHomeActivity() || r.isRecentsActivity())) {
444719e621186adc1ba5a365bddea01cbe73bb26b02Craig Mautner        if (r != null && r.isHomeActivity()) {
445a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner            mService.setFocusedActivityLocked(r);
44605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            return resumeTopActivitiesLocked(mHomeStack, prev, null);
44769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
44869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        return mService.startHomeActivityLocked(mCurrentUser);
44969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    }
45069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner
4518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
452e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        int numDisplays = mActivityDisplays.size();
4534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
454e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
4554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
4564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ActivityStack stack = stacks.get(stackNdx);
4574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                TaskRecord task = stack.taskForIdLocked(id);
4584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (task != null) {
4594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return task;
4604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
4618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
4628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
4638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
4648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
4658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
4666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    ActivityRecord isInAnyStackLocked(IBinder token) {
467e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        int numDisplays = mActivityDisplays.size();
4684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
469e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
4704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
4714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord r = stacks.get(stackNdx).isInStackLocked(token);
4724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (r != null) {
4734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return r;
4744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
4756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
4766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
4776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return null;
4786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
4796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
480ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    void setNextTaskId(int taskId) {
481ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        if (taskId > mCurTaskId) {
482ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            mCurTaskId = taskId;
483ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
484ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
485ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
4868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
4878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
4888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
4898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
4908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
4918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
4928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
4938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
4948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
4958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
496de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityRecord resumedAppLocked() {
497ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        ActivityStack stack = getFocusedStack();
498ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (stack == null) {
499ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return null;
500ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
501de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityRecord resumedActivity = stack.mResumedActivity;
502de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (resumedActivity == null || resumedActivity.app == null) {
503de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            resumedActivity = stack.mPausingActivity;
504de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (resumedActivity == null || resumedActivity.app == null) {
505de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resumedActivity = stack.topRunningActivityLocked(null);
506de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
507de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
508de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return resumedActivity;
509de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
510de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
511ff072725e39b8c6928d6ca2d7e263d7d081a2288Dianne Hackborn    boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
51220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
5134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        boolean didSomething = false;
514e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
515e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
5164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
5184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (!isFrontStack(stack)) {
5194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    continue;
5204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
5214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ActivityRecord hr = stack.topRunningActivityLocked(null);
5224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (hr != null) {
5234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (hr.app == null && app.uid == hr.info.applicationInfo.uid
5244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            && processName.equals(hr.processName)) {
5254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        try {
5262c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount                            if (realStartActivityLocked(hr, app, true, true)) {
5274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                                didSomething = true;
5284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            }
529ff072725e39b8c6928d6ca2d7e263d7d081a2288Dianne Hackborn                        } catch (RemoteException e) {
5304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            Slog.w(TAG, "Exception in new application when starting activity "
5314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                                  + hr.intent.getComponent().flattenToShortString(), e);
5324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            throw e;
53320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
53420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
53520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
53620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
53720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
538b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (!didSomething) {
539b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
540b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        }
54120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
54220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
54320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
54420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
545e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
546e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
5474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
54934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                if (!isFrontStack(stack) || stack.numActivities() == 0) {
5504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    continue;
5514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
5524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord resumedActivity = stack.mResumedActivity;
5534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (resumedActivity == null || !resumedActivity.idle) {
55434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    if (DEBUG_STATES) Slog.d(TAG, "allResumedActivitiesIdle: stack="
55534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                             + stack.mStackId + " " + resumedActivity + " not idle");
5564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return false;
5574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
55820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
55920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
56020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
56120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
56220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
563de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesComplete() {
564e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
565e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
5664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
5684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
5694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    final ActivityRecord r = stack.mResumedActivity;
5704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (r != null && r.state != ActivityState.RESUMED) {
5714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        return false;
5724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
573de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
574de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
575de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
576de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        // TODO: Not sure if this should check if all Paused are complete too.
5774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (DEBUG_STACK) Slog.d(TAG,
5784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                "allResumedActivitiesComplete: mLastFocusedStack changing from=" +
5794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                mLastFocusedStack + " to=" + mFocusedStack);
5804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mLastFocusedStack = mFocusedStack;
581de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
582de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
583de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
584de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesVisible() {
585e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
586e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
5874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
5894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord r = stack.mResumedActivity;
5904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (r != null && (!r.nowVisible || r.waitingVisible)) {
5914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return false;
5924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
593de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
594de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
595de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
596de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
597de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
5982acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner    /**
5992acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * Pause all activities in either all of the stacks or just the back stacks.
6002acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving().
6012acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @return true if any activity was paused as a result of this call.
6022acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     */
603a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn    boolean pauseBackStacks(boolean userLeaving, boolean resuming, boolean dontWait) {
604cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        boolean someActivityPaused = false;
605e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
606e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
6074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
6084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
6094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (!isFrontStack(stack) && stack.mResumedActivity != null) {
6104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack +
6114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            " mResumedActivity=" + stack.mResumedActivity);
612a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    someActivityPaused |= stack.startPausingLocked(userLeaving, false, resuming,
613a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                            dontWait);
6144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
615cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
616cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
617cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        return someActivityPaused;
618cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
619cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
620de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allPausedActivitiesComplete() {
621ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        boolean pausing = true;
622e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
623e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
6244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
6254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
6264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord r = stack.mPausingActivity;
6274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (r != null && r.state != ActivityState.PAUSED
6284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        && r.state != ActivityState.STOPPED
6294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        && r.state != ActivityState.STOPPING) {
6304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (DEBUG_STATES) {
6314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state);
6324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        pausing = false;
6334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    } else {
6344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        return false;
6354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
636ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
637de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
638de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
639ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return pausing;
640de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
641de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
642a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn    void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping,
643a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            boolean resuming, boolean dontWait) {
6448a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock        // TODO: Put all stacks in supervisor and iterate through them instead.
645df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
646df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
647df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
648df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                final ActivityStack stack = stacks.get(stackNdx);
649df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                if (stack.mResumedActivity != null &&
650df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                        stack.mActivityContainer.mParentActivity == parent) {
651a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    stack.startPausingLocked(userLeaving, uiSleeping, resuming, dontWait);
652df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                }
653df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            }
654df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        }
655df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner    }
656df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
657ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityVisibleLocked(ActivityRecord r) {
6586cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        sendWaitingVisibleReportLocked(r);
6596cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn    }
6606cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn
6616cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn    void sendWaitingVisibleReportLocked(ActivityRecord r) {
6626cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        boolean changed = false;
663858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
664ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            WaitResult w = mWaitingActivityVisible.get(i);
6656cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn            if (w.who == null) {
6666cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                changed = true;
6676cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.timeout = false;
6686cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                if (r != null) {
6696cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                    w.who = new ComponentName(r.info.packageName, r.info.name);
6706cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                }
6716cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
6726cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.thisTime = w.totalTime;
673ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
674ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
6756cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        if (changed) {
6766cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn            mService.notifyAll();
6776cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        }
678ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
679ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
680ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
681ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            long thisTime, long totalTime) {
6826cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        boolean changed = false;
683ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
684c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner            WaitResult w = mWaitingActivityLaunched.remove(i);
6856cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn            if (w.who == null) {
6866cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                changed = true;
6876cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.timeout = timeout;
6886cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                if (r != null) {
6896cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                    w.who = new ComponentName(r.info.packageName, r.info.name);
6906cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                }
6916cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.thisTime = thisTime;
6926cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                w.totalTime = totalTime;
693ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
694ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
6956cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        if (changed) {
6966cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn            mService.notifyAll();
6976cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn        }
698ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
699ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
70029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    ActivityRecord topRunningActivityLocked() {
7011602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        final ActivityStack focusedStack = getFocusedStack();
7021602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        ActivityRecord r = focusedStack.topRunningActivityLocked(null);
7031602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        if (r != null) {
7041602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            return r;
70529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
7061602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner
7074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        // Return to the home stack.
708e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        final ArrayList<ActivityStack> stacks = mHomeStack.mStacks;
7094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
7104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final ActivityStack stack = stacks.get(stackNdx);
711ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (stack != focusedStack && isFrontStack(stack)) {
71229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                r = stack.topRunningActivityLocked(null);
71329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                if (r != null) {
71429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    return r;
71529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                }
71629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
71729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
71829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        return null;
71929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
72029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
72109233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn    void getTasksLocked(int maxNum, List<RunningTaskInfo> list, int callingUid, boolean allowed) {
722c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // Gather all of the running tasks for each stack into runningTaskLists.
7234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<ArrayList<RunningTaskInfo>> runningTaskLists =
7244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                new ArrayList<ArrayList<RunningTaskInfo>>();
725e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        final int numDisplays = mActivityDisplays.size();
7264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
727e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
7284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
7294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
7304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>();
7314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                runningTaskLists.add(stackTaskList);
73209233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn                stack.getTasksLocked(stackTaskList, callingUid, allowed);
73320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
73420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
735c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner
736c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // The lists are already sorted from most recent to oldest. Just pull the most recent off
737c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // each list and add it to list. Stop when all lists are empty or maxNum reached.
738c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        while (maxNum > 0) {
739c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            long mostRecentActiveTime = Long.MIN_VALUE;
740c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            ArrayList<RunningTaskInfo> selectedStackList = null;
7414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numTaskLists = runningTaskLists.size();
7424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numTaskLists; ++stackNdx) {
7434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists.get(stackNdx);
744c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                if (!stackTaskList.isEmpty()) {
745c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    final long lastActiveTime = stackTaskList.get(0).lastActiveTime;
746c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    if (lastActiveTime > mostRecentActiveTime) {
747c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        mostRecentActiveTime = lastActiveTime;
748c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        selectedStackList = stackTaskList;
749c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    }
750c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                }
751c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
752c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            if (selectedStackList != null) {
753c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                list.add(selectedStackList.remove(0));
754c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                --maxNum;
755c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            } else {
756c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                break;
757c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
758c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        }
75920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
76020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
7621b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            ProfilerInfo profilerInfo, int userId) {
76323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
76523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
76623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
77123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
77623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
77923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
78323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
78423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
78523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
78723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
79223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
7971b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            if (profilerInfo != null) {
79823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
7991b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo);
80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
8062219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
80784984faf530e525b066e28710d0f9beb32142ec5Craig Mautner        moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE);
80895465200b0f652c48d40ca1028238763dd647900Dianne Hackborn        startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null,
80995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                0, 0, 0, null, false, null, null, null);
8108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
8118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
81391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            String callingPackage, Intent intent, String resolvedType,
81491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
8151b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            IBinder resultTo, String resultWho, int requestCode, int startFlags,
8161b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            ProfilerInfo profilerInfo, WaitResult outResult, Configuration config,
81789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            Bundle options, int userId, IActivityContainer iContainer, TaskRecord inTask) {
81823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
82023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
82223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
82423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
82723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
8291b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                profilerInfo, userId);
83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
831e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityContainer container = (ActivityContainer)iContainer;
83223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
83395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            final int realCallingPid = Binder.getCallingPid();
83495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            final int realCallingUid = Binder.getCallingUid();
83523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
83623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
83823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
83995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                callingPid = realCallingPid;
84095465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                callingUid = realCallingUid;
84123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
84223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
845e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ActivityStack stack;
846e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (container == null || container.mStack.isOnHomeDisplay()) {
847e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                stack = getFocusedStack();
848e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            } else {
849e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                stack = container.mStack;
850e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
851de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            stack.mConfigWillChange = config != null
85223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
85323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
854de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    "Starting activity when config will change = " + stack.mConfigWillChange);
85523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
85623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
85723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
85823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
85923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
86023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
86123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
86223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
86323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
86423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
86523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
86695465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                        int appCallingUid = callingUid;
86723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
86823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
86923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
87095465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                                appCallingUid = callerApp.info.uid;
87123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
87223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
87376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                                      + " (pid=" + callingPid + ") when starting: "
87423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
87523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
87623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
87723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
87823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
87923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
88023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
88123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
88295465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                                appCallingUid, userId, null, null, 0, new Intent[] { intent },
88323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
88423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
88523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
88623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
88723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
88823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
88923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
89023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
89123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
89223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
89323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
89423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
89523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
89623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
89723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
89823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
89923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
90023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
90123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
90223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
90323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
90423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
90523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
90623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
90723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
90823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
90923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
91023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
91123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
91223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
91323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
91423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
91523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
91623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
91723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
91823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
91923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
92023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
92123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
92223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
92323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
92423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
92523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
92691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            int res = startActivityLocked(caller, intent, resolvedType, aInfo,
92791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    voiceSession, voiceInteractor, resultTo, resultWho,
92895465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                    requestCode, callingPid, callingUid, callingPackage,
92995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                    realCallingPid, realCallingUid, startFlags, options,
93089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    componentSpecified, null, container, inTask);
93123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
93285c11a8831ba9572813f122674b3680ae4d14010Craig Mautner            Binder.restoreCallingIdentity(origId);
93385c11a8831ba9572813f122674b3680ae4d14010Craig Mautner
934de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (stack.mConfigWillChange) {
93523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
93623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
93723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
93823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
93923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
94023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
941de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stack.mConfigWillChange = false;
94223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
94323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
94423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
94523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
94623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
94723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
94823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
94923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
950ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWaitingActivityLaunched.add(outResult);
95123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
95223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
95323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
95423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
95523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
95623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
95723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
958de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityRecord r = stack.topRunningActivityLocked(null);
9596cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn                    if (r.nowVisible && r.state == ActivityState.RESUMED) {
96023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
96123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
96223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
96323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
96423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
96523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
966ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                        mWaitingActivityVisible.add(outResult);
96723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
96823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
96923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
97023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
97123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
97223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
97323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
97423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
97523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
97623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
97723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
97823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
97923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
98023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
98123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
98223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
98323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
98423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
98523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
98623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
98723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
98823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
98923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
99023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
99123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
99223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
99323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
99423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
99523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
99623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
99723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
99823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
99923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
100023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
100123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
100223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
100323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
100423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
100523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
100623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
100776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                ActivityRecord[] outActivity = new ActivityRecord[1];
100823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
100923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
101023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
101123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
101223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
101323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
101423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
101523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
101623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
101723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
101823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
101923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
102023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
102123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
102223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
102323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
102423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
10251b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 0, null, userId);
102623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
102723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
102823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
102923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
103023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
103123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
103223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
103323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
103423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
103523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
103623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
103723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
103823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
103923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
104023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
104123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
10426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
104395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                            aInfo, null, null, resultTo, null, -1, callingPid, callingUid,
104495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                            callingPackage, callingPid, callingUid,
104589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                            0, theseOptions, componentSpecified, outActivity, null, null);
104623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
104723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
104823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
104923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
105023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
105123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
105223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
105323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
105423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
105523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
105623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
105723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
105823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
105923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
10602420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
10612c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount            ProcessRecord app, boolean andResume, boolean checkConfig)
10622420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
10632420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10642420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
1065a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner        if (false) Slog.d(TAG, "realStartActivity: setting app visibility true");
1066ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager.setAppVisibility(r.appToken, true);
10672420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10682420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
10692420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
10702420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10712420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
10722420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
10732420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
10742420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
10752420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
10762420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
10772420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
1078ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            Configuration config = mWindowManager.updateOrientationFromAppTokens(
10792420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
10802420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
10812420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
10822420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10832420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10842420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
10852420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
10862420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
10872420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
10882420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10892420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
10902420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10912420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
10922420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
10932420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
10942420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
1095db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateLruProcessLocked(app, true, null);
1096db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateOomAdjLocked();
10972420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10982420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
10992420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
11002420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
11012420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
11022420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11032420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
110485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn            List<ReferrerIntent> newIntents = null;
11052420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
11062420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
11072420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
11082420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11092420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
11102420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
11112420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
11122420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
11132420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
11142420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
11152420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
11162420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
11172420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
1118ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (r.isHomeActivity() && r.isNotResolverActivity()) {
11194ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                // Home process is the root process of the task.
11204ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                mService.mHomeProcess = r.task.mActivities.get(0).app;
11212420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11222420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
11232420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
11242420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
11252420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
11262420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
11272420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
11282420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
11292420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
11302420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
11312420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
11322420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
11332420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
11342420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
11352420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11362420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
11372420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
11382420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
11392420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
11402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
11412420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
11422420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
11432420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
11442420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
11452420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
11462420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
11472420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
11482420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
11492420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
11502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
1151cfbe9be5b3b701d95fb24fa0f7c8d9be43eec776Adam Powell
11521b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            ProfilerInfo profilerInfo = profileFile != null
11531b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    ? new ProfilerInfo(profileFile, profileFd, mService.mSamplingInterval,
11541b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    mService.mAutoStopProfiler) : null;
1155a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);
11562420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
11571b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
115885d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    r.compat, r.launchedFromPackage, r.task.voiceInteractor, app.repProcState,
115985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    r.icicle, r.persistentState, results, newIntents, !andResume,
116085d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    mService.isNextTransitionForward(), profilerInfo);
11612420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11622420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
11632420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
11642420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
11652420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
11662420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
11672420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
11682420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
11692420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
11702420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
11712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
11722420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
11732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
11742420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
11752420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
11762420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
11772420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
11782420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
11792420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
11802420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11812420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11822420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
11832420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
11842420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
11852420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
11862420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
11872420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
11882420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
11894a8dddbf18fedb33bb2c725db489669a141e1d73Craig Mautner                mService.appDiedLocked(app);
11902420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
11912420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
11922420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
11932420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
11942420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11952420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
11962420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
11972420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
11982420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
11992420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
12002420ead0326bfd2587da6231be419e758dba1930Craig Mautner
12012420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
12022420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
12032420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
12042420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
12052420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
12062420ead0326bfd2587da6231be419e758dba1930Craig Mautner
12072420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
12082420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
12092420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
12102420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
12112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
12122420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
12132420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
12142420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
12152420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
12162420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
12172420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
12182420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
12192420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
12202420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
12212420ead0326bfd2587da6231be419e758dba1930Craig Mautner
12222420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
12232420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
12242420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
12252420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
1226de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (isFrontStack(stack)) {
12272420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
12282420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
12292420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1230465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn        // Update any services we are bound to that might care about whether
1231465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn        // their client may have activities.
1232465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn        mService.mServices.updateServiceConnectionActivitiesLocked(r.app);
1233465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn
12342420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
12352420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
12362420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1237e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
12382c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount            boolean andResume, boolean checkConfig) {
1239e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
1240e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
12413bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                r.info.applicationInfo.uid, true);
1242e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1243e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
1244e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1245e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
1246e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
1247237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
1248237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        || !"android".equals(r.info.packageName)) {
1249237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // Don't add this if it is a platform component that is marked
1250237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // to run in multiple processes, because this is actually
1251237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // part of the framework so doesn't make sense to track as a
1252237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // separate apk in the process.
1253f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                    app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
1254f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn                            mService.mProcessStats);
1255237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                }
12562c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount                realStartActivityLocked(r, app, andResume, checkConfig);
1257e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
1258e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
1259e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
1260e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
1261e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
1262e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1263e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
1264e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
1265e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
1266e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1267e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
12683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                "activity", r.intent.getComponent(), false, false, true);
1269e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
1270e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
12716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
127291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Intent intent, String resolvedType, ActivityInfo aInfo,
127391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
127491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IBinder resultTo, String resultWho, int requestCode,
127595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            int callingPid, int callingUid, String callingPackage,
127695465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            int realCallingPid, int realCallingUid, int startFlags, Bundle options,
127789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container,
127889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            TaskRecord inTask) {
12796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
12806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
12826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
12836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
12846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
12856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
12866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
12876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
12886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
12896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
12906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
12916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
12926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
12966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
12976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
129802a4aa261c28df2466234106d61282289276b462Craig Mautner                    + "} from uid " + callingUid
12999ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                    + " on display " + (container == null ? (mFocusedStack == null ?
13009ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                            Display.DEFAULT_DISPLAY : mFocusedStack.mDisplayId) :
13019ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                            (container.mActivityDisplay == null ? Display.DEFAULT_DISPLAY :
13029ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                                    container.mActivityDisplay.mDisplayId)));
13036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
13066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
13076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
13086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
13096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
13106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
13116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
13126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
13136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
13146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
13156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
13186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
131991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final int launchFlags = intent.getFlags();
13206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
132195465200b0f652c48d40ca1028238763dd647900Dianne Hackborn        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) {
13226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
13236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
13246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
13256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
13266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
13276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
13296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
13306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
13316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
13326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
13331b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                resultRecord.removeResultsLocked(sourceRecord, resultWho, requestCode);
13346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13353026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn            if (sourceRecord.launchedFromUid == callingUid) {
13363026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // The new activity is being launched from the same uid as the previous
13373026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // activity in the flow, and asking to forward its result back to the
13383026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // previous.  In this case the activity is serving as a trampoline between
13393026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // the two, so we also want to update its launchedFromPackage to be the
13403026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // same as the previous activity.  Note that this is safe, since we know
13413026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // these two packages come from the same uid; the caller could just as
13423026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // well have supplied that same package name itself.  This specifially
13433026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // deals with the case of an intent picker/chooser being launched in the app
13443026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // flow to redirect to an activity picked by the user, where we want the final
13453026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // activity to consider it to have been launched by the previous app activity.
13463026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                callingPackage = sourceRecord.launchedFromPackage;
13473026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn            }
13486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
13516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
13526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
13536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
13546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
13576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
13586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
13596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
13606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
136291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (err == ActivityManager.START_SUCCESS && sourceRecord != null
136391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                && sourceRecord.task.voiceSession != null) {
136491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // If this activity is being launched as part of a voice session, we need
136591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // to ensure that it is safe to do so.  If the upcoming activity will also
136691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // be part of the voice session, we can only launch it if it has explicitly
136791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // said it supports the VOICE category, or it is a part of the calling app.
1368f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0
136991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) {
137091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                try {
137195465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                    if (!AppGlobals.getPackageManager().activitySupportsIntent(
137295465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                            intent.getComponent(), intent, resolvedType)) {
137391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
137491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    }
137591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                } catch (RemoteException e) {
137691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
137791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                }
137891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
137991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
138091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
138191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (err == ActivityManager.START_SUCCESS && voiceSession != null) {
138291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // If the caller is starting a new voice session, just make sure the target
138391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // is actually allowing it to run this way.
138491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
138591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(),
138691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        intent, resolvedType)) {
138791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
138891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                }
138991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
139091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
139191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
139291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
139391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
13946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
13956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
13966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
13976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
13986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
13996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
14016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
14026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
14046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
14056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
14066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
14076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
14086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
14096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
14106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
14116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
14126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
14136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
14156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
14166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
14176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
14186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
14196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
14206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
14216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
14226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
14236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
14246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
14256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
14276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
14286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1430dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
1431b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver                callingPid, resolvedType, aInfo.applicationInfo);
14325e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver
14336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
14346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
14356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
14366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
14376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
14385e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                abort |= !mService.mController.activityStarting(watchIntent,
14396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
14406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
14416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
14426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14435e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        }
14446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
14455e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        if (abort) {
14465e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            if (resultRecord != null) {
14475e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
14486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
14496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14505e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // We pretend to the caller that it was really started, but
14515e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // they will just get a cancel result.
14525e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            ActivityOptions.abort(options);
14535e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            return ActivityManager.START_SUCCESS;
14546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
14566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
1457e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho,
1458233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner                requestCode, componentSpecified, this, container, options);
14596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
14606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
14616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1463ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = getFocusedStack();
146491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (voiceSession == null && (stack.mResumedActivity == null
146591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                || stack.mResumedActivity.info.applicationInfo.uid != callingUid)) {
146695465200b0f652c48d40ca1028238763dd647900Dianne Hackborn            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid,
146795465200b0f652c48d40ca1028238763dd647900Dianne Hackborn                    realCallingPid, realCallingUid, "Activity start")) {
14686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
1469de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, stack);
1470ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                mPendingActivityLaunches.add(pal);
14716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
14726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
14736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
14746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
14766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
14776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
14786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
14796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
14806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
14816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
14826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
14836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
14846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
14856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1487ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        doPendingActivityLaunchesLocked(false);
14886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
148991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor,
149089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                startFlags, true, options, inTask);
149110385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner
14928de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi        if (err < 0) {
149310385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner            // If someone asked to have the keyguard dismissed on the next
14946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
14956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
14966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
14978de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi            notifyActivityDrawnForKeyguard();
14986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
14996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
15006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
15016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
15021b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner    ActivityStack adjustStackFocus(ActivityRecord r, boolean newTask) {
15031d001b670e34fe887488047f525a5430154626e1Craig Mautner        final TaskRecord task = r.task;
150458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
150558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        // On leanback only devices we should keep all activities in the same stack.
150658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        if (!mLeanbackOnlyDevice &&
150758e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima                (r.isApplicationActivity() || (task != null && task.isApplicationTask()))) {
1508ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (task != null) {
1509d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                final ActivityStack taskStack = task.stack;
1510e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                if (taskStack.isOnHomeDisplay()) {
1511e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    if (mFocusedStack != taskStack) {
1512e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                        if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: Setting " +
1513e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                                "focused stack to r=" + r + " task=" + task);
1514e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                        mFocusedStack = taskStack;
1515e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    } else {
1516e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                        if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1517e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                            "adjustStackFocus: Focused stack already=" + mFocusedStack);
1518e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    }
1519858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                }
1520d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                return taskStack;
1521858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1522ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1523e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ActivityContainer container = r.mInitialActivityContainer;
1524e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (container != null) {
1525e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                // The first time put it on the desired stack, after this put on task stack.
1526e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                r.mInitialActivityContainer = null;
1527e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                return container.mStack;
1528e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
1529e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner
15301b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner            if (mFocusedStack != mHomeStack && (!newTask ||
15311b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                    mFocusedStack.mActivityContainer.isEligibleForNewTasks())) {
1532ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1533ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        "adjustStackFocus: Have a focused stack=" + mFocusedStack);
1534ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                return mFocusedStack;
1535de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
1536ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1537e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks;
1538e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1539e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ActivityStack stack = homeDisplayStacks.get(stackNdx);
1540e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                if (!stack.isHomeStack()) {
1541e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1542e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                            "adjustStackFocus: Setting focused stack=" + stack);
1543e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    mFocusedStack = stack;
1544e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    return mFocusedStack;
1545ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
15461d001b670e34fe887488047f525a5430154626e1Craig Mautner            }
1547ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
15484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            // Need to create an app stack for this user.
1549f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
1550ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
1551ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    " stackId=" + stackId);
1552ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            mFocusedStack = getStack(stackId);
155329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return mFocusedStack;
1554de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1555de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return mHomeStack;
1556de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
1557de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
155829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    void setFocusedStack(ActivityRecord r) {
15594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (r != null) {
156012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            final TaskRecord task = r.task;
156112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            boolean isHomeActivity = !r.isApplicationActivity();
156212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            if (!isHomeActivity && task != null) {
156312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                isHomeActivity = !task.isApplicationTask();
156412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            }
156512ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            if (!isHomeActivity && task != null) {
156612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                final ActivityRecord parent = task.stack.mActivityContainer.mParentActivity;
156712ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                isHomeActivity = parent != null && parent.isHomeActivity();
156812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            }
15694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            moveHomeStack(isHomeActivity);
157029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
157129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
157229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
157389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord,
157491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags,
157589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            boolean doResume, Bundle options, TaskRecord inTask) {
15768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final Intent intent = r.intent;
15778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final int callingUid = r.launchedFromUid;
15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1579d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        // In some flows in to this function, we retrieve the task record and hold on to it
1580d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        // without a lock before calling back in to here...  so the task at this point may
1581d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        // not actually be in recents.  Check for that, and if it isn't in recents just
1582d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        // consider it invalid.
1583d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        if (inTask != null && !inTask.inRecents) {
1584d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            Slog.w(TAG, "Starting activity in task not in recents: " + inTask);
1585d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            inTask = null;
1586d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        }
1587d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
1588ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner        final boolean launchSingleTop = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP;
1589a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner        final boolean launchSingleInstance = r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE;
1590a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner        final boolean launchSingleTask = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK;
15918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1592a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner        int launchFlags = intent.getFlags();
1593f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 &&
1594a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                (launchSingleInstance || launchSingleTask)) {
1595f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // We have a conflict between the Intent and the Activity manifest, manifest wins.
1596f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " +
1597f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    "\"singleInstance\" or \"singleTask\"");
1598f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            launchFlags &=
1599f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    ~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
1600f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        } else {
1601f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            switch (r.info.documentLaunchMode) {
1602f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                case ActivityInfo.DOCUMENT_LAUNCH_NONE:
1603f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    break;
1604f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING:
1605f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
1606f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    break;
1607f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS:
1608f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
1609f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    break;
1610f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                case ActivityInfo.DOCUMENT_LAUNCH_NEVER:
1611f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    launchFlags &= ~Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
1612f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    break;
1613f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            }
1614f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        }
1615bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner
161689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        final boolean launchTaskBehind = r.mLaunchTaskBehind
161789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                && !launchSingleTask && !launchSingleInstance
161889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                && (launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0;
1619f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner
1620f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1621f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // For whatever reason this activity is being launched into a new
1622f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // task...  yet the caller has requested a result back.  Well, that
1623f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // is pretty messed up, so instead immediately send back a cancel
1624f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // and let the new task continue launched as normal without a
1625f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            // dependency on its originator.
1626f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
1627f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            r.resultTo.task.stack.sendActivityResultLocked(-1,
1628f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    r.resultTo, r.resultWho, r.requestCode,
1629f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                    Activity.RESULT_CANCELED, null);
1630f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            r.resultTo = null;
1631f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        }
1632f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner
1633f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && r.resultTo == null) {
1634f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1635f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner        }
1636f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner
163789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // If we are actually going to launch in to a new task, there are some cases where
163889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // we further want to do multiple task.
163989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
164089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (launchTaskBehind
164189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    || r.info.documentLaunchMode == ActivityInfo.DOCUMENT_LAUNCH_ALWAYS) {
164289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
164389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
164489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
164589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
16468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // We'll invoke onUserLeaving before onPause only if the launching
16478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // activity did not explicitly state that this is an automated launch.
1648a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner        mUserLeaving = (launchFlags & Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
1649de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving);
16508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the caller has asked not to resume at this point, we make note
16528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // of this in the record so that we can skip it when trying to find
16538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // the top running activity.
16548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (!doResume) {
16558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.delayedResume = true;
16568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1658a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner        ActivityRecord notTop =
1659a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner                (launchFlags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
16608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the onlyIfNeeded flag is set, then we can do this if the activity
16628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // being launched is the same as the one making the call...  or, as
16638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // a special case, if we do not know the caller then we count the
16648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // current top activity as the caller.
16658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
16668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord checkedCaller = sourceRecord;
16678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (checkedCaller == null) {
1668ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop);
16698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!checkedCaller.realActivity.equals(r.realActivity)) {
16718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // Caller is not the same as launcher, so always needed.
16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean addingToTask = false;
16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        TaskRecord reuseTask = null;
167889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
167989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // If the caller is not coming from another activity, but has given us an
168089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // explicit task into which they would like us to launch the new activity,
168189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // then let's see about doing that.
1682d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn        if (sourceRecord == null && inTask != null && inTask.stack != null) {
1683d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            final Intent baseIntent = inTask.getBaseIntent();
1684d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            final ActivityRecord root = inTask.getRootActivity();
1685d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (baseIntent == null) {
1686d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                ActivityOptions.abort(options);
1687d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                throw new IllegalArgumentException("Launching into task without base intent: "
1688d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        + inTask);
1689d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            }
1690d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
169189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // If this task is empty, then we are adding the first activity -- it
169289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // determines the root, and must be launching as a NEW_TASK.
1693d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (launchSingleInstance || launchSingleTask) {
1694d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                if (!baseIntent.getComponent().equals(r.intent.getComponent())) {
1695d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    ActivityOptions.abort(options);
1696d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    throw new IllegalArgumentException("Trying to launch singleInstance/Task "
1697d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                            + r + " into different task " + inTask);
169889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
1699d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                if (root != null) {
1700d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    ActivityOptions.abort(options);
1701d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    throw new IllegalArgumentException("Caller with inTask " + inTask
1702d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                            + " has root " + root + " but target is singleInstance/Task");
1703d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                }
1704d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            }
1705d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
1706d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // If task is empty, then adopt the interesting intent launch flags in to the
1707d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // activity being started.
1708d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (root == null) {
1709d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                final int flagsOfInterest = Intent.FLAG_ACTIVITY_NEW_TASK
1710d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        | Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT
1711d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS;
1712d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                launchFlags = (launchFlags&~flagsOfInterest)
1713d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        | (baseIntent.getFlags()&flagsOfInterest);
1714d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                intent.setFlags(launchFlags);
171589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                inTask.setIntent(r);
1716962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                addingToTask = true;
171789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
1718962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            // If the task is not empty and the caller is asking to start it as the root
1719962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            // of a new task, then we don't actually want to start this on the task.  We
1720962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            // will bring the task to the front, and possibly give it a new intent.
1721d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            } else if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1722962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                addingToTask = false;
1723962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn
1724962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            } else {
1725962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                addingToTask = true;
172689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
1727962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn
172889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            reuseTask = inTask;
172989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        } else {
173089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            inTask = null;
173189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
173289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
1733a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        if (inTask == null) {
1734a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            if (sourceRecord == null) {
1735a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // This activity is not being started from another...  in this
1736a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // case we -always- start a new task.
1737a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 && inTask == null) {
1738a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
1739a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                            "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
1740a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1741a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                }
1742a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
1743a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // The original activity who is starting us is running as a single
1744a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // instance...  this new activity it is starting must go on its
1745a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // own task.
1746a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1747a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            } else if (launchSingleInstance || launchSingleTask) {
1748a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // The activity being started is a single instance...  it always
1749a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // gets launched into its own task.
1750a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1751a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            }
1752a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        }
1753a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn
1754a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        ActivityInfo newTaskInfo = null;
1755a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        Intent newTaskIntent = null;
1756a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        ActivityStack sourceStack;
1757a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        if (sourceRecord != null) {
1758a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            if (sourceRecord.finishing) {
1759a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // If the source is finishing, we can't further count it as our source.  This
1760a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // is because the task it is associated with may now be empty and on its way out,
1761a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // so we don't want to blindly throw it in to that task.  Instead we will take
1762a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // the NEW_TASK flow and try to find a task for it. But save the task information
1763a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                // so it can be used when creating the new task.
1764a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
1765a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    Slog.w(TAG, "startActivity called from finishing " + sourceRecord
1766a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                            + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
1767a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
1768a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    newTaskInfo = sourceRecord.info;
1769a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    newTaskIntent = sourceRecord.task.intent;
1770a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                }
1771a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                sourceRecord = null;
1772a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                sourceStack = null;
1773a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            } else {
1774a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                sourceStack = sourceRecord.task.stack;
1775a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            }
1776a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        } else {
1777a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn            sourceStack = null;
1778a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        }
1779a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn
1780a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        boolean movedHome = false;
1781a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        ActivityStack targetStack;
1782a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn
1783a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn        intent.setFlags(launchFlags);
1784a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn
178589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // We may want to try to place the new activity in to an existing task.  We always
178689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // do this if the target activity is singleTask or singleInstance; we will also do
178789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // this if NEW_TASK has been requested, and there is not an additional qualifier telling
178889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // us to still place it in a new task: multi task, always doc mode, or being asked to
178989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // launch this as a new task behind the current one.
1790d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner        if (((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
1791d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner                (launchFlags & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
1792a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                || launchSingleInstance || launchSingleTask) {
1793d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // If bring to front is requested, and no result is requested and we have not
1794d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // been given an explicit task to launch in to, and
17958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // we can find a task that was started with this same
17968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // component, then instead of launching bring that one to the front.
1797d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (inTask == null && r.resultTo == null) {
17988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // See if there is a task to bring to the front.  If this is
17998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // a SINGLE_INSTANCE activity, there can be one and only one
18008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // instance of it in the history, and it is always in its own
18018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // unique task, so we do a special search.
1802a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                ActivityRecord intentActivity = !launchSingleInstance ?
1803a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                        findTaskLocked(r) : findActivityLocked(intent, r.info);
18048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (intentActivity != null) {
1805aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                    if (isLockTaskModeViolation(intentActivity.task)) {
1806a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk                        showLockTaskToast();
18070175b882b5e021907c307ab0e455bff014ad8784Craig Mautner                        Slog.e(TAG, "startActivityUnchecked: Attempt to violate Lock Task Mode");
1808aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                        return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
1809aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                    }
181029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null) {
181129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        r.task = intentActivity.task;
181229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    }
18138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack = intentActivity.task.stack;
18140f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
18152a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack
18162a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                            + " from " + intentActivity);
1817e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    targetStack.moveToFront();
18188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (intentActivity.task.intent == null) {
18198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // This task was started because of movement of
18208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the activity based on affinity...  now that we
18218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // are actually launching it, we can assign the
18228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // base intent.
1823fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                        intentActivity.task.setIntent(r);
18248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
18258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the target task is not in the front, then we need
18268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to bring it to the front...  except...  well, with
18278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
18288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to have the same behavior as if a new instance was
18298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // being started, which means not bringing it to the front
18308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // if the caller is not itself in the front.
1831165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    final ActivityStack lastStack = getLastStack();
1832165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    ActivityRecord curTop = lastStack == null?
1833165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                            null : lastStack.topRunningNonDelayedActivityLocked(notTop);
183444f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                    boolean movedToFront = false;
18357504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                    if (curTop != null && (curTop.task != intentActivity.task ||
18367504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                            curTop.task != lastStack.topTask())) {
18378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
1838d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                        if (sourceRecord == null || (sourceStack.topActivity() != null &&
1839d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                                sourceStack.topActivity().task == sourceRecord.task)) {
18408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // We really do want to push this one into the
18418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // user's face, right now.
1842bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                            if (launchTaskBehind && sourceRecord != null) {
1843a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                                intentActivity.setTaskToAffiliateWith(sourceRecord.task);
1844a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                            }
18458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            movedHome = true;
1846b53d97c4571f8ed09e92eee64301969b96ff1e4dCraig Mautner                            targetStack.moveTaskToFrontLocked(intentActivity.task, r, options);
1847de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            if ((launchFlags &
184829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
184929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
1850e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner                                // Caller wants to appear on home activity.
185184984faf530e525b066e28710d0f9beb32142ec5Craig Mautner                                intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
1852de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            }
18538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            options = null;
185444f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            movedToFront = true;
18558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
18568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
18578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the caller has requested that the target task be
18588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // reset, then do so.
18598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
18608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
18618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
18628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
18638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We don't need to start a new activity, and
18648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the client said not to do anything if that
18658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is the case, so this is it!  And for paranoia, make
18668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
18678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
186805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                            resumeTopActivitiesLocked(targetStack, null, options);
186944f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi
187044f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            // Make sure to notify Keyguard as well if we are not running an app
187144f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            // transition later.
187244f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            if (!movedToFront) {
187344f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                                notifyActivityDrawnForKeyguard();
187444f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            }
18758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
18768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
18778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
18788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
18798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
18808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags &
18818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
18828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
18838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The caller has requested to completely replace any
18848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task with its new activity.  Well that should
18858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // not be too hard...
18868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask = intentActivity.task;
18878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.performClearTaskLocked();
1888fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                        reuseTask.setIntent(r);
18898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
1890a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                            || launchSingleInstance || launchSingleTask) {
18918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this situation we want to remove all activities
18928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from the task up to the one being started.  In most
18938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // cases this means we are resetting the task to its
18948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // initial state.
18958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ActivityRecord top =
18968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.performClearTaskLocked(r, launchFlags);
18978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (top != null) {
18988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (top.frontOfTask) {
18998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // Activity aliases may mean we use different
19008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intents for the top activity, so make sure
19018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the task now has the identity of the new
19028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intent.
1903fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                                top.task.setIntent(r);
19048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
19058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
19068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    r, top.task);
190785d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
19088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
19098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // A special case: we need to
19108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // start the activity because it is not currently
19118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // running, and the caller has asked to clear the
19128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // current task to have this activity at the top.
19138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
19148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // Now pretend like this activity is being started
19158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // by the top of its task, so it is put in the
19168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // right place.
19178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
19188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
19198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (r.realActivity.equals(intentActivity.task.realActivity)) {
19208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case the top activity on the task is the
19218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // same as the one being launched, so we take that
19228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // as a request to bring the task to the foreground.
19238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // If the top activity in the task is the root
19248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // activity, deliver this new intent to it if it
19258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // desires.
1926ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 || launchSingleTop)
19278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                && intentActivity.realActivity.equals(r.realActivity)) {
19288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r,
19298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    intentActivity.task);
19308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (intentActivity.frontOfTask) {
1931fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                                intentActivity.task.setIntent(r);
19328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
193385d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                            intentActivity.deliverNewIntentLocked(callingUid, r.intent,
193485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                                    r.launchedFromPackage);
19358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else if (!r.intent.filterEquals(intentActivity.task.intent)) {
19368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // In this case we are launching the root activity
19378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // of the task, but with a different intent.  We
19388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // should start a new instance on top.
19398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
19408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
19418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
19428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
19438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case an activity is being launched in to an
19448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task, without resetting that task.  This
19458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is typically the situation of launching an activity
19468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from a notification or shortcut.  We want to place
19478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the new activity on top of the current task.
19488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        addingToTask = true;
19498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        sourceRecord = intentActivity;
19508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (!intentActivity.task.rootWasReset) {
19518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case we are launching in to an existing task
19528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // that has not yet been started from its front door.
19538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The current task has been brought to the front.
19548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // Ideally, we'd probably like to place this new task
19558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // at the bottom of its stack, but that's a little hard
19568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // to do with the current organization of the code so
19578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // for now we'll just drop it.
1958fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung                        intentActivity.task.setIntent(r);
19598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
19608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (!addingToTask && reuseTask == null) {
19618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We didn't do anything...  but it was needed (a.k.a., client
19628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // don't use that intent!)  And for paranoia, make
19638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
19648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1965de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            targetStack.resumeTopActivityLocked(null, options);
196644f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            if (!movedToFront) {
196744f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                                // Make sure to notify Keyguard as well if we are not running an app
196844f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                                // transition later.
196944f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                                notifyActivityDrawnForKeyguard();
197044f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi                            }
19718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
19728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
19738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
19748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_TASK_TO_FRONT;
19758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
19768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
19778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
19788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
19798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
19808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //String uri = r.intent.toURI();
19818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Intent intent2 = new Intent(uri);
19828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "Given intent: " + r.intent);
19838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "URI is: " + uri);
19848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "To intent: " + intent2);
19858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
19868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.packageName != null) {
19878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If the activity being launched is the same as the one currently
19888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // at the top, then we need to check if it should only be launched
19898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // once.
1990ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ActivityStack topStack = getFocusedStack();
1991de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop);
19928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (top != null && r.resultTo == null) {
19938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
19948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (top.app != null && top.app.thread != null) {
1995d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner                        if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
1996ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner                            || launchSingleTop || launchSingleTask) {
19978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top,
19988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    top.task);
19998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // For paranoia, make sure we have correctly
20008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // resumed the top activity.
20010f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                            topStack.mLastPausedActivity = null;
20028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (doResume) {
200305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                                resumeTopActivitiesLocked();
20048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
20058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
20068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
20078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // We don't need to start a new activity, and
20088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the client said not to do anything if that
20098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // is the case, so this is it!
20108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
20118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
201285d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                            top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
20138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            return ActivityManager.START_DELIVERED_TO_TOP;
20148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
20158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
20168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
20178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
20198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
20208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo != null) {
2021de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho,
2022de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.requestCode, Activity.RESULT_CANCELED, null);
20238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityOptions.abort(options);
20258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            return ActivityManager.START_CLASS_NOT_FOUND;
20268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
20278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
20288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean newTask = false;
20298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean keepCurTransition = false;
20308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
2031bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        TaskRecord taskToAffiliate = launchTaskBehind && sourceRecord != null ?
2032a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                sourceRecord.task : null;
2033a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner
20348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // Should this be considered a new task?
2035962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn        if (r.resultTo == null && inTask == null && !addingToTask
2036f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner                && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
2037aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            if (isLockTaskModeViolation(reuseTask)) {
2038aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
2039aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
2040aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            }
2041d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            newTask = true;
2042d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            targetStack = adjustStackFocus(r, newTask);
2043bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            if (!launchTaskBehind) {
2044bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                targetStack.moveToFront();
2045bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            }
20468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (reuseTask == null) {
20478862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                r.setTask(targetStack.createTaskRecord(getNextTaskId(),
20488862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                        newTaskInfo != null ? newTaskInfo : r.info,
20498862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                        newTaskIntent != null ? newTaskIntent : intent,
2050bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        voiceSession, voiceInteractor, !launchTaskBehind /* toTop */),
2051bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        taskToAffiliate);
2052de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
2053de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.task);
20548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else {
2055a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                r.setTask(reuseTask, taskToAffiliate);
20568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!movedHome) {
2058de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if ((launchFlags &
2059de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
2060de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
2061de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // Caller wants to appear on home activity, so before starting
2062de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // their own activity we will bring home to the front.
206384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner                    r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
2064de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
20658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord != null) {
2067a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner            final TaskRecord sourceTask = sourceRecord.task;
2068aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            if (isLockTaskModeViolation(sourceTask)) {
2069aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
2070aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
2071aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            }
2072525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            targetStack = sourceTask.stack;
2073dd221b3780800f03900c52bfc4a1ac7d01b72bc2Craig Mautner            targetStack.moveToFront();
2074737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner            final TaskRecord topTask = targetStack.topTask();
2075737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner            if (topTask != sourceTask) {
2076737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner                targetStack.moveTaskToFrontLocked(sourceTask, r, options);
2077737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner            } else {
2078737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner                mWindowManager.moveTaskToTop(topTask.taskId);
2079737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner            }
2080a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner            if (!addingToTask && (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
20818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are adding the activity to an existing
20828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // task, but the caller has asked to clear that task if the
20838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // activity is already running.
2084525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags);
20858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                keepCurTransition = true;
20868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
20878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
208885d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
20898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // For paranoia, make sure we have correctly
20908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // resumed the top activity.
20910f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
20928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
20938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
20948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
20958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityOptions.abort(options);
20968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
20978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
20988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else if (!addingToTask &&
20998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
21008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are launching an activity in our own task
21018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // that may already be running somewhere in the history, and
21028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // we want to shuffle it to the front of the stack if so.
2103525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r);
21048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
2105de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    final TaskRecord task = top.task;
2106de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    task.moveActivityToFrontLocked(top);
2107de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task);
21088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.updateOptionsLocked(options);
210985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
21100f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
21118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
21128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
21138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
21148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
21158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
21168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
21178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // An existing activity is starting this new activity, so we want
21188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // to keep the new one in the same task as the one that is starting
21198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // it.
2120a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner            r.setTask(sourceTask, null);
21218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
21222a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    + " in existing task " + r.task + " from source " + sourceRecord);
21238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
212489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        } else if (inTask != null) {
212589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // The calling is asking that the new activity be started in an explicit
212689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // task it has provided to us.
212789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (isLockTaskModeViolation(inTask)) {
212889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
212989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
213089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
213189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            targetStack = inTask.stack;
2132d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            targetStack.moveTaskToFrontLocked(inTask, r, options);
213302a4aa261c28df2466234106d61282289276b462Craig Mautner            targetStack.moveToFront();
21342c924fb2c7dfba69d2913943598cbc61945d4f1dDianne Hackborn            mWindowManager.moveTaskToTop(inTask.taskId);
2135d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
2136d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // Check whether we should actually launch the new activity in to the task,
2137d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            // or just reuse the current activity on top.
2138d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            ActivityRecord top = inTask.getTopActivity();
2139d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            if (top != null && top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
2140d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
2141d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        || launchSingleTop || launchSingleTask) {
2142d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task);
2143d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
2144d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        // We don't need to start a new activity, and
2145d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        // the client said not to do anything if that
2146d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        // is the case, so this is it!
2147d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
2148d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    }
214985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn                    top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage);
2150d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                    return ActivityManager.START_DELIVERED_TO_TOP;
2151d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn                }
2152d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn            }
2153d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn
2154962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            if (!addingToTask) {
2155962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                // We don't actually want to have this activity added to the task, so just
2156962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                // stop here but still tell the caller that we consumed the intent.
2157962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                ActivityOptions.abort(options);
2158962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn                return ActivityManager.START_TASK_TO_FRONT;
2159962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn            }
2160962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn
216189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            r.setTask(inTask, null);
216289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
216389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    + " in explicit task " + r.task);
216489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
21658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
21668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This not being started from an existing activity, and not part
21678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // of a new task...  just put it in the top task, though these days
21688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // this case should never happen.
21691b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner            targetStack = adjustStackFocus(r, newTask);
2170dd221b3780800f03900c52bfc4a1ac7d01b72bc2Craig Mautner            targetStack.moveToFront();
21711602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            ActivityRecord prev = targetStack.topActivity();
2172c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner            r.setTask(prev != null ? prev.task : targetStack.createTaskRecord(getNextTaskId(),
2173a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner                            r.info, intent, null, null, true), null);
217495e9daab03d0349a69940625c7f718175f371581Craig Mautner            mWindowManager.moveTaskToTop(r.task.taskId);
21758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
21768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in new guessed " + r.task);
21778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
21788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
21798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
2180c6cf95c0f5f7250c65e40c441fe58d8cbfd114c9Nicolas Prevot                intent, r.getUriPermissionsLocked(), r.userId);
21818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
218276e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner        if (sourceRecord != null && sourceRecord.isRecentsActivity()) {
218376e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner            r.task.setTaskToReturnTo(RECENTS_ACTIVITY_TYPE);
218476e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner        }
21858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (newTask) {
21868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
21878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
21888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
21890f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner        targetStack.mLastPausedActivity = null;
21908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
2191bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        if (!launchTaskBehind) {
2192bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            // Don't set focus on an activity that's going to the back.
2193bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner            mService.setFocusedActivityLocked(r);
2194bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        }
21958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return ActivityManager.START_SUCCESS;
21968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
21978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
2198ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    final void doPendingActivityLaunchesLocked(boolean doResume) {
2199ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        while (!mPendingActivityLaunches.isEmpty()) {
2200ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            PendingActivityLaunch pal = mPendingActivityLaunches.remove(0);
2201aa9b0f15753541ff8e4d62e6497c11800c737077Craig Mautner            startActivityUncheckedLocked(pal.r, pal.sourceRecord, null, null, pal.startFlags,
220289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    doResume && mPendingActivityLaunches.isEmpty(), null, null);
2203ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        }
2204ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    }
2205ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
22067f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner    void removePendingActivityLaunchesLocked(ActivityStack stack) {
2207ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        for (int palNdx = mPendingActivityLaunches.size() - 1; palNdx >= 0; --palNdx) {
2208ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            PendingActivityLaunch pal = mPendingActivityLaunches.get(palNdx);
22097f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner            if (pal.stack == stack) {
2210ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                mPendingActivityLaunches.remove(palNdx);
2211ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner            }
2212ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner        }
2213ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner    }
2214ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner
22157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    void acquireLaunchWakelock() {
22167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
22177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
22187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
22197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.acquire();
22207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
22217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // To be safe, don't allow the wake lock to be held for too long.
22227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
22237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
22247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    }
22257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2226f333327782e14688e1c198c1192172d51308e90bCraig Mautner    // Checked.
2227f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
2228f333327782e14688e1c198c1192172d51308e90bCraig Mautner            Configuration config) {
2229f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
2230f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2231f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> stops = null;
2232f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> finishes = null;
2233f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<UserStartedState> startingUsers = null;
2234f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NS = 0;
2235f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NF = 0;
2236f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean booting = false;
2237f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean enableScreen = false;
2238f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean activityRemoved = false;
2239f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2240f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord r = ActivityRecord.forToken(token);
2241f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (r != null) {
2242b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" +
2243b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner                    Debug.getCallers(4));
2244f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
2245f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r.finishLaunchTickingLocked();
22467ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (fromTimeout) {
22477ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
22487ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
2249f333327782e14688e1c198c1192172d51308e90bCraig Mautner
22507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // This is a hack to semi-deal with a race condition
22517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // in the client where it can be constructed with a
22527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // newer configuration from when we asked it to launch.
22537ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We'll update with whatever configuration it now says
22547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // it used to launch.
22557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (config != null) {
22567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                r.configuration = config;
22577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
2258f333327782e14688e1c198c1192172d51308e90bCraig Mautner
22597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We are now idle.  If someone is waiting for a thumbnail from
22607ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // us, we can now deliver.
22617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            r.idle = true;
22627ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
22637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
22649449a6162e275531857464acc2279894d5d6a240Dianne Hackborn            if (isFrontStack(r.task.stack) || fromTimeout) {
22659449a6162e275531857464acc2279894d5d6a240Dianne Hackborn                booting = mService.mBooting;
22669449a6162e275531857464acc2279894d5d6a240Dianne Hackborn                mService.mBooting = false;
22679449a6162e275531857464acc2279894d5d6a240Dianne Hackborn                if (!mService.mBooted) {
22689449a6162e275531857464acc2279894d5d6a240Dianne Hackborn                    mService.mBooted = true;
22699449a6162e275531857464acc2279894d5d6a240Dianne Hackborn                    enableScreen = true;
22709449a6162e275531857464acc2279894d5d6a240Dianne Hackborn                }
22717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
22727ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
22737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
22747ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (allResumedActivitiesIdle()) {
22757ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (r != null) {
22767ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.scheduleAppGcsLocked();
22777ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
22787ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
22797ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
22807ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
22817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER &&
22827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        Binder.getCallingUid() != Process.myUid()) {
22837ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
2284f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
22857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
2286f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
22877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
2288f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2289f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2290f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Atomically retrieve all of the other things to do.
2291f333327782e14688e1c198c1192172d51308e90bCraig Mautner        stops = processStoppingActivitiesLocked(true);
2292f333327782e14688e1c198c1192172d51308e90bCraig Mautner        NS = stops != null ? stops.size() : 0;
2293f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if ((NF=mFinishingActivities.size()) > 0) {
2294f333327782e14688e1c198c1192172d51308e90bCraig Mautner            finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
2295f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mFinishingActivities.clear();
2296f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2297f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2298f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mStartingUsers.size() > 0) {
2299f333327782e14688e1c198c1192172d51308e90bCraig Mautner            startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
2300f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mStartingUsers.clear();
2301f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2302f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2303f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Stop any activities that are scheduled to do so but have been
2304f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
2305f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NS; i++) {
2306f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = stops.get(i);
2307f333327782e14688e1c198c1192172d51308e90bCraig Mautner            final ActivityStack stack = r.task.stack;
2308f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (r.finishing) {
2309f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
2310f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else {
2311f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.stopActivityLocked(r);
2312f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
2313f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2314f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2315f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Finish any activities that are scheduled to do so but have been
2316f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
2317f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NF; i++) {
2318f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = finishes.get(i);
2319ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            activityRemoved |= r.task.stack.destroyActivityLocked(r, true, "finish-idle");
2320f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2321f333327782e14688e1c198c1192172d51308e90bCraig Mautner
23227622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn        if (!booting) {
23231a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            // Complete user switch
23241a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            if (startingUsers != null) {
23251a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                for (int i = 0; i < startingUsers.size(); i++) {
23261a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                    mService.finishUserSwitch(startingUsers.get(i));
23271a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                }
23281a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            }
23291a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            // Complete starting up of background users
23301a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            if (mStartingBackgroundUsers.size() > 0) {
23311a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                startingUsers = new ArrayList<UserStartedState>(mStartingBackgroundUsers);
23321a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                mStartingBackgroundUsers.clear();
23331a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                for (int i = 0; i < startingUsers.size(); i++) {
23341a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                    mService.finishUserBoot(startingUsers.get(i));
23351a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                }
2336f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
2337f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2338f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2339f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mService.trimApplications();
2340f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //dump();
2341f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //mWindowManager.dump();
2342f333327782e14688e1c198c1192172d51308e90bCraig Mautner
23437622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn        if (booting || enableScreen) {
23447622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn            mService.postFinishBooting(booting, enableScreen);
2345f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2346f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2347f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (activityRemoved) {
234805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            resumeTopActivitiesLocked();
2349f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2350f333327782e14688e1c198c1192172d51308e90bCraig Mautner
23517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        return r;
2352f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2353f333327782e14688e1c198c1192172d51308e90bCraig Mautner
23548e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    boolean handleAppDiedLocked(ProcessRecord app) {
23551909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner        boolean hasVisibleActivities = false;
2356e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2357e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
23584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
23594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                hasVisibleActivities |= stacks.get(stackNdx).handleAppDiedLocked(app);
23604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
23618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
23621909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner        return hasVisibleActivities;
23638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
23648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
23658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
2366e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2367e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
23684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
23694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stacks.get(stackNdx).closeSystemDialogsLocked();
23704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
23718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
23728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
23738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
237493529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    void removeUserLocked(int userId) {
23754f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        mUserStackInFront.delete(userId);
237693529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    }
237793529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
23788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
23798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
23808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
23818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
23828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
2383e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2384e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
23854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
23864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
23874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
23884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
23894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    didSomething = true;
23904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
23918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
23928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
23938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
23948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
23958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2396a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    void updatePreviousProcessLocked(ActivityRecord r) {
2397a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now that this process has stopped, we may want to consider
2398a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // it to be the previous app to try to keep around in case
2399a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // the user wants to return to it.
2400a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
2401a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // First, found out what is currently the foreground app, so that
2402a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // we don't blow away the previous app if this activity is being
2403a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // hosted by the process that is actually still the foreground.
2404a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        ProcessRecord fgApp = null;
2405e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2406e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
24084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
24094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
24104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (stack.mResumedActivity != null) {
24114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        fgApp = stack.mResumedActivity.app;
24124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    } else if (stack.mPausingActivity != null) {
24134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        fgApp = stack.mPausingActivity.app;
24144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
24154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    break;
2416a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                }
2417a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            }
2418a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2419a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
2420a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now set this one as the previous process, only if that really
2421a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // makes sense to.
2422a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        if (r.app != null && fgApp != null && r.app != fgApp
2423a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
24244ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                && r.app != mService.mHomeProcess) {
2425a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcess = r.app;
2426a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
2427a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2428a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    }
2429a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
243005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked() {
243105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return resumeTopActivitiesLocked(null, null, null);
243205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
243305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
243405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target,
243505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            Bundle targetOptions) {
243605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        if (targetStack == null) {
243705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            targetStack = getFocusedStack();
243805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        }
243912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner        // Do targetStack first.
244005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        boolean result = false;
244112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner        if (isFrontStack(targetStack)) {
244212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            result = targetStack.resumeTopActivityLocked(target, targetOptions);
244312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner        }
2444e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2445e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
24474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
244812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                if (stack == targetStack) {
244912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                    // Already started above.
245012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                    continue;
245112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                }
24524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
245312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                    stack.resumeTopActivityLocked(null);
245405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                }
2455f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            }
24568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
245705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return result;
24588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
24608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
2461e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2462e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
24644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
24654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
24664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stack.finishTopRunningActivityLocked(app);
24674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
24688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
24698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
24716ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn    void finishVoiceTask(IVoiceInteractionSession session) {
24726ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
24736ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24746ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn            final int numStacks = stacks.size();
24756ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
24766ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                final ActivityStack stack = stacks.get(stackNdx);
24776ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn                stack.finishVoiceTask(session);
24786ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn            }
24796ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn        }
24806ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn    }
24816ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn
2482aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    void findTaskToMoveToFrontLocked(TaskRecord task, int flags, Bundle options) {
2483aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) {
2484aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            mUserLeaving = true;
24858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2486aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) {
2487aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            // Caller wants the home activity moved with it.  To accomplish this,
2488aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            // we'll just indicate that this task returns to the home task.
248984984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
2490aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
2491aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        task.stack.moveTaskToFrontLocked(task, null, options);
2492aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack="
2493aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                + task.stack);
24948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2496967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ActivityStack getStack(int stackId) {
2497f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer activityContainer = mActivityContainers.get(stackId);
2498f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        if (activityContainer != null) {
2499f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            return activityContainer.mStack;
25008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
25018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
25028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
25038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2504967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ArrayList<ActivityStack> getStacks() {
25054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<ActivityStack> allStacks = new ArrayList<ActivityStack>();
2506e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2507e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            allStacks.addAll(mActivityDisplays.valueAt(displayNdx).mStacks);
25084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
25094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return allStacks;
25104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
25114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
25124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    IBinder getHomeActivityToken() {
2513ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        ActivityRecord homeActivity = getHomeActivity();
2514ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        if (homeActivity != null) {
2515ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            return homeActivity.appToken;
2516ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
2517ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        return null;
2518ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner    }
2519ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
2520ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner    ActivityRecord getHomeActivity() {
25214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final ArrayList<TaskRecord> tasks = mHomeStack.getAllTasks();
25224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
25234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final TaskRecord task = tasks.get(taskNdx);
25244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            if (task.isHomeTask()) {
25254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ArrayList<ActivityRecord> activities = task.mActivities;
25264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
25274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    final ActivityRecord r = activities.get(activityNdx);
25284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (r.isHomeActivity()) {
2529ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner                        return r;
25304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
25314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
25324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
25334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
25344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return null;
25354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
25364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
25374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    ActivityContainer createActivityContainer(ActivityRecord parentActivity,
25384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            IActivityContainerCallback callback) {
2539d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        ActivityContainer activityContainer =
2540d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                new VirtualActivityContainer(parentActivity, callback);
2541f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        mActivityContainers.put(activityContainer.mStackId, activityContainer);
2542d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        if (DEBUG_CONTAINERS) Slog.d(TAG, "createActivityContainer: " + activityContainer);
2543f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        parentActivity.mChildContainers.add(activityContainer);
2544f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        return activityContainer;
25454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
25464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
254734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner    void removeChildActivityContainers(ActivityRecord parentActivity) {
2548f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers;
2549f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) {
2550f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            ActivityContainer container = childStacks.remove(containerNdx);
2551d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            if (DEBUG_CONTAINERS) Slog.d(TAG, "removeChildActivityContainers: removing " +
2552d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    container);
2553f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            container.release();
255434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
255534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner    }
255634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner
255795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner    void deleteActivityContainer(IActivityContainer container) {
255895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        ActivityContainer activityContainer = (ActivityContainer)container;
255995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        if (activityContainer != null) {
2560d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            if (DEBUG_CONTAINERS) Slog.d(TAG, "deleteActivityContainer: ",
2561d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    new RuntimeException("here").fillInStackTrace());
256295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            final int stackId = activityContainer.mStackId;
256395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            mActivityContainers.remove(stackId);
256495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            mWindowManager.removeStack(stackId);
256595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        }
256695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner    }
256795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner
2568f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    private int createStackOnDisplay(int stackId, int displayId) {
2569e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
2570e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        if (activityDisplay == null) {
25714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return -1;
25724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
25734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
2574f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer activityContainer = new ActivityContainer(stackId);
2575f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        mActivityContainers.put(stackId, activityContainer);
2576e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        activityContainer.attachToDisplayLocked(activityDisplay);
25774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return stackId;
2578967212cb542e6eeb308678367b53381bff984c31Craig Mautner    }
2579967212cb542e6eeb308678367b53381bff984c31Craig Mautner
25804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    int getNextStackId() {
2581858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        while (true) {
2582858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (++mLastStackId <= HOME_STACK_ID) {
2583858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                mLastStackId = HOME_STACK_ID + 1;
2584858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
2585858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (getStack(mLastStackId) == null) {
2586858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                break;
25878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
25888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2589858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        return mLastStackId;
25908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
25918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2592ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    void createStackForRestoredTaskHistory(ArrayList<TaskRecord> tasks) {
2593ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
2594ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        final ActivityStack stack = getStack(stackId);
2595ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
2596ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            final TaskRecord task = tasks.get(taskNdx);
2597ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            stack.addTask(task, false, false);
2598ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            final int taskId = task.taskId;
2599ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            final ArrayList<ActivityRecord> activities = task.mActivities;
2600ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
2601ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                final ActivityRecord r = activities.get(activityNdx);
2602ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                mWindowManager.addAppToken(0, r.appToken, taskId, stackId,
2603ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        r.info.screenOrientation, r.fullscreen,
2604ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner                        (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0,
2605bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        r.userId, r.info.configChanges, task.voiceSession != null,
2606bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        r.mLaunchTaskBehind);
2607ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner            }
2608ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner        }
2609ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner    }
2610ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner
26118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
2612b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        final TaskRecord task = anyTaskForIdLocked(taskId);
2613b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        if (task == null) {
2614b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner            return;
2615b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        }
26168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
26178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
26188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
26198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
26208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
262141db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner        task.stack.removeTask(task);
2622c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        stack.addTask(task, toTop, true);
2623b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        mWindowManager.addTask(taskId, stackId, toTop);
262405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        resumeTopActivitiesLocked();
26258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
26268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2627ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityRecord findTaskLocked(ActivityRecord r) {
26282a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn        if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r);
2629e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2630e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
26314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
26324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
26334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (!r.isApplicationActivity() && !stack.isHomeStack()) {
26341b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                    if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (home activity) " + stack);
26351b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                    continue;
26361b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                }
26371b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                if (!stack.mActivityContainer.isEligibleForNewTasks()) {
26381b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                    if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (new task not allowed) " +
26391b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner                            stack);
26404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    continue;
26414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
26424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord ar = stack.findTaskLocked(r);
26434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (ar != null) {
26444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return ar;
26454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
26468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
26478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
26482a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn        if (DEBUG_TASKS) Slog.d(TAG, "No task found");
26498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
26508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
26518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
26528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
2653e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2654e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
26554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
26564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord ar = stacks.get(stackNdx).findActivityLocked(intent, info);
26574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (ar != null) {
26584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return ar;
26594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
26608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
26618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
26628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
26638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
26648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
26658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
26660eea92c67b292b005c152641a12b920fe145826cCraig Mautner        scheduleSleepTimeout();
26670eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mGoingToSleep.isHeld()) {
26680eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.acquire();
26697ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
26707ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
26717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
26720eea92c67b292b005c152641a12b920fe145826cCraig Mautner                }
26737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
26747ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
26750eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
26768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2677ce15e157a6cf56fc73961ccb8c5ab18b1bf70280Amith Yamasani        checkReadyForSleepLocked();
26788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
26798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
26808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
26810eea92c67b292b005c152641a12b920fe145826cCraig Mautner        goingToSleepLocked();
26820eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2683f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        boolean timedout = false;
26840eea92c67b292b005c152641a12b920fe145826cCraig Mautner        final long endTime = System.currentTimeMillis() + timeout;
26850eea92c67b292b005c152641a12b920fe145826cCraig Mautner        while (true) {
26860eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean cantShutdown = false;
2687e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2688e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
26894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
26904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    cantShutdown |= stacks.get(stackNdx).checkReadyForSleepLocked();
26914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
26920eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
26930eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (cantShutdown) {
26940eea92c67b292b005c152641a12b920fe145826cCraig Mautner                long timeRemaining = endTime - System.currentTimeMillis();
26950eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (timeRemaining > 0) {
26968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
26970eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        mService.wait(timeRemaining);
26988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
26998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
27000eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } else {
27010eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    Slog.w(TAG, "Activity manager shutdown timed out");
27020eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    timedout = true;
27030eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    break;
27048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
27050eea92c67b292b005c152641a12b920fe145826cCraig Mautner            } else {
27060eea92c67b292b005c152641a12b920fe145826cCraig Mautner                break;
27078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
27088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
27090eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27100eea92c67b292b005c152641a12b920fe145826cCraig Mautner        // Force checkReadyForSleep to complete.
27110eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = true;
27120eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
27130eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
27158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
27168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
27178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
27180eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
27190eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
27200eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
27210eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
2722e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2723e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
27244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
27254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
27264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stack.awakeFromSleepingLocked();
27274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
27284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    resumeTopActivitiesLocked();
27294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
27305314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner            }
27318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
27320eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.clear();
27330eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
27340eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27350eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void activitySleptLocked(ActivityRecord r) {
27360eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.remove(r);
27370eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
27380eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
27390eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27400eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void checkReadyForSleepLocked() {
27410eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mService.isSleepingOrShuttingDown()) {
27420eea92c67b292b005c152641a12b920fe145826cCraig Mautner            // Do not care.
27430eea92c67b292b005c152641a12b920fe145826cCraig Mautner            return;
27440eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
27450eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27460eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mSleepTimeout) {
27470eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean dontSleep = false;
2748e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2749e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
27504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
27514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    dontSleep |= stacks.get(stackNdx).checkReadyForSleepLocked();
27524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
27530eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
27540eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27550eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mStoppingActivities.size() > 0) {
27560eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to stop; can't sleep yet.
27570eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
27580eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mStoppingActivities.size() + " activities");
27590eea92c67b292b005c152641a12b920fe145826cCraig Mautner                scheduleIdleLocked();
27600eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
27610eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
27620eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27630eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mGoingToSleepActivities.size() > 0) {
27640eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to sleep; can't sleep yet.
27650eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
27660eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mGoingToSleepActivities.size() + " activities");
27670eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
27680eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
27690eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27700eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (dontSleep) {
27710eea92c67b292b005c152641a12b920fe145826cCraig Mautner                return;
27720eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
27730eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
27740eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2775e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2776e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
27774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
27784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stacks.get(stackNdx).goToSleep();
27794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
27800eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
27810eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27820eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
27830eea92c67b292b005c152641a12b920fe145826cCraig Mautner
27840eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
27850eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
27860eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
27870eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mService.mShuttingDown) {
27880eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mService.notifyAll();
27890eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
27908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
27918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2792ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean reportResumedActivityLocked(ActivityRecord r) {
2793ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = r.task.stack;
2794ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (isFrontStack(stack)) {
27955782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey            mService.updateUsageStats(r, true);
2796ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2797ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (allResumedActivitiesComplete()) {
2798ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
2799ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.executeAppTransition();
2800ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return true;
2801ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2802ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return false;
2803ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2804ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
28058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
2806e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2807e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
28084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
28094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
28104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
28114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stack.handleAppCrashLocked(app);
28124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
28138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
28148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
28158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
28164b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima    boolean requestVisibleBehindLocked(ActivityRecord r, boolean visible) {
2817ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        final ActivityStack stack = r.task.stack;
2818ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        if (stack == null) {
28194b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: r=" + r + " visible=" +
28204b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima                    visible + " stack is null");
2821ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            return false;
2822ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
28234b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        final boolean isVisible = stack.hasVisibleBehindActivity();
28244b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind r=" + r + " visible=" +
28254b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima                visible + " isVisible=" + isVisible);
2826ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
2827ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        final ActivityRecord top = topRunningActivityLocked();
28284b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        if (top == null || top == r || (visible == isVisible)) {
28294b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: quick return");
28304b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            stack.setVisibleBehindActivity(visible ? r : null);
2831ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            return true;
2832ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
2833ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
2834ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        // A non-top activity is reporting a visibility change.
2835aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner        if (visible && top.fullscreen) {
2836aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            // Let the caller know that it can't be seen.
28374b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: returning top.fullscreen="
283834ff492978d30569e694f7427be430dce66cac06Jose Lima                    + top.fullscreen + " top.state=" + top.state + " top.app=" + top.app +
2839ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner                    " top.app.thread=" + top.app.thread);
2840ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            return false;
284134ff492978d30569e694f7427be430dce66cac06Jose Lima        } else if (!visible && stack.getVisibleBehindActivity() != r) {
284234ff492978d30569e694f7427be430dce66cac06Jose Lima            // Only the activity set as currently visible behind should actively reset its
284334ff492978d30569e694f7427be430dce66cac06Jose Lima            // visible behind state.
284434ff492978d30569e694f7427be430dce66cac06Jose Lima            if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: returning visible="
284534ff492978d30569e694f7427be430dce66cac06Jose Lima                    + visible + " stack.getVisibleBehindActivity()=" +
284634ff492978d30569e694f7427be430dce66cac06Jose Lima                    stack.getVisibleBehindActivity() + " r=" + r);
284734ff492978d30569e694f7427be430dce66cac06Jose Lima            return false;
2848ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
2849ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
28504b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        stack.setVisibleBehindActivity(visible ? r : null);
28514b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        if (!visible) {
2852fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner            // Make the activity immediately above r opaque.
2853fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner            final ActivityRecord next = stack.findNextTranslucentActivity(r);
2854fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner            if (next != null) {
2855fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner                mService.convertFromTranslucent(next.appToken);
2856fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner            }
2857fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner        }
2858aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner        if (top.app != null && top.app.thread != null) {
2859aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            // Notify the top app of the change.
2860aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            try {
2861aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner                top.app.thread.scheduleBackgroundVisibleBehindChanged(top.appToken, visible);
2862aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            } catch (RemoteException e) {
2863aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner            }
2864ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
2865ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        return true;
2866ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner    }
2867ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
2868bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    // Called when WindowManager has finished animating the launchingBehind activity to the back.
2869bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    void handleLaunchTaskBehindCompleteLocked(ActivityRecord r) {
2870bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        r.mLaunchTaskBehind = false;
2871bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        final TaskRecord task = r.task;
2872bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        task.setLastThumbnail(task.stack.screenshotActivities(r));
2873bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        mService.addRecentTaskLocked(task);
2874bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        mWindowManager.setAppVisibility(r.appToken, false);
2875bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    }
2876bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner
2877bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    void scheduleLaunchTaskBehindComplete(IBinder token) {
2878bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner        mHandler.obtainMessage(LAUNCH_TASK_BEHIND_COMPLETE, token).sendToTarget();
2879bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner    }
2880bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner
2881de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
2882580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // First the front stacks. In case any are not fullscreen and are in front of home.
2883e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2884e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
28854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int topStackNdx = stacks.size() - 1;
28864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) {
28874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
2888729cb2391f8eedbab9af1d0ef62febb0b56292ccJose Lima                stack.ensureActivitiesVisibleLocked(starting, configChanges);
2889580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
28908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
28918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
28928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
28938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
2894e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2895e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
28964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
28974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
28984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
2899ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner                stack.scheduleDestroyActivities(app, reason);
29004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
29018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
29028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
29038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
290489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    void releaseSomeActivitiesLocked(ProcessRecord app, String reason) {
290589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // Examine all activities currently running in the process.
290689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        TaskRecord firstTask = null;
290789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // Tasks is non-null only if two or more tasks are found.
290889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        ArraySet<TaskRecord> tasks = null;
290989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        if (DEBUG_RELEASE) Slog.d(TAG, "Trying to release some activities in " + app);
291089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        for (int i=0; i<app.activities.size(); i++) {
291189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            ActivityRecord r = app.activities.get(i);
291289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // First, if we find an activity that is in the process of being destroyed,
291389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // then we just aren't going to do anything for now; we want things to settle
291489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // down before we try to prune more activities.
291589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (r.finishing || r.state == ActivityState.DESTROYING
291689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    || r.state == ActivityState.DESTROYED) {
291789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (DEBUG_RELEASE) Slog.d(TAG, "Abort release; already destroying: " + r);
291889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                return;
291989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
292089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // Don't consider any activies that are currently not in a state where they
292189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // can be destroyed.
292289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (r.visible || !r.stopped || !r.haveState
292389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    || r.state == ActivityState.RESUMED || r.state == ActivityState.PAUSING
292489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    || r.state == ActivityState.PAUSED || r.state == ActivityState.STOPPING) {
292589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (DEBUG_RELEASE) Slog.d(TAG, "Not releasing in-use activity: " + r);
292689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                continue;
292789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
292889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (r.task != null) {
292989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (DEBUG_RELEASE) Slog.d(TAG, "Collecting release task " + r.task
293089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        + " from " + r);
293189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (firstTask == null) {
293289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    firstTask = r.task;
293389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                } else if (firstTask != r.task) {
293489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    if (tasks == null) {
293589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        tasks = new ArraySet<>();
293689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                        tasks.add(firstTask);
293789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    }
293889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    tasks.add(r.task);
293989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
294089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
294189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
294289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        if (tasks == null) {
294389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            if (DEBUG_RELEASE) Slog.d(TAG, "Didn't find two or more tasks to release");
294489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            return;
294589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
294689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // If we have activities in multiple tasks that are in a position to be destroyed,
294789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        // let's iterate through the tasks and release the oldest one.
294889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        final int numDisplays = mActivityDisplays.size();
294989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
295089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
295189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            // Step through all stacks starting from behind, to hit the oldest things first.
295289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            for (int stackNdx = 0; stackNdx < stacks.size(); stackNdx++) {
295389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                final ActivityStack stack = stacks.get(stackNdx);
295489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                // Try to release activities in this stack; if we manage to, we are done.
295589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                if (stack.releaseSomeActivitiesLocked(app, tasks, reason) > 0) {
295689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                    return;
295789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn                }
295889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn            }
295989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn        }
296089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn    }
296189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn
29628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
29634f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId());
29644f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID);
29652420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
2966ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
2967858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStartingUsers.add(uss);
2968e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2969e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
29704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
2971e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ActivityStack stack = stacks.get(stackNdx);
2972e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                stack.switchUserLocked(userId);
2973dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                TaskRecord task = stack.topTask();
2974dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                if (task != null) {
2975dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                    mWindowManager.moveTaskToTop(task.taskId);
2976dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                }
29774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
2978ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        }
2979858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
29804f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        ActivityStack stack = getStack(restoreStackId);
29814f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        if (stack == null) {
29824f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner            stack = mHomeStack;
29834f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        }
29844f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        final boolean homeInFront = stack.isHomeStack();
2985e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        if (stack.isOnHomeDisplay()) {
2986e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            moveHomeStack(homeInFront);
2987dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina            TaskRecord task = stack.topTask();
2988dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina            if (task != null) {
2989dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                mWindowManager.moveTaskToTop(task.taskId);
2990dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina            }
2991e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        } else {
2992e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            // Stack was moved to another display while user was swapped out.
299384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner            resumeHomeStackTask(HOME_ACTIVITY_TYPE, null);
2994e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        }
299593529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        return homeInFront;
29962219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
29972219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
29981a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    /**
29991a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     * Add background users to send boot completed events to.
30001a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     * @param userId The user being started in the background
30011a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     * @param uss The state object for the user.
30021a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     */
30031a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    public void startBackgroundUserLocked(int userId, UserStartedState uss) {
30041a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani        mStartingBackgroundUsers.add(uss);
30051a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    }
30061a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani
3007de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
3008de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        int N = mStoppingActivities.size();
3009de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (N <= 0) return null;
3010de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
3011de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ArrayList<ActivityRecord> stops = null;
3012de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
3013de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean nowVisible = allResumedActivitiesVisible();
3014de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int i=0; i<N; i++) {
3015de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord s = mStoppingActivities.get(i);
3016a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
3017de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + nowVisible + " waitingVisible=" + s.waitingVisible
3018de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + " finishing=" + s.finishing);
3019de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (s.waitingVisible && nowVisible) {
3020de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mWaitingVisibleActivities.remove(s);
3021de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                s.waitingVisible = false;
3022de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (s.finishing) {
3023de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // If this activity is finishing, it is sitting on top of
3024de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // everyone else but we now know it is no longer needed...
3025de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // so get rid of it.  Otherwise, we need to go through the
3026de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // normal flow and hide it once we determine that it is
3027de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // hidden by the activities in front of it.
3028de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
3029ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWindowManager.setAppVisibility(s.appToken, false);
3030de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
3031de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
3032de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) {
3033de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
3034de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (stops == null) {
3035de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    stops = new ArrayList<ActivityRecord>();
3036de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
3037de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stops.add(s);
3038de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStoppingActivities.remove(i);
3039de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                N--;
3040de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                i--;
3041de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
3042de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
3043de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
3044de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return stops;
3045de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
3046de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
3047cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    void validateTopActivitiesLocked() {
30484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        // FIXME
30494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner/*        for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
30504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final ActivityStack stack = stacks.get(stackNdx);
3051cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityRecord r = stack.topRunningActivityLocked(null);
3052f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner            final ActivityState state = r == null ? ActivityState.DESTROYED : r.state;
3053cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (isFrontStack(stack)) {
3054cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r == null) {
3055cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: null top activity, stack=" + stack);
3056cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                } else {
3057f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    final ActivityRecord pausing = stack.mPausingActivity;
3058f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (pausing != null && pausing == r) {
3059cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r +
3060f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
3061cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
3062f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) {
3063cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r +
3064f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                                " state=" + state);
3065cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
3066cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
3067cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            } else {
3068f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                final ActivityRecord resumed = stack.mResumedActivity;
3069f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (resumed != null && resumed == r) {
3070cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r +
3071f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        " state=" + state);
3072cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
3073f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (r != null && (state == ActivityState.INITIALIZING
3074f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        || state == ActivityState.RESUMED)) {
3075cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: activity in back resumed r=" + r +
3076f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
3077cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
3078cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
3079cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
30804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner*/
308176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner    }
308276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner
3083270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
3084d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack);
30854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                pw.print(" mLastFocusedStack="); pw.println(mLastFocusedStack);
3086d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout);
3087d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId);
3088d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
308995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers);
3090270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
30918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
309220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
3093ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack().getDumpActivitiesLocked(name);
309420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
309520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
3096390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage,
3097390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            boolean needSep, String prefix) {
3098390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        if (activity != null) {
3099390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (dumpPackage == null || dumpPackage.equals(activity.packageName)) {
3100390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                if (needSep) {
3101390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    pw.println();
3102390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                }
3103390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.print(prefix);
3104390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println(activity);
31057ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                return true;
3106390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
3107390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        }
31087ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return false;
3109390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    }
3110390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn
31118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
31128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
31137ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean printed = false;
31147ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean needSep = false;
3115e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) {
3116e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx);
3117ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner            pw.print("Display #"); pw.print(activityDisplay.mDisplayId);
3118737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner                    pw.println(" (activities from top to bottom):");
3119e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
3120737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
31214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
31224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                StringBuilder stackHeader = new StringBuilder(128);
31234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stackHeader.append("  Stack #");
31244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stackHeader.append(stack.mStackId);
31254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stackHeader.append(":");
31264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage,
31274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        needSep, stackHeader.toString());
31284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, "    ", "Run", false,
31294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        !dumpAll, false, dumpPackage, true,
31304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        "    Running activities (most recent first):", null);
31314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
31324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                needSep = printed;
31334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep,
31344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        "    mPausingActivity: ");
31354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (pr) {
31364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    printed = true;
31374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    needSep = false;
31384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
31394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep,
31404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        "    mResumedActivity: ");
31417ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                if (pr) {
31427ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    printed = true;
31434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    needSep = false;
31444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
31454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (dumpAll) {
31464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep,
31474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            "    mLastPausedActivity: ");
31484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (pr) {
31494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        printed = true;
31504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        needSep = true;
31514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
31524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage,
31534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            needSep, "    mLastNoHistoryActivity: ");
31547ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                }
31554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                needSep = printed;
31568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
31578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
31588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
31597ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mFinishingActivities, "  ", "Fin", false, !dumpAll,
31607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to finish:", null);
31617ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mStoppingActivities, "  ", "Stop", false, !dumpAll,
31627ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to stop:", null);
31637ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, "  ", "Wait", false, !dumpAll,
31647ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting for another to become visible:",
31657ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                null);
31667ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
31677ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
31687ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
31697ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
3170de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
31717ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return printed;
31728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
31738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
3174390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
31758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
31767ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            String dumpPackage, boolean needNL, String header1, String header2) {
31778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
3178390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String innerPrefix = null;
3179390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String[] args = null;
3180390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        boolean printed = false;
31818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
31828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
31838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
31848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
31858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
3186390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (innerPrefix == null) {
3187390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                innerPrefix = prefix + "      ";
3188390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                args = new String[0];
3189390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
3190390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            printed = true;
31918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
31928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
3193390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println("");
31948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
31958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
31967ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header1 != null) {
31977ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header1);
31987ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header1 = null;
31997ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
32007ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header2 != null) {
32017ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header2);
32027ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header2 = null;
3203390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
32048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
32058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
32068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
32078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
32088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
32098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
32108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
32118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
32128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
32138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
32148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
32158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
32168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
32178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
32188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
32198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
32208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
32218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
32228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
32238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
32248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
32258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
32268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
32278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
32288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
32298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
32308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
32318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
32328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
32338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
32348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
32358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
32368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
32378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
32388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
32398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
32408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
32418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
32428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
32438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
32448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
32458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
32468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
32478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
32488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
32498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
32508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
32518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
32528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
32538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
3254390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        return printed;
32558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
3256ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
3257f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void scheduleIdleTimeoutLocked(ActivityRecord next) {
3258b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4));
3259c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
3260c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
3261f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
3262f333327782e14688e1c198c1192172d51308e90bCraig Mautner
3263f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final void scheduleIdleLocked() {
326405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(IDLE_NOW_MSG);
3265f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
3266f333327782e14688e1c198c1192172d51308e90bCraig Mautner
3267f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void removeTimeoutsForActivityLocked(ActivityRecord r) {
3268b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4));
3269f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
3270f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
3271f333327782e14688e1c198c1192172d51308e90bCraig Mautner
327205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    final void scheduleResumeTopActivities() {
327334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) {
327434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
327534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
327605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
327705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
32780eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void removeSleepTimeouts() {
32790eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = false;
32800eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
32810eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
32820eea92c67b292b005c152641a12b920fe145826cCraig Mautner
32830eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final void scheduleSleepTimeout() {
32840eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
32850eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT);
32860eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
32870eea92c67b292b005c152641a12b920fe145826cCraig Mautner
32884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    @Override
32894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void onDisplayAdded(int displayId) {
3290d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        Slog.v(TAG, "Display added displayId=" + displayId);
32914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0));
32924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
32934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
32944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    @Override
32954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void onDisplayRemoved(int displayId) {
3296d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        Slog.v(TAG, "Display removed displayId=" + displayId);
32974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0));
32984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
32994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    @Override
33014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void onDisplayChanged(int displayId) {
3302d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        Slog.v(TAG, "Display changed displayId=" + displayId);
33034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0));
33044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void handleDisplayAddedLocked(int displayId) {
33074504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        boolean newDisplay;
33084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
33094504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            newDisplay = mActivityDisplays.get(displayId) == null;
33104504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            if (newDisplay) {
33114504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner                ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
33121a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                if (activityDisplay.mDisplay == null) {
33131a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                    Slog.w(TAG, "Display " + displayId + " gone before initialization complete");
33141a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                    return;
33151a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                }
33164504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner                mActivityDisplays.put(displayId, activityDisplay);
33174504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            }
33184504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        }
33194504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        if (newDisplay) {
33204504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            mWindowManager.onDisplayAdded(displayId);
33214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void handleDisplayRemovedLocked(int displayId) {
33254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
3326e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
3327e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (activityDisplay != null) {
3328e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
33294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
333034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    stacks.get(stackNdx).mActivityContainer.detachLocked();
33314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
3332e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplays.remove(displayId);
33334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
33344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mWindowManager.onDisplayRemoved(displayId);
33364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void handleDisplayChangedLocked(int displayId) {
33394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
3340e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
3341e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (activityDisplay != null) {
33424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                // TODO: Update the bounds.
33434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
33444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mWindowManager.onDisplayChanged(displayId);
33464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    StackInfo getStackInfo(ActivityStack stack) {
33494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        StackInfo info = new StackInfo();
33504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mWindowManager.getStackBounds(stack.mStackId, info.bounds);
33514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.displayId = Display.DEFAULT_DISPLAY;
33524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.stackId = stack.mStackId;
33534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<TaskRecord> tasks = stack.getAllTasks();
33554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final int numTasks = tasks.size();
33564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        int[] taskIds = new int[numTasks];
33574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        String[] taskNames = new String[numTasks];
33584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int i = 0; i < numTasks; ++i) {
33594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final TaskRecord task = tasks.get(i);
33604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            taskIds[i] = task.taskId;
33614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            taskNames[i] = task.origActivity != null ? task.origActivity.flattenToString()
33624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    : task.realActivity != null ? task.realActivity.flattenToString()
33634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    : task.getTopActivity() != null ? task.getTopActivity().packageName
33644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    : "unknown";
33654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.taskIds = taskIds;
33674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.taskNames = taskNames;
33684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return info;
33694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    StackInfo getStackInfoLocked(int stackId) {
33724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ActivityStack stack = getStack(stackId);
33734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (stack != null) {
33744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return getStackInfo(stack);
33754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return null;
33774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    ArrayList<StackInfo> getAllStackInfosLocked() {
33804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<StackInfo> list = new ArrayList<StackInfo>();
3381e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) {
3382e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
33834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int ndx = stacks.size() - 1; ndx >= 0; --ndx) {
33844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                list.add(getStackInfo(stacks.get(ndx)));
33854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
33864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return list;
33884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
33894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3390a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk    void showLockTaskToast() {
3391a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk        mLockTaskNotify.showToast(mLockTaskIsLocked);
3392a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk    }
3393a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk
3394a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk    void setLockTaskModeLocked(TaskRecord task, boolean isLocked) {
3395aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (task == null) {
33963bd90617ec07a1093139de39591a624b21468e46Christopher Tate            // Take out of lock task mode if necessary
33973bd90617ec07a1093139de39591a624b21468e46Christopher Tate            if (mLockTaskModeTask != null) {
33983bd90617ec07a1093139de39591a624b21468e46Christopher Tate                final Message lockTaskMsg = Message.obtain();
33993bd90617ec07a1093139de39591a624b21468e46Christopher Tate                lockTaskMsg.arg1 = mLockTaskModeTask.userId;
34003bd90617ec07a1093139de39591a624b21468e46Christopher Tate                lockTaskMsg.what = LOCK_TASK_END_MSG;
34013bd90617ec07a1093139de39591a624b21468e46Christopher Tate                mLockTaskModeTask = null;
34023bd90617ec07a1093139de39591a624b21468e46Christopher Tate                mHandler.sendMessage(lockTaskMsg);
34033bd90617ec07a1093139de39591a624b21468e46Christopher Tate            }
3404aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            return;
3405aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
3406aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (isLockTaskModeViolation(task)) {
3407aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            Slog.e(TAG, "setLockTaskMode: Attempt to start a second Lock Task Mode task.");
3408aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            return;
3409aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
3410aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        mLockTaskModeTask = task;
3411aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        findTaskToMoveToFrontLocked(task, 0, null);
3412aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        resumeTopActivitiesLocked();
34133bd90617ec07a1093139de39591a624b21468e46Christopher Tate
34143bd90617ec07a1093139de39591a624b21468e46Christopher Tate        final Message lockTaskMsg = Message.obtain();
341535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk        lockTaskMsg.obj = mLockTaskModeTask.intent.getComponent().getPackageName();
341635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk        lockTaskMsg.arg1 = mLockTaskModeTask.userId;
34175286d3ff47135976d66d67888cadca52ef2ab244justinzhang        lockTaskMsg.what = LOCK_TASK_START_MSG;
3418a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk        lockTaskMsg.arg2 = !isLocked ? 1 : 0;
34195286d3ff47135976d66d67888cadca52ef2ab244justinzhang        mHandler.sendMessage(lockTaskMsg);
3420aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
3421aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
3422aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    boolean isLockTaskModeViolation(TaskRecord task) {
3423aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        return mLockTaskModeTask != null && mLockTaskModeTask != task;
3424aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
3425aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
3426aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    void endLockTaskModeIfTaskEnding(TaskRecord task) {
3427aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (mLockTaskModeTask != null && mLockTaskModeTask == task) {
3428835495c1175cd159635997ecff4281eb51e72fe6Jason Monk            final Message lockTaskMsg = Message.obtain();
3429835495c1175cd159635997ecff4281eb51e72fe6Jason Monk            lockTaskMsg.arg1 = mLockTaskModeTask.userId;
3430835495c1175cd159635997ecff4281eb51e72fe6Jason Monk            lockTaskMsg.what = LOCK_TASK_END_MSG;
3431aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            mLockTaskModeTask = null;
3432835495c1175cd159635997ecff4281eb51e72fe6Jason Monk            mHandler.sendMessage(lockTaskMsg);
3433aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
3434aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
3435aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
3436aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    boolean isInLockTaskMode() {
3437aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        return mLockTaskModeTask != null;
3438aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
3439aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
3440ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    private final class ActivityStackSupervisorHandler extends Handler {
3441f333327782e14688e1c198c1192172d51308e90bCraig Mautner
3442ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public ActivityStackSupervisorHandler(Looper looper) {
3443ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            super(looper);
3444ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
3445ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
3446f333327782e14688e1c198c1192172d51308e90bCraig Mautner        void activityIdleInternal(ActivityRecord r) {
3447f333327782e14688e1c198c1192172d51308e90bCraig Mautner            synchronized (mService) {
3448f333327782e14688e1c198c1192172d51308e90bCraig Mautner                activityIdleInternalLocked(r != null ? r.appToken : null, true, null);
3449f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
34507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
34517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
3452ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        @Override
3453ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public void handleMessage(Message msg) {
3454ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            switch (msg.what) {
3455f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_TIMEOUT_MSG: {
34565eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
3457f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    if (mService.mDidDexOpt) {
3458f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.mDidDexOpt = false;
3459f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
3460f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        nmsg.obj = msg.obj;
3461f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
3462f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        return;
3463f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
3464f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // We don't at this point know if the activity is fullscreen,
3465f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // so we need to be conservative and assume it isn't.
3466f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
3467f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
3468f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_NOW_MSG: {
34695eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
3470f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
3471f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
347205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                case RESUME_TOP_ACTIVITY_MSG: {
347305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    synchronized (mService) {
347405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                        resumeTopActivitiesLocked();
347505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    }
347605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } break;
34770eea92c67b292b005c152641a12b920fe145826cCraig Mautner                case SLEEP_TIMEOUT_MSG: {
34780eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    synchronized (mService) {
34790eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        if (mService.isSleepingOrShuttingDown()) {
34800eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
34810eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            mSleepTimeout = true;
34820eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            checkReadyForSleepLocked();
34830eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        }
34840eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    }
34850eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } break;
34867ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                case LAUNCH_TIMEOUT_MSG: {
34877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    if (mService.mDidDexOpt) {
34887ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mService.mDidDexOpt = false;
34897ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
34907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        return;
34917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
34927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    synchronized (mService) {
34937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        if (mLaunchingActivity.isHeld()) {
34947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
34957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            if (VALIDATE_WAKE_LOCK_CALLER
34967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                    && Binder.getCallingUid() != Process.myUid()) {
34977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                throw new IllegalStateException("Calling must be system uid");
34987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            }
34997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            mLaunchingActivity.release();
35007ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        }
35017ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
35027ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                } break;
35034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                case HANDLE_DISPLAY_ADDED: {
35044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    handleDisplayAddedLocked(msg.arg1);
35054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                } break;
35064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                case HANDLE_DISPLAY_CHANGED: {
35074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    handleDisplayChangedLocked(msg.arg1);
35084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                } break;
35094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                case HANDLE_DISPLAY_REMOVED: {
35104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    handleDisplayRemovedLocked(msg.arg1);
35114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                } break;
3512e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                case CONTAINER_CALLBACK_VISIBILITY: {
3513e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    final ActivityContainer container = (ActivityContainer) msg.obj;
3514d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    final IActivityContainerCallback callback = container.mCallback;
3515d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    if (callback != null) {
3516d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        try {
3517d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                            callback.setVisible(container.asBinder(), msg.arg1 == 1);
3518d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        } catch (RemoteException e) {
3519d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        }
3520e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    }
3521d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                } break;
35225286d3ff47135976d66d67888cadca52ef2ab244justinzhang                case LOCK_TASK_START_MSG: {
35235286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    // When lock task starts, we disable the status bars.
35245286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    try {
352562515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        if (mLockTaskNotify == null) {
352662515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            mLockTaskNotify = new LockTaskNotify(mService.mContext);
352762515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        }
352862515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        mLockTaskNotify.show(true);
35292961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk                        mLockTaskIsLocked = msg.arg2 == 0;
35305286d3ff47135976d66d67888cadca52ef2ab244justinzhang                        if (getStatusBarService() != null) {
353162515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            int flags =
353262515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    StatusBarManager.DISABLE_MASK ^ StatusBarManager.DISABLE_BACK;
35332961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk                            if (!mLockTaskIsLocked) {
353462515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                flags ^= StatusBarManager.DISABLE_HOME
353562515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                        | StatusBarManager.DISABLE_RECENT;
353662515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            }
353762515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            getStatusBarService().disable(flags, mToken,
353862515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    mService.mContext.getPackageName());
35395286d3ff47135976d66d67888cadca52ef2ab244justinzhang                        }
354062515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG);
354135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                        if (getDevicePolicyManager() != null) {
354235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                            getDevicePolicyManager().notifyLockTaskModeChanged(true,
354362515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    (String)msg.obj, msg.arg1);
354435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                        }
35455286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    } catch (RemoteException ex) {
35465286d3ff47135976d66d67888cadca52ef2ab244justinzhang                        throw new RuntimeException(ex);
35475286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    }
3548b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner                } break;
35495286d3ff47135976d66d67888cadca52ef2ab244justinzhang                case LOCK_TASK_END_MSG: {
35505286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    // When lock task ends, we enable the status bars.
35515286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    try {
355262515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        if (getStatusBarService() != null) {
355362515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            getStatusBarService().disable(StatusBarManager.DISABLE_NONE, mToken,
355462515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    mService.mContext.getPackageName());
355562515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        }
355662515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        mWindowManager.reenableKeyguard(mToken);
355735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                        if (getDevicePolicyManager() != null) {
355835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                            getDevicePolicyManager().notifyLockTaskModeChanged(false, null,
355935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                                    msg.arg1);
356035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk                        }
356162515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        if (mLockTaskNotify == null) {
356262515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            mLockTaskNotify = new LockTaskNotify(mService.mContext);
356362515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        }
356462515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        mLockTaskNotify.show(false);
356562515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        try {
356694cfd9d7c42287c18bde29aa1ae34944eb448f45Jason Monk                            boolean shouldLockKeyguard = Settings.Secure.getInt(
356762515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                    mService.mContext.getContentResolver(),
356894cfd9d7c42287c18bde29aa1ae34944eb448f45Jason Monk                                    Settings.Secure.LOCK_TO_APP_EXIT_LOCKED) != 0;
35692961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk                            if (!mLockTaskIsLocked && shouldLockKeyguard) {
357062515beee67307d8859beec521b7baedfa54b2b5Jason Monk                                mWindowManager.lockNow(null);
35717779bf1ce8243d9f856c05db3cc5a37a8227a970Jason Monk                                mWindowManager.dismissKeyguard();
3572e069779dea07c77fb858a403c42020e39b3d9c60Jason Monk                                new LockPatternUtils(mService.mContext)
3573e069779dea07c77fb858a403c42020e39b3d9c60Jason Monk                                        .requireCredentialEntry(UserHandle.USER_ALL);
357462515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            }
357562515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        } catch (SettingNotFoundException e) {
357662515beee67307d8859beec521b7baedfa54b2b5Jason Monk                            // No setting, don't lock.
357762515beee67307d8859beec521b7baedfa54b2b5Jason Monk                        }
35785286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    } catch (RemoteException ex) {
35795286d3ff47135976d66d67888cadca52ef2ab244justinzhang                        throw new RuntimeException(ex);
35805286d3ff47135976d66d67888cadca52ef2ab244justinzhang                    }
3581b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner                } break;
3582d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                case CONTAINER_CALLBACK_TASK_LIST_EMPTY: {
3583d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    final ActivityContainer container = (ActivityContainer) msg.obj;
3584d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    final IActivityContainerCallback callback = container.mCallback;
3585d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    if (callback != null) {
3586d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        try {
3587d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                            callback.onAllActivitiesComplete(container.asBinder());
3588d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        } catch (RemoteException e) {
3589d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                        }
3590d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                    }
3591d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner                } break;
3592d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                case CONTAINER_TASK_LIST_EMPTY_TIMEOUT: {
3593d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    synchronized (mService) {
3594d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                        Slog.w(TAG, "Timeout waiting for all activities in task to finish. " +
3595d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                                msg.obj);
3596ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                        final ActivityContainer container = (ActivityContainer) msg.obj;
3597ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                        container.mStack.finishAllActivitiesLocked(true);
3598ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                        container.onTaskListEmptyLocked();
3599d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    }
3600d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                } break;
3601bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                case LAUNCH_TASK_BEHIND_COMPLETE: {
3602bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                    synchronized (mService) {
3603bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        ActivityRecord r = ActivityRecord.forToken((IBinder) msg.obj);
3604bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        if (r != null) {
3605bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                            handleLaunchTaskBehindCompleteLocked(r);
3606bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                        }
3607bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                    }
3608bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner                } break;
3609ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
3610ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
3611ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
3612ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3613b081a59a0fdec88dd9b0f68b45c2f625f751d625Ying Wang    class ActivityContainer extends android.app.IActivityContainer.Stub {
36147f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner        final static int FORCE_NEW_TASK_FLAGS = Intent.FLAG_ACTIVITY_NEW_TASK |
3615e6d80f4ce433e16dc72ea3291801169eb507a695Craig Mautner                Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION;
36164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final int mStackId;
3617f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        IActivityContainerCallback mCallback = null;
36184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final ActivityStack mStack;
3619f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityRecord mParentActivity = null;
3620f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        String mIdString;
3621ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3622e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner        boolean mVisible = true;
3623e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner
36244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        /** Display this ActivityStack is currently on. Null if not attached to a Display. */
3625e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityDisplay mActivityDisplay;
36264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3627f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final static int CONTAINER_STATE_HAS_SURFACE = 0;
3628f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final static int CONTAINER_STATE_NO_SURFACE = 1;
3629f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final static int CONTAINER_STATE_FINISHING = 2;
3630f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        int mContainerState = CONTAINER_STATE_HAS_SURFACE;
3631f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3632f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer(int stackId) {
36334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            synchronized (mService) {
36344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                mStackId = stackId;
36354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                mStack = new ActivityStack(this);
3636f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mIdString = "ActivtyContainer{" + mStackId + "}";
363734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "Creating " + this);
36384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
3639ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner        }
3640ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3641e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        void attachToDisplayLocked(ActivityDisplay activityDisplay) {
364234b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "attachToDisplayLocked: " + this
364334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    + " to display=" + activityDisplay);
3644e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mActivityDisplay = activityDisplay;
3645e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStack.mDisplayId = activityDisplay.mDisplayId;
3646e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStack.mStacks = activityDisplay.mStacks;
3647e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner
3648e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            activityDisplay.attachActivities(mStack);
3649df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mWindowManager.attachStack(mStackId, activityDisplay.mDisplayId);
36504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
36514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
36524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3653ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        public void attachToDisplay(int displayId) {
36544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            synchronized (mService) {
3655e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
3656e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                if (activityDisplay == null) {
36574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return;
36584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
3659e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                attachToDisplayLocked(activityDisplay);
36604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
36614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
36624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
36634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3664ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        public int getDisplayId() {
3665d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            synchronized (mService) {
3666d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                if (mActivityDisplay != null) {
3667d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    return mActivityDisplay.mDisplayId;
3668d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                }
3669e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
3670e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            return -1;
36714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
36724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3673ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        @Override
3674ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        public boolean injectEvent(InputEvent event) {
3675ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            final long origId = Binder.clearCallingIdentity();
3676ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            try {
3677d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                synchronized (mService) {
3678d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    if (mActivityDisplay != null) {
3679d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                        return mInputManagerInternal.injectInputEvent(event,
3680d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                                mActivityDisplay.mDisplayId,
3681d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                                InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
3682d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    }
3683ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                }
3684ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                return false;
3685ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            } finally {
3686ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                Binder.restoreCallingIdentity(origId);
3687ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            }
3688ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        }
3689ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown
3690f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
3691f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public void release() {
3692d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            synchronized (mService) {
3693d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                if (mContainerState == CONTAINER_STATE_FINISHING) {
3694d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    return;
3695d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                }
3696d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                mContainerState = CONTAINER_STATE_FINISHING;
3697d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner
3698d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                final Message msg =
3699d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                        mHandler.obtainMessage(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this);
3700ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                mHandler.sendMessageDelayed(msg, 2000);
3701d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner
3702d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                long origId = Binder.clearCallingIdentity();
3703d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                try {
3704ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner                    mStack.finishAllActivitiesLocked(false);
37057f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner                    removePendingActivityLaunchesLocked(mStack);
3706d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                } finally {
3707d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    Binder.restoreCallingIdentity(origId);
3708d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                }
3709d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            }
3710f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3711f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
37126025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner        protected void detachLocked() {
371334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display="
371434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    + mActivityDisplay + " Callers=" + Debug.getCallers(2));
3715e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (mActivityDisplay != null) {
3716e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplay.detachActivitiesLocked(mStack);
3717e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplay = null;
3718e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mStack.mDisplayId = -1;
3719e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mStack.mStacks = null;
3720df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                mWindowManager.detachStack(mStackId);
37214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
37224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
37234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
37244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3725e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        public final int startActivity(Intent intent) {
3726df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mService.enforceNotIsolatedCaller("ActivityContainer.startActivity");
3727e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            int userId = mService.handleIncomingUser(Binder.getCallingPid(),
3728409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn                    Binder.getCallingUid(), mCurrentUser, false,
3729409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn                    ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null);
3730e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            // TODO: Switch to user app stacks here.
37317f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner            intent.addFlags(FORCE_NEW_TASK_FLAGS);
3732e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            String mimeType = intent.getType();
3733e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (mimeType == null && intent.getData() != null
3734e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    && "content".equals(intent.getData().getScheme())) {
3735e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mimeType = mService.getProviderMimeType(intent.getData(), userId);
3736e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
37371b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            return startActivityMayWait(null, -1, null, intent, mimeType, null, null, null, null, 0,
37381b012d302b56b4adf950035136d1d191a1936d5aJeff Hao                    0, null, null, null, null, userId, this, null);
37394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
37404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
37414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3742df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        public final int startActivityIntentSender(IIntentSender intentSender) {
3743df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender");
3744df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
3745df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            if (!(intentSender instanceof PendingIntentRecord)) {
3746df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                throw new IllegalArgumentException("Bad PendingIntent object");
3747df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            }
3748df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
3749df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            return ((PendingIntentRecord)intentSender).sendInner(0, null, null, null, null, null,
37507f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner                    null, 0, FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this);
3751df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        }
3752df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
3753247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        private void checkEmbeddedAllowedInner(Intent intent, String resolvedType) {
3754247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            int userId = mService.handleIncomingUser(Binder.getCallingPid(),
3755409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn                    Binder.getCallingUid(), mCurrentUser, false,
3756409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn                    ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null);
3757247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            if (resolvedType == null) {
3758247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                resolvedType = intent.getType();
3759247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                if (resolvedType == null && intent.getData() != null
3760247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                        && "content".equals(intent.getData().getScheme())) {
3761247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                    resolvedType = mService.getProviderMimeType(intent.getData(), userId);
3762247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                }
3763247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            }
37641b012d302b56b4adf950035136d1d191a1936d5aJeff Hao            ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId);
376505678d5a3136a747a2e7eaccca0ad148c52a2d00Craig Mautner            if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) {
3766247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                throw new SecurityException(
3767247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                        "Attempt to embed activity that has not set allowEmbedded=\"true\"");
3768247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            }
3769247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        }
3770247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner
3771247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        /** Throw a SecurityException if allowEmbedded is not true */
3772247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        @Override
3773247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        public final void checkEmbeddedAllowed(Intent intent) {
3774247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            checkEmbeddedAllowedInner(intent, null);
3775247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        }
3776247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner
3777247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        /** Throw a SecurityException if allowEmbedded is not true */
3778247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        @Override
3779247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        public final void checkEmbeddedAllowedIntentSender(IIntentSender intentSender) {
3780247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            if (!(intentSender instanceof PendingIntentRecord)) {
3781247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                throw new IllegalArgumentException("Bad PendingIntent object");
3782247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            }
3783247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender;
3784247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            checkEmbeddedAllowedInner(pendingIntent.key.requestIntent,
3785247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                    pendingIntent.key.requestResolvedType);
3786247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        }
3787247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner
3788df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        @Override
37894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        public IBinder asBinder() {
37904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return this;
37914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
37924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
37934504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        @Override
3794f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public void setSurface(Surface surface, int width, int height, int density) {
3795df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface");
37964504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        }
37974504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner
37984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ActivityStackSupervisor getOuter() {
37994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return ActivityStackSupervisor.this;
38004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
38014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3802d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        boolean isAttachedLocked() {
3803e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            return mActivityDisplay != null;
38044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
38054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
38064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        void getBounds(Point outBounds) {
3807d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            synchronized (mService) {
3808d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    if (mActivityDisplay != null) {
3809d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    mActivityDisplay.getBounds(outBounds);
3810d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                } else {
3811d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                    outBounds.set(0, 0);
3812d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                }
38134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
3814ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner        }
381534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner
38166985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        // TODO: Make sure every change to ActivityRecord.visible results in a call to this.
3817e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner        void setVisible(boolean visible) {
3818e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner            if (mVisible != visible) {
3819e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                mVisible = visible;
3820e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                if (mCallback != null) {
3821e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0,
3822e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                            0 /* unused */, this).sendToTarget();
3823e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                }
3824e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner            }
3825e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner        }
3826e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner
38276985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        void setDrawn() {
38286985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        }
38296985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
38301b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        // You can always start a new task on a regular ActivityStack.
38311b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        boolean isEligibleForNewTasks() {
38321b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner            return true;
38331b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        }
38341b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner
3835d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        void onTaskListEmptyLocked() {
3836d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner        }
3837d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner
383834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        @Override
383934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        public String toString() {
384034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            return mIdString + (mActivityDisplay == null ? "N" : "A");
384134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
3842ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner    }
3843ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3844f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    private class VirtualActivityContainer extends ActivityContainer {
3845f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        Surface mSurface;
38466985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        boolean mDrawn = false;
3847f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3848f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) {
3849f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            super(getNextStackId());
3850f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mParentActivity = parent;
3851f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mCallback = callback;
3852f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mContainerState = CONTAINER_STATE_NO_SURFACE;
3853d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}";
3854f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3855f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3856f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
3857f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public void setSurface(Surface surface, int width, int height, int density) {
3858f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            super.setSurface(surface, width, height, density);
3859f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3860f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            synchronized (mService) {
3861f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                final long origId = Binder.clearCallingIdentity();
3862f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                try {
3863f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    setSurfaceLocked(surface, width, height, density);
3864f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                } finally {
3865f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    Binder.restoreCallingIdentity(origId);
3866f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                }
3867f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3868f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3869f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3870f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        private void setSurfaceLocked(Surface surface, int width, int height, int density) {
3871f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mContainerState == CONTAINER_STATE_FINISHING) {
3872f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                return;
3873f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3874f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            VirtualActivityDisplay virtualActivityDisplay =
3875f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    (VirtualActivityDisplay) mActivityDisplay;
3876f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (virtualActivityDisplay == null) {
3877f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                virtualActivityDisplay =
38786985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                        new VirtualActivityDisplay(width, height, density);
3879f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mActivityDisplay = virtualActivityDisplay;
3880f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay);
3881f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                attachToDisplayLocked(virtualActivityDisplay);
3882f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3883f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3884f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mSurface != null) {
3885f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mSurface.release();
3886f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3887f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
38886985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            mSurface = surface;
3889f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (surface != null) {
3890f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mStack.resumeTopActivityLocked(null);
3891f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            } else {
3892f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mContainerState = CONTAINER_STATE_NO_SURFACE;
38936985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                ((VirtualActivityDisplay) mActivityDisplay).setSurface(null);
3894d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner                if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
3895a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn                    mStack.startPausingLocked(false, true, false, false);
3896d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner                }
3897f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
38986985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
3899d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            setSurfaceIfReadyLocked();
39006985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
3901f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display="
3902f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    + virtualActivityDisplay);
39036985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        }
3904f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
39056985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        @Override
3906d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        boolean isAttachedLocked() {
3907d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            return mSurface != null && super.isAttachedLocked();
3908d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner        }
3909d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner
3910d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner        @Override
39116985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        void setDrawn() {
39126985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            synchronized (mService) {
39136985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                mDrawn = true;
3914d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner                setSurfaceIfReadyLocked();
39156985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            }
39166985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        }
39176985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
39181b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        // Never start a new task on an ActivityView if it isn't explicitly specified.
39191b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        @Override
39201b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        boolean isEligibleForNewTasks() {
39211b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner            return false;
39221b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner        }
39231b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner
39246025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner        void onTaskListEmptyLocked() {
39256025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner            mHandler.removeMessages(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this);
39266025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner            detachLocked();
39276025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner            deleteActivityContainer(this);
39286025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner            mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget();
39296025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner        }
39306025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner
3931d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner        private void setSurfaceIfReadyLocked() {
3932d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner            if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn +
39336985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                    " mContainerState=" + mContainerState + " mSurface=" + mSurface);
39346985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) {
39356985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface);
39366985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                mContainerState = CONTAINER_STATE_HAS_SURFACE;
39376985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            }
3938f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3939f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    }
3940f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
39414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** Exactly one of these classes per Display in the system. Capable of holding zero or more
39424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner     * attached {@link ActivityStack}s */
3943f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    class ActivityDisplay {
39444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        /** Actual Display this object tracks. */
394534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        int mDisplayId;
394634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        Display mDisplay;
394734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        DisplayInfo mDisplayInfo = new DisplayInfo();
39484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
39494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        /** All of the stacks on this display. Order matters, topmost stack is in front of all other
39504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner         * stacks, bottommost behind. Accessed directly by ActivityManager package classes */
3951e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        final ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
39524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
39534b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        ActivityRecord mVisibleBehindActivity;
3954ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
3955f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityDisplay() {
3956f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
39574504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner
39581a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner        // After instantiation, check that mDisplay is not null before using this. The alternative
39591a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner        // is for this to throw an exception if mDisplayManager.getDisplay() returns null.
3960e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityDisplay(int displayId) {
39611a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner            final Display display = mDisplayManager.getDisplay(displayId);
39621a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner            if (display == null) {
39631a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner                return;
39641a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner            }
39651a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner            init(display);
39664504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        }
39674504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner
3968f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        void init(Display display) {
39694504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            mDisplay = display;
39704504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            mDisplayId = display.getDisplayId();
39714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplay.getDisplayInfo(mDisplayInfo);
39724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
39734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
39744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        void attachActivities(ActivityStack stack) {
3975e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (DEBUG_STACK) Slog.v(TAG, "attachActivities: attaching " + stack + " to displayId="
3976e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    + mDisplayId);
3977e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStacks.add(stack);
39784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
39794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3980e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        void detachActivitiesLocked(ActivityStack stack) {
398134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            if (DEBUG_STACK) Slog.v(TAG, "detachActivitiesLocked: detaching " + stack
3982e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    + " from displayId=" + mDisplayId);
3983e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStacks.remove(stack);
39844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
39854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
39864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        void getBounds(Point bounds) {
39874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplay.getDisplayInfo(mDisplayInfo);
39884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            bounds.x = mDisplayInfo.appWidth;
39894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            bounds.y = mDisplayInfo.appHeight;
3990ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner        }
399134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner
39924b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        void setVisibleBehindActivity(ActivityRecord r) {
39934b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            mVisibleBehindActivity = r;
3994ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
3995ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
39964b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima        boolean hasVisibleBehindActivity() {
39974b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima            return mVisibleBehindActivity != null;
3998ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner        }
3999ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner
400034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        @Override
400134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        public String toString() {
4002f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}";
4003f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
4004f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    }
4005f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4006f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    class VirtualActivityDisplay extends ActivityDisplay {
4007f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        VirtualDisplay mVirtualDisplay;
4008f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
40096985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        VirtualActivityDisplay(int width, int height, int density) {
4010f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
4011c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright            mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, null,
4012c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                    VIRTUAL_DISPLAY_BASE_NAME, width, height, density, null,
4013c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                    DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
4014c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright                    DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, null, null);
4015f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4016f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            init(mVirtualDisplay.getDisplay());
4017f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4018f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mWindowManager.handleDisplayAdded(mDisplayId);
4019f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
4020f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4021f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        void setSurface(Surface surface) {
4022f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mVirtualDisplay != null) {
4023f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mVirtualDisplay.setSurface(surface);
4024f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
4025f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
4026f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4027f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
4028f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        void detachActivitiesLocked(ActivityStack stack) {
4029f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            super.detachActivitiesLocked(stack);
4030f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mVirtualDisplay != null) {
4031f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mVirtualDisplay.release();
4032f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mVirtualDisplay = null;
4033f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
4034f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
4035f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
4036f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
4037f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public String toString() {
4038f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            return "VirtualActivityDisplay={" + mDisplayId + "}";
403934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
4040ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner    }
404158e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
404258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima    private boolean isLeanbackOnlyDevice() {
404358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        boolean onLeanbackOnly = false;
404458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        try {
404558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima            onLeanbackOnly = AppGlobals.getPackageManager().hasSystemFeature(
404658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima                    PackageManager.FEATURE_LEANBACK_ONLY);
404758e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        } catch (RemoteException e) {
404858e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima            // noop
404958e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        }
405058e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima
405158e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima        return onLeanbackOnly;
405258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima    }
4053270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
4054