ActivityStackSupervisor.java revision a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bd
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;
34e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautnerimport static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE;
35e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautnerimport static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
36e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig 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;
4820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
4923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
502420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo;
5123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
522219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
5323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
542219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
5523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
562219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
5723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
5823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
5923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
6023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.graphics.Point;
624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager;
634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager.DisplayListener;
644504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.DisplayManagerGlobal;
654504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.VirtualDisplay;
66ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManager;
67ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManagerInternal;
6823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
70b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug;
71ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler;
7223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
732219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
742420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message;
7523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
760eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport android.os.PowerManager;
777ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautnerimport android.os.Process;
788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
7923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
806170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle;
8191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionSession;
822420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog;
838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseArray;
852219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseIntArray;
87ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.view.Display;
884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.view.DisplayInfo;
89ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.view.InputEvent;
904504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.view.Surface;
9123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
9291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor;
93cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe;
94ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport com.android.server.LocalServices;
956170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
962420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
97ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService;
9823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
1008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
101270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
1022219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
1038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
104270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerpublic final class ActivityStackSupervisor implements DisplayListener {
106de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG = ActivityManagerService.DEBUG || false;
107de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_ADD_REMOVE = DEBUG || false;
108de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_APP = DEBUG || false;
109de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_SAVED_STATE = DEBUG || false;
110a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner    static final boolean DEBUG_STATES = DEBUG || false;
111b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner    static final boolean DEBUG_IDLE = DEBUG || false;
1122420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1132219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
114270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
115f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** How long we wait until giving up on the last activity telling us it is idle. */
116f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_TIMEOUT = 10*1000;
117f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1180eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** How long we can hold the sleep wake lock before giving up. */
1190eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT = 5*1000;
1200eea92c67b292b005c152641a12b920fe145826cCraig Mautner
1217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // How long we can hold the launch wake lock before giving up.
1227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT = 10*1000;
1237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
12405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG;
12505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1;
12605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2;
1270eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3;
1287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4;
1294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5;
1304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6;
1314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7;
132e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner    static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8;
1334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
1344504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner    private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay";
1357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // For debugging to make sure the caller when acquiring/releasing our
1377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // wake lock is the system process.
1387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final boolean VALIDATE_WAKE_LOCK_CALLER = false;
139f333327782e14688e1c198c1192172d51308e90bCraig Mautner
140270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
141270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
142ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ActivityStackSupervisorHandler mHandler;
143ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
144ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** Short cut */
145ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    WindowManagerService mWindowManager;
1464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    DisplayManager mDisplayManager;
147ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
148270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    /** Dismiss the keyguard after the next activity is displayed? */
1495314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner    boolean mDismissKeyguardOnNextActivity = false;
150270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
152d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner    private int mLastStackId = HOME_STACK_ID;
1538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
1558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
1568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
1578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1582420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
1592420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
1602420ead0326bfd2587da6231be419e758dba1930Craig Mautner
161e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner    /** The stack containing the launcher app. Assumed to always be attached to
162e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner     * Display.DEFAULT_DISPLAY. */
1632219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
16420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
165e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner    /** The stack currently receiving input or launching the next activity. */
16629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    private ActivityStack mFocusedStack;
1678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** If this is the same as mFocusedStack then the activity on the top of the focused stack has
1694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner     * been resumed. If stacks are changing position this will hold the old stack until the new
170e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner     * stack becomes resumed after which it will be set to mFocusedStack. */
1714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    private ActivityStack mLastFocusedStack;
172de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
173de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are waiting for a new activity to become visible before completing
174de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * whatever operation they are supposed to do. */
175de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();
176de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
177ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next visible activity. */
178ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
179ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
180ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
181ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next launched activity. */
182ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
183ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
184ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
185de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are ready to be stopped, but waiting for the next activity to
186de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * settle down before doing so. */
187de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();
188de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
189f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of activities that are ready to be finished, but waiting for the previous activity to
190f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * settle down before doing so.  It contains ActivityRecord objects. */
191f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();
192f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1930eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** List of activities that are in the process of going to sleep. */
1940eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>();
1950eea92c67b292b005c152641a12b920fe145826cCraig Mautner
196f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** Used on user changes */
197f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>();
198f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1991a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    /** Used to queue up any background users being started */
2001a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    final ArrayList<UserStartedState> mStartingBackgroundUsers = new ArrayList<UserStartedState>();
2011a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani
202de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity
203de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * is being brought in front of us. */
204de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean mUserLeaving = false;
205de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2060eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** Set when we have taken too long waiting to go to sleep. */
2070eea92c67b292b005c152641a12b920fe145826cCraig Mautner    boolean mSleepTimeout = false;
2080eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2090eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /**
2107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * We don't want to allow the device to go to sleep while in the process
2117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * of launching an activity.  This is primarily to allow alarm intent
2127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * receivers to launch an activity and get that to run before the device
2137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * goes back to sleep.
2147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     */
2157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    final PowerManager.WakeLock mLaunchingActivity;
2167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    /**
2180eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * Set when the system is going to sleep, until we have
2190eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * successfully paused the current activity and released our wake lock.
2200eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * At that point the system is allowed to actually sleep.
2210eea92c67b292b005c152641a12b920fe145826cCraig Mautner     */
2220eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final PowerManager.WakeLock mGoingToSleep;
2230eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2244f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner    /** Stack id of the front stack when user switched, indexed by userId. */
2254f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner    SparseIntArray mUserStackInFront = new SparseIntArray(2);
22693529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
2274504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner    // TODO: Add listener for removal of references.
2284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
229f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>();
2304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
2314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** Mapping from displayId to display current state */
232f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    private final SparseArray<ActivityDisplay> mActivityDisplays =
233f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            new SparseArray<ActivityDisplay>();
2344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
235ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown    InputManagerInternal mInputManagerInternal;
236ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown
237aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    /** If non-null then the task specified remains in front and no other tasks may be started
238aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner     * until the task exits or #stopLockTaskMode() is called. */
239aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    private TaskRecord mLockTaskModeTask;
240aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
2414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service) {
242270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
2434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE);
2440eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
2454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper());
2467ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
2477ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
2487ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
2497ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity =
2507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
2517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.setReferenceCounted(false);
2522219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2532219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
254ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void setWindowManager(WindowManagerService wm) {
2554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
2564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mWindowManager = wm;
2574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
2584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplayManager =
2594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    (DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE);
2604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplayManager.registerDisplayListener(this, null);
2614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
2624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            Display[] displays = mDisplayManager.getDisplays();
2634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) {
2644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final int displayId = displays[displayNdx].getDisplayId();
265e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
266e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplays.put(displayId, activityDisplay);
2674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
2684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
269f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            createStackOnDisplay(HOME_STACK_ID, Display.DEFAULT_DISPLAY);
2704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mHomeStack = mFocusedStack = mLastFocusedStack = getStack(HOME_STACK_ID);
271ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown
272ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            mInputManagerInternal = LocalServices.getService(InputManagerInternal.class);
2734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
274270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
275270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
276270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void dismissKeyguard() {
2775314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner        if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen("");
278270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        if (mDismissKeyguardOnNextActivity) {
279270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mDismissKeyguardOnNextActivity = false;
280ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.dismissKeyguard();
281270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        }
282270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
283270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
284ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    ActivityStack getFocusedStack() {
2854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return mFocusedStack;
28620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
28720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
288de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getLastStack() {
2894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return mLastFocusedStack;
2902219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2912219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
2924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    // TODO: Split into two methods isFrontStack for any visible stack and isFrontmostStack for the
2934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    // top of all visible stacks.
294de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean isFrontStack(ActivityStack stack) {
295df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        final ActivityRecord parent = stack.mActivityContainer.mParentActivity;
296df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        if (parent != null) {
297df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            stack = parent.task.stack;
298df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        }
299e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ArrayList<ActivityStack> stacks = stack.mStacks;
3004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (stacks != null && !stacks.isEmpty()) {
3014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return stack == stacks.get(stacks.size() - 1);
3024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
3034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return false;
30420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
30520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
306de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void moveHomeStack(boolean toFront) {
307e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ArrayList<ActivityStack> stacks = mHomeStack.mStacks;
3084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        int topNdx = stacks.size() - 1;
3094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (topNdx <= 0) {
3104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return;
3114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
3124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ActivityStack topStack = stacks.get(topNdx);
3134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final boolean homeInFront = topStack == mHomeStack;
3144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (homeInFront != toFront) {
3154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mLastFocusedStack = topStack;
3164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            stacks.remove(mHomeStack);
3174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            stacks.add(toFront ? topNdx : 0, mHomeStack);
3184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mFocusedStack = stacks.get(topNdx);
3194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: topStack old=" + topStack + " new="
3204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    + mFocusedStack);
321de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
322de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
323de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
324e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner    void moveHomeStackTaskToTop(int homeStackTaskType) {
325e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner        if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
326e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner            mWindowManager.showRecentApps();
327e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner            return;
328e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner        }
32969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        moveHomeStack(true);
330e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner        mHomeStack.moveHomeStackTaskToTop(homeStackTaskType);
3318e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    }
3328e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner
333e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner    boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev) {
334e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner        if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) {
335e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner            mWindowManager.showRecentApps();
336e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner            return false;
337e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner        }
338e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner        moveHomeStackTaskToTop(homeStackTaskType);
33969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (prev != null) {
340e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner            prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE);
34169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
342e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner
343a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner        ActivityRecord r = mHomeStack.topRunningActivityLocked(null);
344e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner        if (r != null && (r.isHomeActivity() || r.isRecentsActivity())) {
345a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner            mService.setFocusedActivityLocked(r);
34605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            return resumeTopActivitiesLocked(mHomeStack, prev, null);
34769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
34869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        return mService.startHomeActivityLocked(mCurrentUser);
34969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    }
35069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner
351270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void setDismissKeyguard(boolean dismiss) {
3525314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner        if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(" dismiss=" + dismiss);
353270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mDismissKeyguardOnNextActivity = dismiss;
354270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
355270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
3568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
357e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        int numDisplays = mActivityDisplays.size();
3584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
359e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
3604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
3614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ActivityStack stack = stacks.get(stackNdx);
3624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                TaskRecord task = stack.taskForIdLocked(id);
3634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (task != null) {
3644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return task;
3654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
3668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
3678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
3688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
3698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
3708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
3716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    ActivityRecord isInAnyStackLocked(IBinder token) {
372e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        int numDisplays = mActivityDisplays.size();
3734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
374e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
3754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
3764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord r = stacks.get(stackNdx).isInStackLocked(token);
3774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (r != null) {
3784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return r;
3794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
3806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
3816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
3826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return null;
3836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
3846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
38521d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner    void setNextTaskId(int taskId) {
38621d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner        if (taskId > mCurTaskId) {
38721d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner            mCurTaskId = taskId;
38821d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner        }
38921d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner    }
39021d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner
3918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
3928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
3938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
3948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
3958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
3968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
3978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
3988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
3998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
4008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
401de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityRecord resumedAppLocked() {
402ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        ActivityStack stack = getFocusedStack();
403ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (stack == null) {
404ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return null;
405ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
406de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityRecord resumedActivity = stack.mResumedActivity;
407de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (resumedActivity == null || resumedActivity.app == null) {
408de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            resumedActivity = stack.mPausingActivity;
409de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (resumedActivity == null || resumedActivity.app == null) {
410de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resumedActivity = stack.topRunningActivityLocked(null);
411de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
412de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
413de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return resumedActivity;
414de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
415de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
416ed8902d3b5452860d87aaa0ed7fba8abb73fc983Mike Lockwood    boolean attachApplicationLocked(ProcessRecord app) throws Exception {
41720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
4184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        boolean didSomething = false;
419e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
420e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
4214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
4224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
4234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (!isFrontStack(stack)) {
4244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    continue;
4254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
4264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ActivityRecord hr = stack.topRunningActivityLocked(null);
4274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (hr != null) {
4284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (hr.app == null && app.uid == hr.info.applicationInfo.uid
4294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            && processName.equals(hr.processName)) {
4304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        try {
4312c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount                            if (realStartActivityLocked(hr, app, true, true)) {
4324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                                didSomething = true;
4334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            }
4344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        } catch (Exception e) {
4354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            Slog.w(TAG, "Exception in new application when starting activity "
4364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                                  + hr.intent.getComponent().flattenToShortString(), e);
4374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            throw e;
43820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
43920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
44020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
44120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
44220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
443b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (!didSomething) {
444b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
445b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        }
44620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
44720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
44820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
44920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
450e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
451e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
4524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
4534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
45434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                if (!isFrontStack(stack) || stack.numActivities() == 0) {
4554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    continue;
4564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
4574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord resumedActivity = stack.mResumedActivity;
4584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (resumedActivity == null || !resumedActivity.idle) {
45934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    if (DEBUG_STATES) Slog.d(TAG, "allResumedActivitiesIdle: stack="
46034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                             + stack.mStackId + " " + resumedActivity + " not idle");
4614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return false;
4624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
46320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
46420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
46520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
46620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
46720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
468de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesComplete() {
469e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
470e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
4714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
4724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
4734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
4744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    final ActivityRecord r = stack.mResumedActivity;
4754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (r != null && r.state != ActivityState.RESUMED) {
4764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        return false;
4774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
478de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
479de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
480de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
481de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        // TODO: Not sure if this should check if all Paused are complete too.
4824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (DEBUG_STACK) Slog.d(TAG,
4834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                "allResumedActivitiesComplete: mLastFocusedStack changing from=" +
4844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                mLastFocusedStack + " to=" + mFocusedStack);
4854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mLastFocusedStack = mFocusedStack;
486de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
487de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
488de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
489de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesVisible() {
490e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
491e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
4924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
4934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
4944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord r = stack.mResumedActivity;
4954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (r != null && (!r.nowVisible || r.waitingVisible)) {
4964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return false;
4974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
498de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
499de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
500de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
501de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
502de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
5032acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner    /**
5042acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * Pause all activities in either all of the stacks or just the back stacks.
5052acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving().
5062acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @return true if any activity was paused as a result of this call.
5072acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     */
5085314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner    boolean pauseBackStacks(boolean userLeaving) {
509cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        boolean someActivityPaused = false;
510e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
511e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
5124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
5144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (!isFrontStack(stack) && stack.mResumedActivity != null) {
5154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack +
5164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            " mResumedActivity=" + stack.mResumedActivity);
5174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    stack.startPausingLocked(userLeaving, false);
5184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    someActivityPaused = true;
5194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
520cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
521cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
522cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        return someActivityPaused;
523cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
524cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
525de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allPausedActivitiesComplete() {
526ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        boolean pausing = true;
527e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
528e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
5294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
5314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord r = stack.mPausingActivity;
5324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (r != null && r.state != ActivityState.PAUSED
5334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        && r.state != ActivityState.STOPPED
5344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        && r.state != ActivityState.STOPPING) {
5354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (DEBUG_STATES) {
5364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state);
5374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        pausing = false;
5384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    } else {
5394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        return false;
5404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
541ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
542de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
543de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
544ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return pausing;
545de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
546de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
547df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner    void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping) {
5488a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock        // TODO: Put all stacks in supervisor and iterate through them instead.
549df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
550df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
551df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
552df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                final ActivityStack stack = stacks.get(stackNdx);
553df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                if (stack.mResumedActivity != null &&
554df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                        stack.mActivityContainer.mParentActivity == parent) {
555df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                    stack.startPausingLocked(userLeaving, uiSleeping);
556df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                }
557df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            }
558df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        }
559df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner    }
560df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
561ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityVisibleLocked(ActivityRecord r) {
562858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
563ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            WaitResult w = mWaitingActivityVisible.get(i);
564ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = false;
565ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
566ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
567ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
568ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
569ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = w.totalTime;
570ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
571ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
572ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        dismissKeyguard();
573ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
574ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
575ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
576ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            long thisTime, long totalTime) {
577ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
578c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner            WaitResult w = mWaitingActivityLaunched.remove(i);
579ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = timeout;
580ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
581ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
582ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
583ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = thisTime;
584ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = totalTime;
585ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
586ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
587ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
588ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
58929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    ActivityRecord topRunningActivityLocked() {
5901602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        final ActivityStack focusedStack = getFocusedStack();
5911602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        ActivityRecord r = focusedStack.topRunningActivityLocked(null);
5921602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        if (r != null) {
5931602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            return r;
59429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
5951602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner
5964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        // Return to the home stack.
597e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        final ArrayList<ActivityStack> stacks = mHomeStack.mStacks;
5984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
5994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final ActivityStack stack = stacks.get(stackNdx);
600ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (stack != focusedStack && isFrontStack(stack)) {
60129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                r = stack.topRunningActivityLocked(null);
60229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                if (r != null) {
60329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    return r;
60429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                }
60529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
60629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
60729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        return null;
60829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
60929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
61009233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn    void getTasksLocked(int maxNum, List<RunningTaskInfo> list, int callingUid, boolean allowed) {
611c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // Gather all of the running tasks for each stack into runningTaskLists.
6124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<ArrayList<RunningTaskInfo>> runningTaskLists =
6134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                new ArrayList<ArrayList<RunningTaskInfo>>();
614e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        final int numDisplays = mActivityDisplays.size();
6154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
616e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
6174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
6184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
6194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>();
6204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                runningTaskLists.add(stackTaskList);
62109233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn                stack.getTasksLocked(stackTaskList, callingUid, allowed);
62220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
62320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
624c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner
625c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // The lists are already sorted from most recent to oldest. Just pull the most recent off
626c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // each list and add it to list. Stop when all lists are empty or maxNum reached.
627c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        while (maxNum > 0) {
628c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            long mostRecentActiveTime = Long.MIN_VALUE;
629c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            ArrayList<RunningTaskInfo> selectedStackList = null;
6304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numTaskLists = runningTaskLists.size();
6314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numTaskLists; ++stackNdx) {
6324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists.get(stackNdx);
633c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                if (!stackTaskList.isEmpty()) {
634c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    final long lastActiveTime = stackTaskList.get(0).lastActiveTime;
635c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    if (lastActiveTime > mostRecentActiveTime) {
636c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        mostRecentActiveTime = lastActiveTime;
637c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        selectedStackList = stackTaskList;
638c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    }
639c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                }
640c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
641c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            if (selectedStackList != null) {
642c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                list.add(selectedStackList.remove(0));
643c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                --maxNum;
644c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            } else {
645c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                break;
646c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
647c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        }
64820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
64920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
65023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
65123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String profileFile, ParcelFileDescriptor profileFd, int userId) {
65223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
65323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
65423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
65523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
65623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
65723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
65823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
65923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
66023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
66123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
66223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
66323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
66423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
66523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
66623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
66723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
66823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
66923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
67023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
67123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
67223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
67323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
67423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
67523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
67623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
67723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
67823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
67923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
68023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
68123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
68223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
68323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
68423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
68523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
68623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (profileFile != null) {
68723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
68823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
68923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            profileFile, profileFd,
69023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
69123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
69223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
69323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
69423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
69523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
69623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
6972219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
698e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner        moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE);
69991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null, 0,
700e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                null, false, null, null);
7018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
7028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
70323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
70491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            String callingPackage, Intent intent, String resolvedType,
70591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
70691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IBinder resultTo, String resultWho, int requestCode, int startFlags, String profileFile,
70723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
708e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            Bundle options, int userId, IActivityContainer iContainer) {
70923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
71023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
71123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
71223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
71323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
71423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
71523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
71623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
71723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
71823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
71923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
72023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                profileFile, profileFd, userId);
72123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
722e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityContainer container = (ActivityContainer)iContainer;
72323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
72423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
72523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
72623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
72723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
72823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = Binder.getCallingPid();
72923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingUid = Binder.getCallingUid();
73023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
73123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
73223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
73323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
734e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ActivityStack stack;
735e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (container == null || container.mStack.isOnHomeDisplay()) {
736e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                stack = getFocusedStack();
737e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            } else {
738e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                stack = container.mStack;
739e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
740de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            stack.mConfigWillChange = config != null
74123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
74223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
743de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    "Starting activity when config will change = " + stack.mConfigWillChange);
74423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
74523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
74623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
74723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
74823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
74923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
75023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
75123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
75223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
75323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
75423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
75523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingUid = callingUid;
75623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
75723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
75823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
75923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid = callerApp.info.uid;
76023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
76276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                                      + " (pid=" + callingPid + ") when starting: "
76323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
76523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
76623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
77123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
77623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
77923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
78323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
78423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
78523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
78723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
79223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
79723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
79823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
79923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
80623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
80723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
80823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
80923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
81023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
81123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
81323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
81423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
81591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            int res = startActivityLocked(caller, intent, resolvedType, aInfo,
81691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    voiceSession, voiceInteractor, resultTo, resultWho,
817e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    requestCode, callingPid, callingUid, callingPackage, startFlags, options,
818e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    componentSpecified, null, container);
81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
820de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (stack.mConfigWillChange) {
82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
82223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
82423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
827de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stack.mConfigWillChange = false;
82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
82923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
83123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
83223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
83323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
83423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
83523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
83623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
838ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWaitingActivityLaunched.add(outResult);
83923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
84023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
84123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
84223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
84523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
846de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityRecord r = stack.topRunningActivityLocked(null);
84723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (r.nowVisible) {
84823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
84923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
85023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
85123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
85223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
85323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
854ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                        mWaitingActivityVisible.add(outResult);
85523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
85623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
85723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
85823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
85923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
86023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
86123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
86223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
86323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
86423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
86523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
86623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
86723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
86823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
86923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
87023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
87123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
87223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
87323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
87423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
87523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
87623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
87723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
87823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
87923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
88023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
88123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
88223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
88323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
88423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
88523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
88623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
88723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
88823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
88923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
89023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
89123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
89223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
89323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
89423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
89576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                ActivityRecord[] outActivity = new ActivityRecord[1];
89623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
89723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
89823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
89923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
90023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
90123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
90223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
90323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
90423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
90523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
90623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
90723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
90823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
90923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
91023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
91123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
91223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
91323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
91423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, null, null, userId);
91523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
91623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
91723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
91823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
91923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
92023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
92123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
92223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
92323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
92423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
92523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
92623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
92723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
92823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
92923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
93023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
9316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
93291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            aInfo, null, null, resultTo, null, -1, callingPid, callingUid, callingPackage,
933e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                            0, theseOptions, componentSpecified, outActivity, null);
93423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
93523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
93623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
93723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
93823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
93923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
94023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
94123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
94223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
94323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
94423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
94523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
94623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
94723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
9482420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
9492c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount            ProcessRecord app, boolean andResume, boolean checkConfig)
9502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
9512420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9522420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
953a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner        if (false) Slog.d(TAG, "realStartActivity: setting app visibility true");
954ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager.setAppVisibility(r.appToken, true);
9552420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9562420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
9572420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
9582420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9592420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
9602420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
9612420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
9622420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
9632420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
9642420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
9652420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
966ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            Configuration config = mWindowManager.updateOrientationFromAppTokens(
9672420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
9682420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
9692420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
9702420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9712420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9722420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
9732420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
9742420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
9752420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
9762420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9772420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
9782420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9792420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
9802420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
9812420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
9822420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
983db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateLruProcessLocked(app, true, null);
984db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateOomAdjLocked();
9852420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9862420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
9872420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
9882420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
9892420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
9902420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9912420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
9922420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<Intent> newIntents = null;
9932420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
9942420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
9952420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
9962420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9972420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
9982420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
9992420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
10002420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
10012420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
10022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
10032420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
10042420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
10052420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
1006ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (r.isHomeActivity() && r.isNotResolverActivity()) {
10074ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                // Home process is the root process of the task.
10084ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                mService.mHomeProcess = r.task.mActivities.get(0).app;
10092420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
10102420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
10112420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
10122420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
10132420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
10142420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
10152420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
10162420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
10172420ead0326bfd2587da6231be419e758dba1930Craig Mautner            boolean profileAutoStop = false;
10182420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
10192420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
10202420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
10212420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
10222420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
10232420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop = mService.mAutoStopProfiler;
10242420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
10252420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
10262420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
10272420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
10282420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
10292420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
10302420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
10312420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
10322420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
10332420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
10342420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
10352420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
10362420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
10372420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
10382420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
10392420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
10402420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
1041cfbe9be5b3b701d95fb24fa0f7c8d9be43eec776Adam Powell
1042a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);
10432420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
10442420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    System.identityHashCode(r), r.info,
1045a002604af0c9b1204556610537b85685d7055996Craig Mautner                    new Configuration(mService.mConfiguration), r.compat, r.task.voiceInteractor,
1046a002604af0c9b1204556610537b85685d7055996Craig Mautner                    app.repProcState, r.icicle, r.persistentState, results, newIntents, !andResume,
1047233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner                    mService.isNextTransitionForward(), profileFile, profileFd, profileAutoStop
1048233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner            );
10492420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
10512420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
10522420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
10532420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
10542420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
10552420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
10562420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
10572420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
10582420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
10592420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
10602420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
10612420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
10622420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
10632420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
10642420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
10652420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
10662420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
10672420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
10682420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
10692420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10702420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
10712420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
10722420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
10732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
10742420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
10752420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
10762420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
10772420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.appDiedLocked(app, app.pid, app.thread);
10782420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
10792420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
10802420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
10812420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
10822420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10832420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
10842420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
10852420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
10862420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
10872420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10882420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10892420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
10902420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
10912420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
10922420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
10932420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10942420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10952420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
10962420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
10972420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
10982420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
10992420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
11002420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
11012420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
11022420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
11032420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
11042420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
11052420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
11062420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
11072420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
11082420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
11092420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11102420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
11112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
11122420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
11132420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
1114de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (isFrontStack(stack)) {
11152420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
11162420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
11172420ead0326bfd2587da6231be419e758dba1930Craig Mautner
11182420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
11192420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
11202420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1121e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
11222c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount            boolean andResume, boolean checkConfig) {
1123e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
1124e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
11253bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                r.info.applicationInfo.uid, true);
1126e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1127e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
1128e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1129e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
1130e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
1131237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
1132237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        || !"android".equals(r.info.packageName)) {
1133237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // Don't add this if it is a platform component that is marked
1134237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // to run in multiple processes, because this is actually
1135237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // part of the framework so doesn't make sense to track as a
1136237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // separate apk in the process.
1137237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    app.addPackage(r.info.packageName, mService.mProcessStats);
1138237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                }
11392c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount                realStartActivityLocked(r, app, andResume, checkConfig);
1140e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
1141e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
1142e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
1143e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
1144e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
1145e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1146e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
1147e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
1148e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
1149e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1150e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
11513bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                "activity", r.intent.getComponent(), false, false, true);
1152e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
1153e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
11546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
115591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            Intent intent, String resolvedType, ActivityInfo aInfo,
115691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,
115791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IBinder resultTo, String resultWho, int requestCode,
11586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options,
1159e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container) {
11606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
11616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
11636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
11646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
11656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
11666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
11676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
11686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
11696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
11706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
11716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
11726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
11736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
11776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
11786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
11799ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid)
11809ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                    + " on display " + (container == null ? (mFocusedStack == null ?
11819ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                            Display.DEFAULT_DISPLAY : mFocusedStack.mDisplayId) :
11829ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                            (container.mActivityDisplay == null ? Display.DEFAULT_DISPLAY :
11839ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner                                    container.mActivityDisplay.mDisplayId)));
11846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
11876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
11886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
11896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
11906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
11916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
11926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
11936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
11946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
11956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
11966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
11996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
120091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        final int launchFlags = intent.getFlags();
12016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
12036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                && sourceRecord != null) {
12046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
12056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
12066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
12076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
12086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
12096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
12116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
12126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
12136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
12146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
12156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord.removeResultsLocked(
12166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    sourceRecord, resultWho, requestCode);
12176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12183026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn            if (sourceRecord.launchedFromUid == callingUid) {
12193026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // The new activity is being launched from the same uid as the previous
12203026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // activity in the flow, and asking to forward its result back to the
12213026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // previous.  In this case the activity is serving as a trampoline between
12223026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // the two, so we also want to update its launchedFromPackage to be the
12233026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // same as the previous activity.  Note that this is safe, since we know
12243026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // these two packages come from the same uid; the caller could just as
12253026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // well have supplied that same package name itself.  This specifially
12263026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // deals with the case of an intent picker/chooser being launched in the app
12273026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // flow to redirect to an activity picked by the user, where we want the final
12283026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // activity to consider it to have been launched by the previous app activity.
12293026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                callingPackage = sourceRecord.launchedFromPackage;
12303026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn            }
12316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
12346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
12356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
12366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
12376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
12406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
12416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
12426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
12436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
124591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (err == ActivityManager.START_SUCCESS && sourceRecord != null
124691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                && sourceRecord.task.voiceSession != null) {
124791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // If this activity is being launched as part of a voice session, we need
124891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // to ensure that it is safe to do so.  If the upcoming activity will also
124991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // be part of the voice session, we can only launch it if it has explicitly
125091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // said it supports the VOICE category, or it is a part of the calling app.
125191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0
125291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) {
125391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                try {
125491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    if (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(),
125591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                            intent, resolvedType)) {
125691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
125791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    }
125891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                } catch (RemoteException e) {
125991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
126091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                }
126191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
126291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
126391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
126491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (err == ActivityManager.START_SUCCESS && voiceSession != null) {
126591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // If the caller is starting a new voice session, just make sure the target
126691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            // is actually allowing it to run this way.
126791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            try {
126891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                if (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(),
126991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        intent, resolvedType)) {
127091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
127191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                }
127291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            } catch (RemoteException e) {
127391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                err = ActivityManager.START_NOT_VOICE_COMPATIBLE;
127491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            }
127591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        }
127691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn
12776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
12786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
12796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
12806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
12816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
12826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
12846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
12856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
12866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
12896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
12906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
12916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
12926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
12936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
12946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
12956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
12966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
12976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
12996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
13006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
13016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
13026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
13036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
13046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
13056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
13066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
13076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
13086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
13096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
13106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
13126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
13136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1315dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
1316b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver                callingPid, resolvedType, aInfo.applicationInfo);
13175e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver
13186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
13196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
13206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
13216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
13226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
13235e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                abort |= !mService.mController.activityStarting(watchIntent,
13246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
13256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
13266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
13276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13285e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        }
13296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13305e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        if (abort) {
13315e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            if (resultRecord != null) {
13325e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
13336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
13346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13355e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // We pretend to the caller that it was really started, but
13365e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // they will just get a cancel result.
13375e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            setDismissKeyguard(false);
13385e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            ActivityOptions.abort(options);
13395e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            return ActivityManager.START_SUCCESS;
13406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
1343e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho,
1344233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner                requestCode, componentSpecified, this, container, options);
13456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
13466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
13476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1349ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = getFocusedStack();
135091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        if (voiceSession == null && (stack.mResumedActivity == null
135191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                || stack.mResumedActivity.info.applicationInfo.uid != callingUid)) {
13526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
13536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
1354de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, stack);
13556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mPendingActivityLaunches.add(pal);
13566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                setDismissKeyguard(false);
13576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
13586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
13596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
13606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
13636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
13646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
13656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
13666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
13676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
13686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
13696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
13706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
13716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
13736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        mService.doPendingActivityLaunchesLocked(false);
13746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
137591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn        err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor,
137691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                startFlags, true, options);
137710385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner
137810385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner        if (allPausedActivitiesComplete()) {
137910385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner            // If someone asked to have the keyguard dismissed on the next
13806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
13816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
13826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
13836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            dismissKeyguard();
13846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
13856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
13866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
13876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1388ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityStack adjustStackFocus(ActivityRecord r) {
13891d001b670e34fe887488047f525a5430154626e1Craig Mautner        final TaskRecord task = r.task;
13901d001b670e34fe887488047f525a5430154626e1Craig Mautner        if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) {
1391ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (task != null) {
1392d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                final ActivityStack taskStack = task.stack;
1393e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                if (taskStack.isOnHomeDisplay()) {
1394e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    if (mFocusedStack != taskStack) {
1395e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                        if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: Setting " +
1396e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                                "focused stack to r=" + r + " task=" + task);
1397e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                        mFocusedStack = taskStack;
1398e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    } else {
1399e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                        if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1400e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                            "adjustStackFocus: Focused stack already=" + mFocusedStack);
1401e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    }
1402858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                }
1403d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                return taskStack;
1404858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1405ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1406e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ActivityContainer container = r.mInitialActivityContainer;
1407e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (container != null) {
1408e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                // The first time put it on the desired stack, after this put on task stack.
1409e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                r.mInitialActivityContainer = null;
1410e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                return container.mStack;
1411e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
1412e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner
14134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            if (mFocusedStack != mHomeStack) {
1414ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1415ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        "adjustStackFocus: Have a focused stack=" + mFocusedStack);
1416ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                return mFocusedStack;
1417de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
1418ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1419e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks;
1420e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1421e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ActivityStack stack = homeDisplayStacks.get(stackNdx);
1422e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                if (!stack.isHomeStack()) {
1423e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1424e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                            "adjustStackFocus: Setting focused stack=" + stack);
1425e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    mFocusedStack = stack;
1426e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    return mFocusedStack;
1427ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
14281d001b670e34fe887488047f525a5430154626e1Craig Mautner            }
1429ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
14304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            // Need to create an app stack for this user.
1431f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
1432ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
1433ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    " stackId=" + stackId);
1434ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            mFocusedStack = getStack(stackId);
143529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return mFocusedStack;
1436de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1437de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return mHomeStack;
1438de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
1439de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
144029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    void setFocusedStack(ActivityRecord r) {
14414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (r != null) {
144212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            final TaskRecord task = r.task;
144312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            boolean isHomeActivity = !r.isApplicationActivity();
144412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            if (!isHomeActivity && task != null) {
144512ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                isHomeActivity = !task.isApplicationTask();
144612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            }
144712ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            if (!isHomeActivity && task != null) {
144812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                final ActivityRecord parent = task.stack.mActivityContainer.mParentActivity;
144912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                isHomeActivity = parent != null && parent.isHomeActivity();
145012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            }
14514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            moveHomeStack(isHomeActivity);
145229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
145329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
145429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
14558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    final int startActivityUncheckedLocked(ActivityRecord r,
145691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            ActivityRecord sourceRecord,
145791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags,
145891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            boolean doResume, Bundle options) {
14598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final Intent intent = r.intent;
14608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final int callingUid = r.launchedFromUid;
14618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        int launchFlags = intent.getFlags();
14638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // We'll invoke onUserLeaving before onPause only if the launching
14658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // activity did not explicitly state that this is an automated launch.
1466a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner        mUserLeaving = (launchFlags & Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
1467de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving);
14688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the caller has asked not to resume at this point, we make note
14708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // of this in the record so that we can skip it when trying to find
14718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // the top running activity.
14728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (!doResume) {
14738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.delayedResume = true;
14748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
14758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1476a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner        ActivityRecord notTop =
1477a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner                (launchFlags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
14788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the onlyIfNeeded flag is set, then we can do this if the activity
14808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // being launched is the same as the one making the call...  or, as
14818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // a special case, if we do not know the caller then we count the
14828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // current top activity as the caller.
14838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
14848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord checkedCaller = sourceRecord;
14858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (checkedCaller == null) {
1486ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop);
14878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
14888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!checkedCaller.realActivity.equals(r.realActivity)) {
14898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // Caller is not the same as launcher, so always needed.
14908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
14918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
14928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
14938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
149441db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner        switch (r.info.documentLaunchMode) {
149541db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner            case ActivityInfo.DOCUMENT_LAUNCH_NONE:
149641db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner                break;
149741db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner            case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS:
149841db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner                intent.addFlags(
149941db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner                        Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
1500a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner                launchFlags = intent.getFlags();
150141db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner                break;
150241db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner            case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING:
150341db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
1504a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner                launchFlags = intent.getFlags();
150541db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner                break;
150641db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner        }
1507d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner        final boolean newDocument = intent.isDocument();
15088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (sourceRecord == null) {
15098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This activity is not being started from another...  in this
15108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // case we -always- start a new task.
1511d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner            if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
151229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
151329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
15148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
15158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
1516d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner        } else if (newDocument) {
1517d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner            if (r.launchMode != ActivityInfo.LAUNCH_MULTIPLE) {
1518d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner                Slog.w(TAG, "FLAG_ACTIVITY_NEW_DOCUMENT and launchMode != \"standard\"");
1519d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner                r.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
1520d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner            }
15218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
15228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The original activity who is starting us is running as a single
15238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // instance...  this new activity it is starting must go on its
15248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // own task.
15258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
15268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
15278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
15288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The activity being started is a single instance...  it always
15298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // gets launched into its own task.
15308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
15318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
15328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15338862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner        ActivityInfo newTaskInfo = null;
15348862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner        Intent newTaskIntent = null;
1535de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack sourceStack;
1536de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (sourceRecord != null) {
15372a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn            if (sourceRecord.finishing) {
15382a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                // If the source is finishing, we can't further count it as our source.  This
15392a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                // is because the task it is associated with may now be empty and on its way out,
15402a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                // so we don't want to blindly throw it in to that task.  Instead we will take
15418862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                // the NEW_TASK flow and try to find a task for it. But save the task information
15428862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                // so it can be used when creating the new task.
1543d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner                if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
15442a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    Slog.w(TAG, "startActivity called from finishing " + sourceRecord
15452a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                            + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
15462a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
15478862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                    newTaskInfo = sourceRecord.info;
15488862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                    newTaskIntent = sourceRecord.task.intent;
15492a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                }
15502a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                sourceRecord = null;
15512a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                sourceStack = null;
15522a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn            } else {
15532a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                sourceStack = sourceRecord.task.stack;
15542a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn            }
1555de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        } else {
1556de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = null;
1557de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1558de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
1559d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner        if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
15608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // For whatever reason this activity is being launched into a new
15618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // task...  yet the caller has requested a result back.  Well, that
15628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // is pretty messed up, so instead immediately send back a cancel
15638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // and let the new task continue launched as normal without a
15648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // dependency on its originator.
15658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
15668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo.task.stack.sendActivityResultLocked(-1,
15678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    r.resultTo, r.resultWho, r.requestCode,
15688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                Activity.RESULT_CANCELED, null);
15698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo = null;
15708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
15718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean addingToTask = false;
15738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean movedHome = false;
15748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        TaskRecord reuseTask = null;
1575de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityStack targetStack;
1576d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner        if (((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
1577d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner                (launchFlags & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
15798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
15808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If bring to front is requested, and no result is requested, and
15818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // we can find a task that was started with this same
15828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // component, then instead of launching bring that one to the front.
15838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo == null) {
15848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // See if there is a task to bring to the front.  If this is
15858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // a SINGLE_INSTANCE activity, there can be one and only one
15868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // instance of it in the history, and it is always in its own
15878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // unique task, so we do a special search.
15888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
1589ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        ? findTaskLocked(r)
15908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        : findActivityLocked(intent, r.info);
15918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (intentActivity != null) {
1592aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                    if (isLockTaskModeViolation(intentActivity.task)) {
1593aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                        Slog.e(TAG, "moveTaskToFront: Attempt to violate Lock Task Mode");
1594aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                        return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
1595aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                    }
159629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null) {
159729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        r.task = intentActivity.task;
159829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    }
15998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack = intentActivity.task.stack;
16000f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
16012a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack
16022a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                            + " from " + intentActivity);
1603e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    targetStack.moveToFront();
16048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (intentActivity.task.intent == null) {
16058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // This task was started because of movement of
16068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the activity based on affinity...  now that we
16078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // are actually launching it, we can assign the
16088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // base intent.
16098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(intent, r.info);
16108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the target task is not in the front, then we need
16128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to bring it to the front...  except...  well, with
16138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
16148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to have the same behavior as if a new instance was
16158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // being started, which means not bringing it to the front
16168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // if the caller is not itself in the front.
1617165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    final ActivityStack lastStack = getLastStack();
1618165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    ActivityRecord curTop = lastStack == null?
1619165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                            null : lastStack.topRunningNonDelayedActivityLocked(notTop);
16207504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                    if (curTop != null && (curTop.task != intentActivity.task ||
16217504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                            curTop.task != lastStack.topTask())) {
16228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
1623d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                        if (sourceRecord == null || (sourceStack.topActivity() != null &&
1624d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                                sourceStack.topActivity().task == sourceRecord.task)) {
16258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // We really do want to push this one into the
16268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // user's face, right now.
16278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            movedHome = true;
1628b53d97c4571f8ed09e92eee64301969b96ff1e4dCraig Mautner                            targetStack.moveTaskToFrontLocked(intentActivity.task, r, options);
1629de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            if ((launchFlags &
163029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
163129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
1632e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner                                // Caller wants to appear on home activity.
1633e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner                                intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
1634de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            }
16358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            options = null;
16368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
16378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the caller has requested that the target task be
16398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // reset, then do so.
16408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
16418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
16428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
16448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We don't need to start a new activity, and
16458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the client said not to do anything if that
16468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is the case, so this is it!  And for paranoia, make
16478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
16488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
164905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                            resumeTopActivitiesLocked(targetStack, null, options);
16508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
16518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
16528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
16538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
16548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags &
16568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
16578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
16588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The caller has requested to completely replace any
16598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task with its new activity.  Well that should
16608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // not be too hard...
16618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask = intentActivity.task;
16628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.performClearTaskLocked();
16638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.setIntent(r.intent, r.info);
16648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
16658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
16668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
16678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this situation we want to remove all activities
16688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from the task up to the one being started.  In most
16698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // cases this means we are resetting the task to its
16708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // initial state.
16718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ActivityRecord top =
16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.performClearTaskLocked(r, launchFlags);
16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (top != null) {
16748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (top.frontOfTask) {
16758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // Activity aliases may mean we use different
16768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intents for the top activity, so make sure
16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the task now has the identity of the new
16788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intent.
16798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                top.task.setIntent(r.intent, r.info);
16808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
16818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
16828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    r, top.task);
16838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
16848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
16858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // A special case: we need to
16868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // start the activity because it is not currently
16878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // running, and the caller has asked to clear the
16888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // current task to have this activity at the top.
16898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
16908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // Now pretend like this activity is being started
16918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // by the top of its task, so it is put in the
16928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // right place.
16938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
16948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
16958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (r.realActivity.equals(intentActivity.task.realActivity)) {
16968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case the top activity on the task is the
16978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // same as the one being launched, so we take that
16988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // as a request to bring the task to the foreground.
16998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // If the top activity in the task is the root
17008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // activity, deliver this new intent to it if it
17018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // desires.
17028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
17038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
17048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                && intentActivity.realActivity.equals(r.realActivity)) {
17058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r,
17068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    intentActivity.task);
17078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (intentActivity.frontOfTask) {
17088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.setIntent(r.intent, r.info);
17098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
17108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            intentActivity.deliverNewIntentLocked(callingUid, r.intent);
17118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else if (!r.intent.filterEquals(intentActivity.task.intent)) {
17128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // In this case we are launching the root activity
17138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // of the task, but with a different intent.  We
17148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // should start a new instance on top.
17158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
17168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
17178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
17188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
17198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case an activity is being launched in to an
17208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task, without resetting that task.  This
17218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is typically the situation of launching an activity
17228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from a notification or shortcut.  We want to place
17238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the new activity on top of the current task.
17248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        addingToTask = true;
17258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        sourceRecord = intentActivity;
17268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (!intentActivity.task.rootWasReset) {
17278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case we are launching in to an existing task
17288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // that has not yet been started from its front door.
17298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The current task has been brought to the front.
17308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // Ideally, we'd probably like to place this new task
17318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // at the bottom of its stack, but that's a little hard
17328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // to do with the current organization of the code so
17338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // for now we'll just drop it.
17348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(r.intent, r.info);
17358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
17368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (!addingToTask && reuseTask == null) {
17378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We didn't do anything...  but it was needed (a.k.a., client
17388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // don't use that intent!)  And for paranoia, make
17398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
17408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1741de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            targetStack.resumeTopActivityLocked(null, options);
17428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
17438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
17448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
17458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_TASK_TO_FRONT;
17468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
17478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
17488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
17498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
17508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //String uri = r.intent.toURI();
17528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Intent intent2 = new Intent(uri);
17538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "Given intent: " + r.intent);
17548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "URI is: " + uri);
17558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "To intent: " + intent2);
17568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.packageName != null) {
17588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If the activity being launched is the same as the one currently
17598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // at the top, then we need to check if it should only be launched
17608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // once.
1761ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ActivityStack topStack = getFocusedStack();
1762de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop);
17638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (top != null && r.resultTo == null) {
17648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
17658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (top.app != null && top.app.thread != null) {
1766d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner                        if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
17678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
17688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
17698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top,
17708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    top.task);
17718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // For paranoia, make sure we have correctly
17728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // resumed the top activity.
17730f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                            topStack.mLastPausedActivity = null;
17748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (doResume) {
177505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                                resumeTopActivitiesLocked();
17768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
17778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
17788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
17798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // We don't need to start a new activity, and
17808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the client said not to do anything if that
17818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // is the case, so this is it!
17828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
17838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
17848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
17858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            return ActivityManager.START_DELIVERED_TO_TOP;
17868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
17878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
17888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
17898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
17908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
17928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo != null) {
1793de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho,
1794de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.requestCode, Activity.RESULT_CANCELED, null);
17958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
17968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityOptions.abort(options);
17978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            return ActivityManager.START_CLASS_NOT_FOUND;
17988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
17998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
18008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean newTask = false;
18018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean keepCurTransition = false;
18028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
18038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // Should this be considered a new task?
18048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo == null && !addingToTask
18058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1806aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            if (isLockTaskModeViolation(reuseTask)) {
1807aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
1808aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
1809aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            }
1810ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            targetStack = adjustStackFocus(r);
1811e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            targetStack.moveToFront();
18128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (reuseTask == null) {
18138862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                r.setTask(targetStack.createTaskRecord(getNextTaskId(),
18148862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                        newTaskInfo != null ? newTaskInfo : r.info,
18158862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                        newTaskIntent != null ? newTaskIntent : intent,
181691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                        voiceSession, voiceInteractor, true), null, true);
1817e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner                if (sourceRecord == null) {
1818e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner                    // Launched from a service or notification or task that is finishing.
1819e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner                    r.task.setTaskToReturnTo(isFrontStack(mHomeStack) ?
1820e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner                            mHomeStack.topTask().taskType : RECENTS_ACTIVITY_TYPE);
1821e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner                }
1822de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
1823de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.task);
18248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else {
1825de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(reuseTask, reuseTask, true);
18268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
18278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            newTask = true;
18288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!movedHome) {
1829de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if ((launchFlags &
1830de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
1831de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
1832de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // Caller wants to appear on home activity, so before starting
1833de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // their own activity we will bring home to the front.
1834e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner                    r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
1835de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
18368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
18378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord != null) {
18382a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn            TaskRecord sourceTask = sourceRecord.task;
1839aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            if (isLockTaskModeViolation(sourceTask)) {
1840aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r);
1841aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
1842aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            }
1843525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            targetStack = sourceTask.stack;
1844dd221b3780800f03900c52bfc4a1ac7d01b72bc2Craig Mautner            targetStack.moveToFront();
1845abcc59c32fd67c507f2ff192e82fef971968b2dbCraig Mautner            mWindowManager.moveTaskToTop(targetStack.topTask().taskId);
18468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!addingToTask &&
18478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
18488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are adding the activity to an existing
18498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // task, but the caller has asked to clear that task if the
18508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // activity is already running.
1851525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags);
18528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                keepCurTransition = true;
18538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
18548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
18558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
18568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // For paranoia, make sure we have correctly
18578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // resumed the top activity.
18580f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
18598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
18608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
18618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
18628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityOptions.abort(options);
18638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
18648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
18658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else if (!addingToTask &&
18668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
18678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are launching an activity in our own task
18688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // that may already be running somewhere in the history, and
18698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // we want to shuffle it to the front of the stack if so.
1870525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r);
18718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
1872de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    final TaskRecord task = top.task;
1873de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    task.moveActivityToFrontLocked(top);
1874de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task);
18758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.updateOptionsLocked(options);
18768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
18770f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
18788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
18798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
18808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
18818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
18828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
18838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
18848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // An existing activity is starting this new activity, so we want
18858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // to keep the new one in the same task as the one that is starting
18868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // it.
1887525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            r.setTask(sourceTask, sourceRecord.thumbHolder, false);
18888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
18892a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    + " in existing task " + r.task + " from source " + sourceRecord);
18908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
18918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
18928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This not being started from an existing activity, and not part
18938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // of a new task...  just put it in the top task, though these days
18948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // this case should never happen.
1895ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            targetStack = adjustStackFocus(r);
1896dd221b3780800f03900c52bfc4a1ac7d01b72bc2Craig Mautner            targetStack.moveToFront();
18971602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            ActivityRecord prev = targetStack.topActivity();
1898de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            r.setTask(prev != null ? prev.task
189991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn                    : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, null, null, true),
1900de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    null, true);
190195e9daab03d0349a69940625c7f718175f371581Craig Mautner            mWindowManager.moveTaskToTop(r.task.taskId);
19028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
19038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in new guessed " + r.task);
19048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
19058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
19068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
19078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                intent, r.getUriPermissionsLocked());
19088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
19098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (newTask) {
19108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
19118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
19128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
19130f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner        targetStack.mLastPausedActivity = null;
19148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
19151d001b670e34fe887488047f525a5430154626e1Craig Mautner        mService.setFocusedActivityLocked(r);
19168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return ActivityManager.START_SUCCESS;
19178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
19188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
19197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    void acquireLaunchWakelock() {
19207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
19217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
19227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
19237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.acquire();
19247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
19257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // To be safe, don't allow the wake lock to be held for too long.
19267ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
19277ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
19287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    }
19297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1930f333327782e14688e1c198c1192172d51308e90bCraig Mautner    // Checked.
1931f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
1932f333327782e14688e1c198c1192172d51308e90bCraig Mautner            Configuration config) {
1933f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
1934f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1935f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> stops = null;
1936f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> finishes = null;
1937f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<UserStartedState> startingUsers = null;
1938f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NS = 0;
1939f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NF = 0;
1940f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean booting = false;
1941f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean enableScreen = false;
1942f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean activityRemoved = false;
1943f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1944f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord r = ActivityRecord.forToken(token);
1945f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (r != null) {
1946b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" +
1947b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner                    Debug.getCallers(4));
1948f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
1949f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r.finishLaunchTickingLocked();
19507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (fromTimeout) {
19517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
19527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
1953f333327782e14688e1c198c1192172d51308e90bCraig Mautner
19547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // This is a hack to semi-deal with a race condition
19557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // in the client where it can be constructed with a
19567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // newer configuration from when we asked it to launch.
19577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We'll update with whatever configuration it now says
19587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // it used to launch.
19597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (config != null) {
19607ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                r.configuration = config;
19617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
1962f333327782e14688e1c198c1192172d51308e90bCraig Mautner
19637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We are now idle.  If someone is waiting for a thumbnail from
19647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // us, we can now deliver.
19657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            r.idle = true;
19667ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
19677ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
19687ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (!mService.mBooted && isFrontStack(r.task.stack)) {
19697ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mBooted = true;
19707ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                enableScreen = true;
19717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
19727ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
19737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
19747ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (allResumedActivitiesIdle()) {
19757ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (r != null) {
19767ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.scheduleAppGcsLocked();
19777ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
19787ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
19797ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
19807ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
19817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER &&
19827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        Binder.getCallingUid() != Process.myUid()) {
19837ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
1984f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
19857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
1986f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
19877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
1988f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1989f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1990f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Atomically retrieve all of the other things to do.
1991f333327782e14688e1c198c1192172d51308e90bCraig Mautner        stops = processStoppingActivitiesLocked(true);
1992f333327782e14688e1c198c1192172d51308e90bCraig Mautner        NS = stops != null ? stops.size() : 0;
1993f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if ((NF=mFinishingActivities.size()) > 0) {
1994f333327782e14688e1c198c1192172d51308e90bCraig Mautner            finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
1995f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mFinishingActivities.clear();
1996f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1997f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1998f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (isFrontStack(mHomeStack)) {
1999f333327782e14688e1c198c1192172d51308e90bCraig Mautner            booting = mService.mBooting;
2000f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.mBooting = false;
2001f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2002f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2003f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mStartingUsers.size() > 0) {
2004f333327782e14688e1c198c1192172d51308e90bCraig Mautner            startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
2005f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mStartingUsers.clear();
2006f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2007f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2008f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Stop any activities that are scheduled to do so but have been
2009f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
2010f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NS; i++) {
2011f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = stops.get(i);
2012f333327782e14688e1c198c1192172d51308e90bCraig Mautner            final ActivityStack stack = r.task.stack;
2013f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (r.finishing) {
2014f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
2015f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else {
2016f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.stopActivityLocked(r);
2017f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
2018f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2019f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2020f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Finish any activities that are scheduled to do so but have been
2021f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
2022f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NF; i++) {
2023f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = finishes.get(i);
2024f333327782e14688e1c198c1192172d51308e90bCraig Mautner            activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle");
2025f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2026f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2027f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (booting) {
2028f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.finishBooting();
20291a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani        } else {
20301a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            // Complete user switch
20311a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            if (startingUsers != null) {
20321a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                for (int i = 0; i < startingUsers.size(); i++) {
20331a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                    mService.finishUserSwitch(startingUsers.get(i));
20341a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                }
20351a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            }
20361a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            // Complete starting up of background users
20371a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani            if (mStartingBackgroundUsers.size() > 0) {
20381a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                startingUsers = new ArrayList<UserStartedState>(mStartingBackgroundUsers);
20391a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                mStartingBackgroundUsers.clear();
20401a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                for (int i = 0; i < startingUsers.size(); i++) {
20411a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                    mService.finishUserBoot(startingUsers.get(i));
20421a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani                }
2043f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
2044f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2045f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2046f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mService.trimApplications();
2047f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //dump();
2048f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //mWindowManager.dump();
2049f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2050f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (enableScreen) {
2051f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.enableScreenAfterBoot();
2052f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2053f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2054f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (activityRemoved) {
205505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            resumeTopActivitiesLocked();
2056f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2057f333327782e14688e1c198c1192172d51308e90bCraig Mautner
20587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        return r;
2059f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2060f333327782e14688e1c198c1192172d51308e90bCraig Mautner
20618e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    boolean handleAppDiedLocked(ProcessRecord app) {
20621909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner        boolean hasVisibleActivities = false;
2063e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2064e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
20654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
20664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                hasVisibleActivities |= stacks.get(stackNdx).handleAppDiedLocked(app);
20674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
20688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20691909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner        return hasVisibleActivities;
20708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
2073e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2074e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
20754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
20764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stacks.get(stackNdx).closeSystemDialogsLocked();
20774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
20788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
208193529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    void removeUserLocked(int userId) {
20824f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        mUserStackInFront.delete(userId);
208393529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    }
208493529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
20858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
20868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
20878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
20888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
20898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
2090e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2091e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
20924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
20934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
20944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
20954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
20964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    didSomething = true;
20974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
20988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
21018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2103a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    void updatePreviousProcessLocked(ActivityRecord r) {
2104a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now that this process has stopped, we may want to consider
2105a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // it to be the previous app to try to keep around in case
2106a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // the user wants to return to it.
2107a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
2108a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // First, found out what is currently the foreground app, so that
2109a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // we don't blow away the previous app if this activity is being
2110a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // hosted by the process that is actually still the foreground.
2111a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        ProcessRecord fgApp = null;
2112e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2113e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
21144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
21154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
21164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
21174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (stack.mResumedActivity != null) {
21184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        fgApp = stack.mResumedActivity.app;
21194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    } else if (stack.mPausingActivity != null) {
21204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        fgApp = stack.mPausingActivity.app;
21214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
21224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    break;
2123a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                }
2124a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            }
2125a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2126a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
2127a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now set this one as the previous process, only if that really
2128a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // makes sense to.
2129a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        if (r.app != null && fgApp != null && r.app != fgApp
2130a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
21314ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                && r.app != mService.mHomeProcess) {
2132a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcess = r.app;
2133a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
2134a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2135a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    }
2136a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
213705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked() {
213805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return resumeTopActivitiesLocked(null, null, null);
213905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
214005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
214105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target,
214205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            Bundle targetOptions) {
214305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        if (targetStack == null) {
214405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            targetStack = getFocusedStack();
214505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        }
214612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner        // Do targetStack first.
214705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        boolean result = false;
214812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner        if (isFrontStack(targetStack)) {
214912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner            result = targetStack.resumeTopActivityLocked(target, targetOptions);
215012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner        }
2151e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2152e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
21534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
21544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
215512ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                if (stack == targetStack) {
215612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                    // Already started above.
215712ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                    continue;
215812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                }
21594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
216012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner                    stack.resumeTopActivityLocked(null);
216105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                }
2162f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            }
21638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
216405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return result;
21658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
21678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
2168e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2169e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
21704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
21714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
21724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
21734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stack.finishTopRunningActivityLocked(app);
21744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
21758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2178aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    void findTaskToMoveToFrontLocked(TaskRecord task, int flags, Bundle options) {
2179aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) {
2180aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            mUserLeaving = true;
21818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2182aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) {
2183aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            // Caller wants the home activity moved with it.  To accomplish this,
2184aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            // we'll just indicate that this task returns to the home task.
2185e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner            task.setTaskToReturnTo(HOME_ACTIVITY_TYPE);
2186aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
2187aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        task.stack.moveTaskToFrontLocked(task, null, options);
2188aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack="
2189aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner                + task.stack);
21908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2192967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ActivityStack getStack(int stackId) {
2193f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer activityContainer = mActivityContainers.get(stackId);
2194f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        if (activityContainer != null) {
2195f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            return activityContainer.mStack;
21968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
21988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2200967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ArrayList<ActivityStack> getStacks() {
22014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<ActivityStack> allStacks = new ArrayList<ActivityStack>();
2202e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2203e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            allStacks.addAll(mActivityDisplays.valueAt(displayNdx).mStacks);
22044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
22054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return allStacks;
22064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
22074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
22084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    IBinder getHomeActivityToken() {
22094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final ArrayList<TaskRecord> tasks = mHomeStack.getAllTasks();
22104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
22114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final TaskRecord task = tasks.get(taskNdx);
22124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            if (task.isHomeTask()) {
22134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ArrayList<ActivityRecord> activities = task.mActivities;
22144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
22154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    final ActivityRecord r = activities.get(activityNdx);
22164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (r.isHomeActivity()) {
22174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        return r.appToken;
22184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
22194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
22204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
22214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
22224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return null;
22234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
22244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
22254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    ActivityContainer createActivityContainer(ActivityRecord parentActivity,
22264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            IActivityContainerCallback callback) {
2227f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer activityContainer = new VirtualActivityContainer(parentActivity, callback);
2228f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        mActivityContainers.put(activityContainer.mStackId, activityContainer);
2229f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        parentActivity.mChildContainers.add(activityContainer);
2230f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        return activityContainer;
22314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
22324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
223334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner    void removeChildActivityContainers(ActivityRecord parentActivity) {
2234f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers;
2235f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) {
2236f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            ActivityContainer container = childStacks.remove(containerNdx);
2237f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            container.release();
223834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
223934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner    }
224034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner
224195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner    void deleteActivityContainer(IActivityContainer container) {
224295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        ActivityContainer activityContainer = (ActivityContainer)container;
224395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        if (activityContainer != null) {
2244f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            activityContainer.mStack.finishAllActivitiesLocked();
224595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            final ActivityRecord parent = activityContainer.mParentActivity;
224695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            if (parent != null) {
224795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner                parent.mChildContainers.remove(activityContainer);
224895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            }
224995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            final int stackId = activityContainer.mStackId;
225095da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            mActivityContainers.remove(stackId);
225195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner            mWindowManager.removeStack(stackId);
225295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        }
225395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner    }
225495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner
2255f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    private int createStackOnDisplay(int stackId, int displayId) {
2256e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
2257e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        if (activityDisplay == null) {
22584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return -1;
22594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
22604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
2261f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer activityContainer = new ActivityContainer(stackId);
2262f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        mActivityContainers.put(stackId, activityContainer);
2263e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        activityContainer.attachToDisplayLocked(activityDisplay);
22644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return stackId;
2265967212cb542e6eeb308678367b53381bff984c31Craig Mautner    }
2266967212cb542e6eeb308678367b53381bff984c31Craig Mautner
22674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    int getNextStackId() {
2268858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        while (true) {
2269858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (++mLastStackId <= HOME_STACK_ID) {
2270858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                mLastStackId = HOME_STACK_ID + 1;
2271858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
2272858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (getStack(mLastStackId) == null) {
2273858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                break;
22748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
22758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2276858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        return mLastStackId;
22778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
227921d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner    void createStackForRestoredTaskHistory(ArrayList<TaskRecord> tasks) {
228021d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner        int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY);
228121d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner        final ActivityStack stack = getStack(stackId);
228221d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner        for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) {
228321d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner            final TaskRecord task = tasks.get(taskNdx);
228421d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner            stack.addTask(task, false, false);
228521d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner            final int taskId = task.taskId;
228621d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner            final ArrayList<ActivityRecord> activities = task.mActivities;
228721d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
228821d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner                final ActivityRecord r = activities.get(activityNdx);
228921d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner                mWindowManager.addAppToken(0, r.appToken, taskId, stackId,
229021d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner                        r.info.screenOrientation, r.fullscreen,
229121d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner                        (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0,
229221d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner                        r.userId, r.info.configChanges);
229321d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner            }
229421d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner            mWindowManager.addTask(taskId, stackId, false);
229521d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner        }
2296e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner        resumeHomeStackTask(HOME_ACTIVITY_TYPE, null);
229721d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner    }
229821d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner
22998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
2300b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        final TaskRecord task = anyTaskForIdLocked(taskId);
2301b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        if (task == null) {
2302b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner            return;
2303b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        }
23048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
23058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
23068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
23078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
23088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
230941db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner        task.stack.removeTask(task);
2310c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn        stack.addTask(task, toTop, true);
2311b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        mWindowManager.addTask(taskId, stackId, toTop);
231205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        resumeTopActivitiesLocked();
23138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
23148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2315ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityRecord findTaskLocked(ActivityRecord r) {
23162a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn        if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r);
2317e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2318e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
23194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
23204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
23214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (!r.isApplicationActivity() && !stack.isHomeStack()) {
23224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: " + stack);
23234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    continue;
23244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
23254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord ar = stack.findTaskLocked(r);
23264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (ar != null) {
23274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return ar;
23284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
23298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
23308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
23312a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn        if (DEBUG_TASKS) Slog.d(TAG, "No task found");
23328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
23338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
23348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
23358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
2336e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2337e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
23384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
23394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityRecord ar = stacks.get(stackNdx).findActivityLocked(intent, info);
23404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (ar != null) {
23414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return ar;
23424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
23438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
23448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
23458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
23468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
23478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
23488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
23490eea92c67b292b005c152641a12b920fe145826cCraig Mautner        scheduleSleepTimeout();
23500eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mGoingToSleep.isHeld()) {
23510eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.acquire();
23527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
23537ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
23547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
23550eea92c67b292b005c152641a12b920fe145826cCraig Mautner                }
23567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
23577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
23580eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
23598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2360ce15e157a6cf56fc73961ccb8c5ab18b1bf70280Amith Yamasani        checkReadyForSleepLocked();
23618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
23628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
23638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
23640eea92c67b292b005c152641a12b920fe145826cCraig Mautner        goingToSleepLocked();
23650eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2366f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        boolean timedout = false;
23670eea92c67b292b005c152641a12b920fe145826cCraig Mautner        final long endTime = System.currentTimeMillis() + timeout;
23680eea92c67b292b005c152641a12b920fe145826cCraig Mautner        while (true) {
23690eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean cantShutdown = false;
2370e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2371e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
23724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
23734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    cantShutdown |= stacks.get(stackNdx).checkReadyForSleepLocked();
23744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
23750eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
23760eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (cantShutdown) {
23770eea92c67b292b005c152641a12b920fe145826cCraig Mautner                long timeRemaining = endTime - System.currentTimeMillis();
23780eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (timeRemaining > 0) {
23798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
23800eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        mService.wait(timeRemaining);
23818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
23828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
23830eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } else {
23840eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    Slog.w(TAG, "Activity manager shutdown timed out");
23850eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    timedout = true;
23860eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    break;
23878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
23880eea92c67b292b005c152641a12b920fe145826cCraig Mautner            } else {
23890eea92c67b292b005c152641a12b920fe145826cCraig Mautner                break;
23908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
23918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
23920eea92c67b292b005c152641a12b920fe145826cCraig Mautner
23930eea92c67b292b005c152641a12b920fe145826cCraig Mautner        // Force checkReadyForSleep to complete.
23940eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = true;
23950eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
23960eea92c67b292b005c152641a12b920fe145826cCraig Mautner
23978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
23988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
23998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
24008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
24010eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
24020eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
24030eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
24040eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
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                stack.awakeFromSleepingLocked();
24104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (isFrontStack(stack)) {
24114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    resumeTopActivitiesLocked();
24124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
24135314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner            }
24148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
24150eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.clear();
24160eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
24170eea92c67b292b005c152641a12b920fe145826cCraig Mautner
24180eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void activitySleptLocked(ActivityRecord r) {
24190eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.remove(r);
24200eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
24210eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
24220eea92c67b292b005c152641a12b920fe145826cCraig Mautner
24230eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void checkReadyForSleepLocked() {
24240eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mService.isSleepingOrShuttingDown()) {
24250eea92c67b292b005c152641a12b920fe145826cCraig Mautner            // Do not care.
24260eea92c67b292b005c152641a12b920fe145826cCraig Mautner            return;
24270eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
24280eea92c67b292b005c152641a12b920fe145826cCraig Mautner
24290eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mSleepTimeout) {
24300eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean dontSleep = false;
2431e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2432e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
24344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    dontSleep |= stacks.get(stackNdx).checkReadyForSleepLocked();
24354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
24360eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
24370eea92c67b292b005c152641a12b920fe145826cCraig Mautner
24380eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mStoppingActivities.size() > 0) {
24390eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to stop; can't sleep yet.
24400eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
24410eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mStoppingActivities.size() + " activities");
24420eea92c67b292b005c152641a12b920fe145826cCraig Mautner                scheduleIdleLocked();
24430eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
24440eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
24450eea92c67b292b005c152641a12b920fe145826cCraig Mautner
24460eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mGoingToSleepActivities.size() > 0) {
24470eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to sleep; can't sleep yet.
24480eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
24490eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mGoingToSleepActivities.size() + " activities");
24500eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
24510eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
24520eea92c67b292b005c152641a12b920fe145826cCraig Mautner
24530eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (dontSleep) {
24540eea92c67b292b005c152641a12b920fe145826cCraig Mautner                return;
24550eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
24560eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
24570eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2458e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2459e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
24614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stacks.get(stackNdx).goToSleep();
24624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
24630eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
24640eea92c67b292b005c152641a12b920fe145826cCraig Mautner
24650eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
24660eea92c67b292b005c152641a12b920fe145826cCraig Mautner
24670eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
24680eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
24690eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
24700eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mService.mShuttingDown) {
24710eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mService.notifyAll();
24720eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
24738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2475ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean reportResumedActivityLocked(ActivityRecord r) {
2476ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = r.task.stack;
2477ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (isFrontStack(stack)) {
24785782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey            mService.updateUsageStats(r, true);
2479ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2480ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (allResumedActivitiesComplete()) {
2481ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
2482ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.executeAppTransition();
2483ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return true;
2484ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2485ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return false;
2486ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2487ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
24888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
2489e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2490e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
24914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
24924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
24934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
24944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stack.handleAppCrashLocked(app);
24954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
24968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
24978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2499de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
2500580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // First the front stacks. In case any are not fullscreen and are in front of home.
2501e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2502e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
25034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int topStackNdx = stacks.size() - 1;
25044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) {
25054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
2506729cb2391f8eedbab9af1d0ef62febb0b56292ccJose Lima                stack.ensureActivitiesVisibleLocked(starting, configChanges);
2507580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
25088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
25098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
25108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
25118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
2512e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2513e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
25144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
25154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
25164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
25174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stack.scheduleDestroyActivities(app, false, reason);
25184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
25198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
25208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
25218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
25228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
25234f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId());
25244f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID);
25252420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
2526ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
2527858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStartingUsers.add(uss);
2528e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
2529e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
25304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
2531e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                final ActivityStack stack = stacks.get(stackNdx);
2532e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                stack.switchUserLocked(userId);
2533dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                TaskRecord task = stack.topTask();
2534dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                if (task != null) {
2535dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                    mWindowManager.moveTaskToTop(task.taskId);
2536dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                }
25374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
2538ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        }
2539858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
25404f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        ActivityStack stack = getStack(restoreStackId);
25414f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        if (stack == null) {
25424f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner            stack = mHomeStack;
25434f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        }
25444f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        final boolean homeInFront = stack.isHomeStack();
2545e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        if (stack.isOnHomeDisplay()) {
2546e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            moveHomeStack(homeInFront);
2547dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina            TaskRecord task = stack.topTask();
2548dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina            if (task != null) {
2549dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina                mWindowManager.moveTaskToTop(task.taskId);
2550dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina            }
2551e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        } else {
2552e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            // Stack was moved to another display while user was swapped out.
2553e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner            resumeHomeStackTask(HOME_ACTIVITY_TYPE, null);
2554e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        }
255593529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        return homeInFront;
25562219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
25572219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
25581a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    /**
25591a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     * Add background users to send boot completed events to.
25601a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     * @param userId The user being started in the background
25611a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     * @param uss The state object for the user.
25621a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani     */
25631a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    public void startBackgroundUserLocked(int userId, UserStartedState uss) {
25641a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani        mStartingBackgroundUsers.add(uss);
25651a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani    }
25661a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani
2567de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
2568de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        int N = mStoppingActivities.size();
2569de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (N <= 0) return null;
2570de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2571de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ArrayList<ActivityRecord> stops = null;
2572de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2573de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean nowVisible = allResumedActivitiesVisible();
2574de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int i=0; i<N; i++) {
2575de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord s = mStoppingActivities.get(i);
2576a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
2577de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + nowVisible + " waitingVisible=" + s.waitingVisible
2578de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + " finishing=" + s.finishing);
2579de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (s.waitingVisible && nowVisible) {
2580de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mWaitingVisibleActivities.remove(s);
2581de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                s.waitingVisible = false;
2582de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (s.finishing) {
2583de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // If this activity is finishing, it is sitting on top of
2584de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // everyone else but we now know it is no longer needed...
2585de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // so get rid of it.  Otherwise, we need to go through the
2586de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // normal flow and hide it once we determine that it is
2587de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // hidden by the activities in front of it.
2588de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
2589ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWindowManager.setAppVisibility(s.appToken, false);
2590de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2591de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2592de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) {
2593de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
2594de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (stops == null) {
2595de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    stops = new ArrayList<ActivityRecord>();
2596de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2597de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stops.add(s);
2598de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStoppingActivities.remove(i);
2599de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                N--;
2600de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                i--;
2601de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2602de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2603de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2604de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return stops;
2605de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
2606de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2607cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    void validateTopActivitiesLocked() {
26084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        // FIXME
26094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner/*        for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
26104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final ActivityStack stack = stacks.get(stackNdx);
2611cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityRecord r = stack.topRunningActivityLocked(null);
2612f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner            final ActivityState state = r == null ? ActivityState.DESTROYED : r.state;
2613cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (isFrontStack(stack)) {
2614cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r == null) {
2615cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: null top activity, stack=" + stack);
2616cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                } else {
2617f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    final ActivityRecord pausing = stack.mPausingActivity;
2618f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (pausing != null && pausing == r) {
2619cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r +
2620f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
2621cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2622f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) {
2623cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r +
2624f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                                " state=" + state);
2625cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2626cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2627cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            } else {
2628f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                final ActivityRecord resumed = stack.mResumedActivity;
2629f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (resumed != null && resumed == r) {
2630cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r +
2631f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        " state=" + state);
2632cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2633f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (r != null && (state == ActivityState.INITIALIZING
2634f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        || state == ActivityState.RESUMED)) {
2635cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: activity in back resumed r=" + r +
2636f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
2637cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2638cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
2639cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
26404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner*/
264176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner    }
264276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner
2643270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
2644d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity=");
2645270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner                pw.println(mDismissKeyguardOnNextActivity);
2646d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack);
26474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                pw.print(" mLastFocusedStack="); pw.println(mLastFocusedStack);
2648d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout);
2649d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId);
2650d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
265195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner        pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers);
2652270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
26538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
265420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
2655ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack().getDumpActivitiesLocked(name);
265620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
265720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
2658390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage,
2659390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            boolean needSep, String prefix) {
2660390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        if (activity != null) {
2661390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (dumpPackage == null || dumpPackage.equals(activity.packageName)) {
2662390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                if (needSep) {
2663390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    pw.println();
2664390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                }
2665390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.print(prefix);
2666390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println(activity);
26677ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                return true;
2668390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
2669390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        }
26707ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return false;
2671390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    }
2672390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn
26738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
26748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
26757ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean printed = false;
26767ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean needSep = false;
2677e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) {
2678e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx);
2679e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            pw.print("Display #"); pw.println(activityDisplay.mDisplayId);
2680e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
26814a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final int numStacks = stacks.size();
26824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
26834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                final ActivityStack stack = stacks.get(stackNdx);
26844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                StringBuilder stackHeader = new StringBuilder(128);
26854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stackHeader.append("  Stack #");
26864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stackHeader.append(stack.mStackId);
26874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                stackHeader.append(":");
26884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage,
26894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        needSep, stackHeader.toString());
26904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, "    ", "Run", false,
26914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        !dumpAll, false, dumpPackage, true,
26924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        "    Running activities (most recent first):", null);
26934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
26944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                needSep = printed;
26954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep,
26964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        "    mPausingActivity: ");
26974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (pr) {
26984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    printed = true;
26994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    needSep = false;
27004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
27014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep,
27024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        "    mResumedActivity: ");
27037ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                if (pr) {
27047ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    printed = true;
27054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    needSep = false;
27064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
27074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                if (dumpAll) {
27084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep,
27094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            "    mLastPausedActivity: ");
27104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    if (pr) {
27114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        printed = true;
27124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                        needSep = true;
27134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    }
27144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage,
27154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                            needSep, "    mLastNoHistoryActivity: ");
27167ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                }
27174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                needSep = printed;
27188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
27198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
27208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
27217ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mFinishingActivities, "  ", "Fin", false, !dumpAll,
27227ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to finish:", null);
27237ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mStoppingActivities, "  ", "Stop", false, !dumpAll,
27247ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to stop:", null);
27257ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, "  ", "Wait", false, !dumpAll,
27267ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting for another to become visible:",
27277ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                null);
27287ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
27297ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
27307ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
27317ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
2732de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
27337ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return printed;
27348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
27358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2736390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
27378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
27387ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            String dumpPackage, boolean needNL, String header1, String header2) {
27398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
2740390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String innerPrefix = null;
2741390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String[] args = null;
2742390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        boolean printed = false;
27438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
27448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
27458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
27468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
27478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
2748390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (innerPrefix == null) {
2749390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                innerPrefix = prefix + "      ";
2750390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                args = new String[0];
2751390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
2752390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            printed = true;
27538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
27548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
2755390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println("");
27568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
27578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
27587ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header1 != null) {
27597ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header1);
27607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header1 = null;
27617ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
27627ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header2 != null) {
27637ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header2);
27647ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header2 = null;
2765390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
27668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
27678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
27688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
27698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
27708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
27718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
27728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
27738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
27748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
27758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
27768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
27778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
27788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
27798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
27808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
27818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
27828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
27838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
27848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
27858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
27868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
27878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
27888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
27898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
27908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
27918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
27928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
27938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
27948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
27958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
27968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
27978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
27988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
27998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
28008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
28018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
28028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
28038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
28048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
28058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
28068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
28078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
28088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
28098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
28108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
28118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
28128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
28138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
28148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
28158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2816390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        return printed;
28178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2818ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2819f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void scheduleIdleTimeoutLocked(ActivityRecord next) {
2820b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4));
2821c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
2822c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
2823f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2824f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2825f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final void scheduleIdleLocked() {
282605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(IDLE_NOW_MSG);
2827f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2828f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2829f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void removeTimeoutsForActivityLocked(ActivityRecord r) {
2830b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4));
2831f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
2832f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2833f333327782e14688e1c198c1192172d51308e90bCraig Mautner
283405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    final void scheduleResumeTopActivities() {
283534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) {
283634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
283734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
283805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
283905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
28400eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void removeSleepTimeouts() {
28410eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = false;
28420eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
28430eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
28440eea92c67b292b005c152641a12b920fe145826cCraig Mautner
28450eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final void scheduleSleepTimeout() {
28460eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
28470eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT);
28480eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
28490eea92c67b292b005c152641a12b920fe145826cCraig Mautner
28504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    @Override
28514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void onDisplayAdded(int displayId) {
28524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0));
28534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
28544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
28554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    @Override
28564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void onDisplayRemoved(int displayId) {
28574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0));
28584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
28594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
28604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    @Override
28614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void onDisplayChanged(int displayId) {
28624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0));
28634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
28644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
28654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void handleDisplayAddedLocked(int displayId) {
28664504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        boolean newDisplay;
28674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
28684504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            newDisplay = mActivityDisplays.get(displayId) == null;
28694504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            if (newDisplay) {
28704504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner                ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
28714504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner                mActivityDisplays.put(displayId, activityDisplay);
28724504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            }
28734504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        }
28744504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        if (newDisplay) {
28754504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            mWindowManager.onDisplayAdded(displayId);
28764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
28774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
28784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
28794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void handleDisplayRemovedLocked(int displayId) {
28804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
2881e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
2882e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (activityDisplay != null) {
2883e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                ArrayList<ActivityStack> stacks = activityDisplay.mStacks;
28844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
288534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    stacks.get(stackNdx).mActivityContainer.detachLocked();
28864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
2887e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplays.remove(displayId);
28884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
28894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
28904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mWindowManager.onDisplayRemoved(displayId);
28914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
28924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
28934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    public void handleDisplayChangedLocked(int displayId) {
28944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        synchronized (mService) {
2895e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
2896e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (activityDisplay != null) {
28974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                // TODO: Update the bounds.
28984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
28994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
29004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mWindowManager.onDisplayChanged(displayId);
29014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
29024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
29034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    StackInfo getStackInfo(ActivityStack stack) {
29044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        StackInfo info = new StackInfo();
29054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        mWindowManager.getStackBounds(stack.mStackId, info.bounds);
29064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.displayId = Display.DEFAULT_DISPLAY;
29074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.stackId = stack.mStackId;
29084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
29094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<TaskRecord> tasks = stack.getAllTasks();
29104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final int numTasks = tasks.size();
29114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        int[] taskIds = new int[numTasks];
29124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        String[] taskNames = new String[numTasks];
29134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        for (int i = 0; i < numTasks; ++i) {
29144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            final TaskRecord task = tasks.get(i);
29154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            taskIds[i] = task.taskId;
29164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            taskNames[i] = task.origActivity != null ? task.origActivity.flattenToString()
29174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    : task.realActivity != null ? task.realActivity.flattenToString()
29184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    : task.getTopActivity() != null ? task.getTopActivity().packageName
29194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    : "unknown";
29204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
29214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.taskIds = taskIds;
29224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        info.taskNames = taskNames;
29234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return info;
29244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
29254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
29264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    StackInfo getStackInfoLocked(int stackId) {
29274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ActivityStack stack = getStack(stackId);
29284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        if (stack != null) {
29294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return getStackInfo(stack);
29304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
29314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return null;
29324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
29334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
29344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    ArrayList<StackInfo> getAllStackInfosLocked() {
29354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ArrayList<StackInfo> list = new ArrayList<StackInfo>();
2936e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) {
2937e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
29384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            for (int ndx = stacks.size() - 1; ndx >= 0; --ndx) {
29394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                list.add(getStackInfo(stacks.get(ndx)));
29404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
29414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
29424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        return list;
29434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    }
29444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
2945aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    void setLockTaskModeLocked(TaskRecord task) {
2946aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (task == null) {
2947aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            // Take out of lock task mode.
2948aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            mLockTaskModeTask = null;
2949aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            return;
2950aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
2951aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (isLockTaskModeViolation(task)) {
2952aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            Slog.e(TAG, "setLockTaskMode: Attempt to start a second Lock Task Mode task.");
2953aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            return;
2954aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
2955aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        mLockTaskModeTask = task;
2956aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        findTaskToMoveToFrontLocked(task, 0, null);
2957aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        resumeTopActivitiesLocked();
2958aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
2959aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
2960aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    boolean isLockTaskModeViolation(TaskRecord task) {
2961aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        return mLockTaskModeTask != null && mLockTaskModeTask != task;
2962aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
2963aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
2964aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    void endLockTaskModeIfTaskEnding(TaskRecord task) {
2965aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        if (mLockTaskModeTask != null && mLockTaskModeTask == task) {
2966aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner            mLockTaskModeTask = null;
2967aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        }
2968aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
2969aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
2970aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    boolean isInLockTaskMode() {
2971aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner        return mLockTaskModeTask != null;
2972aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner    }
2973aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner
2974ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    private final class ActivityStackSupervisorHandler extends Handler {
2975f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2976ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public ActivityStackSupervisorHandler(Looper looper) {
2977ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            super(looper);
2978ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2979ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2980f333327782e14688e1c198c1192172d51308e90bCraig Mautner        void activityIdleInternal(ActivityRecord r) {
2981f333327782e14688e1c198c1192172d51308e90bCraig Mautner            synchronized (mService) {
2982f333327782e14688e1c198c1192172d51308e90bCraig Mautner                activityIdleInternalLocked(r != null ? r.appToken : null, true, null);
2983f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
29847ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
29857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2986ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        @Override
2987ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public void handleMessage(Message msg) {
2988ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            switch (msg.what) {
2989f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_TIMEOUT_MSG: {
29905eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
2991f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    if (mService.mDidDexOpt) {
2992f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.mDidDexOpt = false;
2993f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
2994f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        nmsg.obj = msg.obj;
2995f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
2996f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        return;
2997f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
2998f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // We don't at this point know if the activity is fullscreen,
2999f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // so we need to be conservative and assume it isn't.
3000f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
3001f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
3002f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_NOW_MSG: {
30035eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
3004f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
3005f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
300605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                case RESUME_TOP_ACTIVITY_MSG: {
300705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    synchronized (mService) {
300805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                        resumeTopActivitiesLocked();
300905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    }
301005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } break;
30110eea92c67b292b005c152641a12b920fe145826cCraig Mautner                case SLEEP_TIMEOUT_MSG: {
30120eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    synchronized (mService) {
30130eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        if (mService.isSleepingOrShuttingDown()) {
30140eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
30150eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            mSleepTimeout = true;
30160eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            checkReadyForSleepLocked();
30170eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        }
30180eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    }
30190eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } break;
30207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                case LAUNCH_TIMEOUT_MSG: {
30217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    if (mService.mDidDexOpt) {
30227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mService.mDidDexOpt = false;
30237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
30247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        return;
30257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
30267ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    synchronized (mService) {
30277ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        if (mLaunchingActivity.isHeld()) {
30287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
30297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            if (VALIDATE_WAKE_LOCK_CALLER
30307ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                    && Binder.getCallingUid() != Process.myUid()) {
30317ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                throw new IllegalStateException("Calling must be system uid");
30327ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            }
30337ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            mLaunchingActivity.release();
30347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        }
30357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
30367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                } break;
30374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                case HANDLE_DISPLAY_ADDED: {
30384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    handleDisplayAddedLocked(msg.arg1);
30394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                } break;
30404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                case HANDLE_DISPLAY_CHANGED: {
30414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    handleDisplayChangedLocked(msg.arg1);
30424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                } break;
30434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                case HANDLE_DISPLAY_REMOVED: {
30444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    handleDisplayRemovedLocked(msg.arg1);
30454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                } break;
3046e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                case CONTAINER_CALLBACK_VISIBILITY: {
3047e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    final ActivityContainer container = (ActivityContainer) msg.obj;
3048e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    try {
3049e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                        // We only send this message if mCallback is non-null.
3050e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                        container.mCallback.setVisible(container.asBinder(), msg.arg1 == 1);
3051e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    } catch (RemoteException e) {
3052e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    }
3053e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                }
3054ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
3055ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
3056ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
3057ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3058b081a59a0fdec88dd9b0f68b45c2f625f751d625Ying Wang    class ActivityContainer extends android.app.IActivityContainer.Stub {
30597f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner        final static int FORCE_NEW_TASK_FLAGS = Intent.FLAG_ACTIVITY_NEW_TASK |
30607f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner                Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
30614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final int mStackId;
3062f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        IActivityContainerCallback mCallback = null;
30634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        final ActivityStack mStack;
3064f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityRecord mParentActivity = null;
3065f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        String mIdString;
3066ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3067e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner        boolean mVisible = true;
3068e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner
30694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        /** Display this ActivityStack is currently on. Null if not attached to a Display. */
3070e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityDisplay mActivityDisplay;
30714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3072f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final static int CONTAINER_STATE_HAS_SURFACE = 0;
3073f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final static int CONTAINER_STATE_NO_SURFACE = 1;
3074f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        final static int CONTAINER_STATE_FINISHING = 2;
3075f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        int mContainerState = CONTAINER_STATE_HAS_SURFACE;
3076f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3077f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityContainer(int stackId) {
30784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            synchronized (mService) {
30794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                mStackId = stackId;
30804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                mStack = new ActivityStack(this);
3081f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mIdString = "ActivtyContainer{" + mStackId + "}";
308234b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "Creating " + this);
30834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
3084ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner        }
3085ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3086e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        void attachToDisplayLocked(ActivityDisplay activityDisplay) {
308734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "attachToDisplayLocked: " + this
308834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    + " to display=" + activityDisplay);
3089e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mActivityDisplay = activityDisplay;
3090e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStack.mDisplayId = activityDisplay.mDisplayId;
3091e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStack.mStacks = activityDisplay.mStacks;
3092e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner
3093e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            activityDisplay.attachActivities(mStack);
3094df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mWindowManager.attachStack(mStackId, activityDisplay.mDisplayId);
30954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
30964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
30974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3098ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        public void attachToDisplay(int displayId) {
30994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            synchronized (mService) {
3100e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
3101e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                if (activityDisplay == null) {
31024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                    return;
31034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                }
3104e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                attachToDisplayLocked(activityDisplay);
31054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
31064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
31074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
31084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3109ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        public int getDisplayId() {
3110e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (mActivityDisplay != null) {
3111e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                return mActivityDisplay.mDisplayId;
3112e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
3113e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            return -1;
31144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
31154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3116ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        @Override
3117ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        public boolean injectEvent(InputEvent event) {
3118ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            final long origId = Binder.clearCallingIdentity();
3119ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            try {
3120ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                if (mActivityDisplay != null) {
3121ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                    return mInputManagerInternal.injectInputEvent(event,
3122ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                            mActivityDisplay.mDisplayId,
3123ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                            InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
3124ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                }
3125ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                return false;
3126ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            } finally {
3127ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown                Binder.restoreCallingIdentity(origId);
3128ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown            }
3129ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown        }
3130ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown
3131f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
3132f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public void release() {
3133f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mContainerState = CONTAINER_STATE_FINISHING;
3134f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mStack.finishAllActivitiesLocked();
3135f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            detachLocked();
3136f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mWindowManager.removeStack(mStackId);
3137f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3138f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
313934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        private void detachLocked() {
314034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display="
314134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner                    + mActivityDisplay + " Callers=" + Debug.getCallers(2));
3142e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (mActivityDisplay != null) {
3143e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplay.detachActivitiesLocked(mStack);
3144e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplay = null;
3145e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mStack.mDisplayId = -1;
3146e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mStack.mStacks = null;
3147df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                mWindowManager.detachStack(mStackId);
31484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
31494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
31504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
31514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3152e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        public final int startActivity(Intent intent) {
3153df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mService.enforceNotIsolatedCaller("ActivityContainer.startActivity");
3154e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            int userId = mService.handleIncomingUser(Binder.getCallingPid(),
3155e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    Binder.getCallingUid(), mCurrentUser, false, true, "ActivityContainer", null);
3156e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            // TODO: Switch to user app stacks here.
31577f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner            intent.addFlags(FORCE_NEW_TASK_FLAGS);
3158e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            String mimeType = intent.getType();
3159e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (mimeType == null && intent.getData() != null
3160e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    && "content".equals(intent.getData().getScheme())) {
3161e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mimeType = mService.getProviderMimeType(intent.getData(), userId);
3162e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            }
316391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn            return startActivityMayWait(null, -1, null, intent, mimeType, null, null, null, null, 0, 0, null,
3164e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    null, null, null, null, userId, this);
31654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
31664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
31674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        @Override
3168df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        public final int startActivityIntentSender(IIntentSender intentSender) {
3169df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender");
3170df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
3171df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            if (!(intentSender instanceof PendingIntentRecord)) {
3172df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner                throw new IllegalArgumentException("Bad PendingIntent object");
3173df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            }
3174df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
3175df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            return ((PendingIntentRecord)intentSender).sendInner(0, null, null, null, null, null,
31767f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner                    null, 0, FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this);
3177df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        }
3178df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner
3179247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        private void checkEmbeddedAllowedInner(Intent intent, String resolvedType) {
3180247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            int userId = mService.handleIncomingUser(Binder.getCallingPid(),
3181247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                    Binder.getCallingUid(), mCurrentUser, false, true, "ActivityContainer", null);
3182247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            if (resolvedType == null) {
3183247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                resolvedType = intent.getType();
3184247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                if (resolvedType == null && intent.getData() != null
3185247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                        && "content".equals(intent.getData().getScheme())) {
3186247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                    resolvedType = mService.getProviderMimeType(intent.getData(), userId);
3187247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                }
3188247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            }
3189247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, null, userId);
319005678d5a3136a747a2e7eaccca0ad148c52a2d00Craig Mautner            if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) {
3191247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                throw new SecurityException(
3192247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                        "Attempt to embed activity that has not set allowEmbedded=\"true\"");
3193247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            }
3194247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        }
3195247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner
3196247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        /** Throw a SecurityException if allowEmbedded is not true */
3197247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        @Override
3198247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        public final void checkEmbeddedAllowed(Intent intent) {
3199247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            checkEmbeddedAllowedInner(intent, null);
3200247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        }
3201247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner
3202247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        /** Throw a SecurityException if allowEmbedded is not true */
3203247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        @Override
3204247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        public final void checkEmbeddedAllowedIntentSender(IIntentSender intentSender) {
3205247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            if (!(intentSender instanceof PendingIntentRecord)) {
3206247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                throw new IllegalArgumentException("Bad PendingIntent object");
3207247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            }
3208247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender;
3209247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner            checkEmbeddedAllowedInner(pendingIntent.key.requestIntent,
3210247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner                    pendingIntent.key.requestResolvedType);
3211247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner        }
3212247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner
3213df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner        @Override
32144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        public IBinder asBinder() {
32154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return this;
32164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
32174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
32184504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        @Override
3219f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public void setSurface(Surface surface, int width, int height, int density) {
3220df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner            mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface");
32214504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        }
32224504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner
32234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        ActivityStackSupervisor getOuter() {
32244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            return ActivityStackSupervisor.this;
32254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
32264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
32274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        boolean isAttached() {
3228e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            return mActivityDisplay != null;
32294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
32304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
32314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        void getBounds(Point outBounds) {
3232e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (mActivityDisplay != null) {
3233e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                mActivityDisplay.getBounds(outBounds);
32344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            } else {
32354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner                outBounds.set(0, 0);
32364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            }
3237ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner        }
323834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner
32396985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        // TODO: Make sure every change to ActivityRecord.visible results in a call to this.
3240e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner        void setVisible(boolean visible) {
3241e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner            if (mVisible != visible) {
3242e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                mVisible = visible;
3243e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                if (mCallback != null) {
3244e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                    mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0,
3245e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                            0 /* unused */, this).sendToTarget();
3246e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner                }
3247e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner            }
3248e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner        }
3249e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner
32506985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        void setDrawn() {
32516985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        }
32526985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
325334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        @Override
325434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        public String toString() {
325534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            return mIdString + (mActivityDisplay == null ? "N" : "A");
325634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
3257ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner    }
3258ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner
3259f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    private class VirtualActivityContainer extends ActivityContainer {
3260f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        Surface mSurface;
32616985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        boolean mDrawn = false;
3262f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3263f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) {
3264f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            super(getNextStackId());
3265f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mParentActivity = parent;
3266f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mCallback = callback;
3267f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mContainerState = CONTAINER_STATE_NO_SURFACE;
3268f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mIdString = "VirtualActivtyContainer{" + mStackId + ", parent=" + mParentActivity + "}";
3269f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3270f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3271f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
3272f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public void setSurface(Surface surface, int width, int height, int density) {
3273f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            super.setSurface(surface, width, height, density);
3274f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3275f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            synchronized (mService) {
3276f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                final long origId = Binder.clearCallingIdentity();
3277f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                try {
3278f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    setSurfaceLocked(surface, width, height, density);
3279f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                } finally {
3280f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    Binder.restoreCallingIdentity(origId);
3281f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                }
3282f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3283f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3284f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3285f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        private void setSurfaceLocked(Surface surface, int width, int height, int density) {
3286f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mContainerState == CONTAINER_STATE_FINISHING) {
3287f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                return;
3288f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3289f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            VirtualActivityDisplay virtualActivityDisplay =
3290f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    (VirtualActivityDisplay) mActivityDisplay;
3291f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (virtualActivityDisplay == null) {
3292f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                virtualActivityDisplay =
32936985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                        new VirtualActivityDisplay(width, height, density);
3294f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mActivityDisplay = virtualActivityDisplay;
3295f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay);
3296f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                attachToDisplayLocked(virtualActivityDisplay);
3297f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3298f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3299f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mSurface != null) {
3300f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mSurface.release();
3301f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3302f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
33036985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            mSurface = surface;
3304f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (surface != null) {
3305f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mStack.resumeTopActivityLocked(null);
3306f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            } else {
3307f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mContainerState = CONTAINER_STATE_NO_SURFACE;
33086985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                ((VirtualActivityDisplay) mActivityDisplay).setSurface(null);
3309d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner                if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) {
3310d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner                    mStack.startPausingLocked(false, true);
3311d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner                }
3312f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
33136985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
33146985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            setSurfaceIfReady();
33156985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
3316f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display="
3317f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    + virtualActivityDisplay);
33186985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        }
3319f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
33206985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        @Override
3321d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner        boolean isAttached() {
3322d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner            return mSurface != null && super.isAttached();
3323d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner        }
3324d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner
3325d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner        @Override
33266985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        void setDrawn() {
33276985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            synchronized (mService) {
33286985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                mDrawn = true;
33296985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                setSurfaceIfReady();
33306985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            }
33316985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        }
33326985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner
33336985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        private void setSurfaceIfReady() {
33346985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReady: mDrawn=" + mDrawn +
33356985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                    " mContainerState=" + mContainerState + " mSurface=" + mSurface);
33366985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) {
33376985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface);
33386985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                mContainerState = CONTAINER_STATE_HAS_SURFACE;
33396985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner            }
3340f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3341f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    }
3342f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
33434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner    /** Exactly one of these classes per Display in the system. Capable of holding zero or more
33444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner     * attached {@link ActivityStack}s */
3345f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    class ActivityDisplay {
33464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        /** Actual Display this object tracks. */
334734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        int mDisplayId;
334834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        Display mDisplay;
334934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        DisplayInfo mDisplayInfo = new DisplayInfo();
33504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        /** All of the stacks on this display. Order matters, topmost stack is in front of all other
33524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner         * stacks, bottommost behind. Accessed directly by ActivityManager package classes */
3353e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        final ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
33544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3355f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        ActivityDisplay() {
3356f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
33574504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner
3358e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        ActivityDisplay(int displayId) {
335934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            init(mDisplayManager.getDisplay(displayId));
33604504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner        }
33614504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner
3362f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        void init(Display display) {
33634504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            mDisplay = display;
33644504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner            mDisplayId = display.getDisplayId();
33654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplay.getDisplayInfo(mDisplayInfo);
33664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        void attachActivities(ActivityStack stack) {
3369e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            if (DEBUG_STACK) Slog.v(TAG, "attachActivities: attaching " + stack + " to displayId="
3370e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    + mDisplayId);
3371e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStacks.add(stack);
33724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
3374e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner        void detachActivitiesLocked(ActivityStack stack) {
337534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner            if (DEBUG_STACK) Slog.v(TAG, "detachActivitiesLocked: detaching " + stack
3376e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner                    + " from displayId=" + mDisplayId);
3377e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner            mStacks.remove(stack);
33784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        }
33794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner
33804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner        void getBounds(Point bounds) {
33814a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            mDisplay.getDisplayInfo(mDisplayInfo);
33824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            bounds.x = mDisplayInfo.appWidth;
33834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner            bounds.y = mDisplayInfo.appHeight;
3384ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner        }
338534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner
338634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        @Override
338734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        public String toString() {
3388f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}";
3389f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3390f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    }
3391f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3392f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner    class VirtualActivityDisplay extends ActivityDisplay {
3393f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        VirtualDisplay mVirtualDisplay;
3394f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
33956985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner        VirtualActivityDisplay(int width, int height, int density) {
3396f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
3397f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, VIRTUAL_DISPLAY_BASE_NAME,
33986985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner                    width, height, density, null, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC |
3399f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                    DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY);
3400f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3401f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            init(mVirtualDisplay.getDisplay());
3402f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3403f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            mWindowManager.handleDisplayAdded(mDisplayId);
3404f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3405f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3406f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        void setSurface(Surface surface) {
3407f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mVirtualDisplay != null) {
3408f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mVirtualDisplay.setSurface(surface);
3409f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3410f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3411f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3412f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
3413f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        void detachActivitiesLocked(ActivityStack stack) {
3414f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            super.detachActivitiesLocked(stack);
3415f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            if (mVirtualDisplay != null) {
3416f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mVirtualDisplay.release();
3417f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner                mVirtualDisplay = null;
3418f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            }
3419f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        }
3420f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner
3421f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        @Override
3422f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner        public String toString() {
3423f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner            return "VirtualActivityDisplay={" + mDisplayId + "}";
342434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner        }
3425ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner    }
3426270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
3427