ActivityStackSupervisor.java revision 4ef2693a243b308fad775a8a1691963c51ac925e
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;
348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
352420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity;
3623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager;
3723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions;
3823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals;
39ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager;
4023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread;
4120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.IThumbnailReceiver;
4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent;
4320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
4423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
452420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo;
4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
472219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
4823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
492219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
5023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
512219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
5223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
5323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
5423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
5523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
5623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
58b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug;
59ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler;
6023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
612219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
622420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message;
6323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
640eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport android.os.PowerManager;
657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautnerimport android.os.Process;
668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
6723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
686170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle;
692420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog;
708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
71858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautnerimport android.util.SparseArray;
722219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
7323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
74cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe;
756170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
762420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
77de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport com.android.server.wm.StackBox;
78ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService;
7923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
82270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
832219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
85270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
86be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornpublic final class ActivityStackSupervisor {
87de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG = ActivityManagerService.DEBUG || false;
88de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_ADD_REMOVE = DEBUG || false;
89de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_APP = DEBUG || false;
90de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_SAVED_STATE = DEBUG || false;
91de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_STATES = DEBUG || false;
92b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner    static final boolean DEBUG_IDLE = DEBUG || false;
932420ead0326bfd2587da6231be419e758dba1930Craig Mautner
942219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
95270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
96f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** How long we wait until giving up on the last activity telling us it is idle. */
97f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_TIMEOUT = 10*1000;
98f333327782e14688e1c198c1192172d51308e90bCraig Mautner
990eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** How long we can hold the sleep wake lock before giving up. */
1000eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT = 5*1000;
1010eea92c67b292b005c152641a12b920fe145826cCraig Mautner
1027ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // How long we can hold the launch wake lock before giving up.
1037ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT = 10*1000;
1047ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
10505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG;
10605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1;
10705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2;
1080eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3;
1097ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4;
1107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // For debugging to make sure the caller when acquiring/releasing our
1127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // wake lock is the system process.
1137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final boolean VALIDATE_WAKE_LOCK_CALLER = false;
114f333327782e14688e1c198c1192172d51308e90bCraig Mautner
115270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
1162219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Context mContext;
1172219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Looper mLooper;
118270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
119ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ActivityStackSupervisorHandler mHandler;
120ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
121ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** Short cut */
122ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    WindowManagerService mWindowManager;
123ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
124270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    /** Dismiss the keyguard after the next activity is displayed? */
125270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    private boolean mDismissKeyguardOnNextActivity = false;
126270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
128d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner    private int mLastStackId = HOME_STACK_ID;
1298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
1318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
1328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
1338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1342420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
1352420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
1362420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** The stack containing the launcher app */
1382219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
13920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
140de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** The non-home stack currently receiving input or launching the next activity. If home is
14141c0f353c6209bf02708483b6f712fafde759925Craig Mautner     * in front then mHomeStack overrides mFocusedStack.
14241c0f353c6209bf02708483b6f712fafde759925Craig Mautner     * DO NOT ACCESS DIRECTLY - It may be null, use getFocusedStack() */
14329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    private ActivityStack mFocusedStack;
1448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** All the non-launcher stacks */
1462219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
1472219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
148de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_FRONT = 0;
149de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_BACK = 1;
150de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_BACK = 2;
151de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_FRONT = 3;
152de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private int mStackState = STACK_STATE_HOME_IN_FRONT;
153de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
154de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are waiting for a new activity to become visible before completing
155de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * whatever operation they are supposed to do. */
156de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();
157de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
158ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next visible activity. */
159ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
160ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
161ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
162ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next launched activity. */
163ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
164ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
165ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
166de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are ready to be stopped, but waiting for the next activity to
167de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * settle down before doing so. */
168de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();
169de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
170f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of activities that are ready to be finished, but waiting for the previous activity to
171f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * settle down before doing so.  It contains ActivityRecord objects. */
172f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();
173f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1740eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** List of activities that are in the process of going to sleep. */
1750eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>();
1760eea92c67b292b005c152641a12b920fe145826cCraig Mautner
177f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of ActivityRecord objects that have been finished and must still report back to a
178f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * pending thumbnail receiver. */
179f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mCancelledThumbnails = new ArrayList<ActivityRecord>();
180f333327782e14688e1c198c1192172d51308e90bCraig Mautner
181f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** Used on user changes */
182f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>();
183f333327782e14688e1c198c1192172d51308e90bCraig Mautner
184de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity
185de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * is being brought in front of us. */
186de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean mUserLeaving = false;
187de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
1880eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** Set when we have taken too long waiting to go to sleep. */
1890eea92c67b292b005c152641a12b920fe145826cCraig Mautner    boolean mSleepTimeout = false;
1900eea92c67b292b005c152641a12b920fe145826cCraig Mautner
1910eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /**
1927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * We don't want to allow the device to go to sleep while in the process
1937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * of launching an activity.  This is primarily to allow alarm intent
1947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * receivers to launch an activity and get that to run before the device
1957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * goes back to sleep.
1967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     */
1977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    final PowerManager.WakeLock mLaunchingActivity;
1987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    /**
2000eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * Set when the system is going to sleep, until we have
2010eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * successfully paused the current activity and released our wake lock.
2020eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * At that point the system is allowed to actually sleep.
2030eea92c67b292b005c152641a12b920fe145826cCraig Mautner     */
2040eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final PowerManager.WakeLock mGoingToSleep;
2050eea92c67b292b005c152641a12b920fe145826cCraig Mautner
206ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    /**
207ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner     * The name of the current home activity for each user.
208ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner     * TODO: Remove entries when user is deleted.
209ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner     */
210ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    final SparseArray<String> mHomePackageNames = new SparseArray<String>();
211ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
2122219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service, Context context,
2132219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner            Looper looper) {
214270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
2152219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mContext = context;
2162219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mLooper = looper;
2170eea92c67b292b005c152641a12b920fe145826cCraig Mautner        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
2180eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
219ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHandler = new ActivityStackSupervisorHandler(looper);
2207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
2217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
2227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
2237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity =
2247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
2257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.setReferenceCounted(false);
2262219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2272219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
228ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void setWindowManager(WindowManagerService wm) {
229ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager = wm;
230ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID);
2318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        mStacks.add(mHomeStack);
232270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
233270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
234270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void dismissKeyguard() {
235270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        if (mDismissKeyguardOnNextActivity) {
236270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mDismissKeyguardOnNextActivity = false;
237ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.dismissKeyguard();
238270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        }
239270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
240270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
241ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    ActivityStack getFocusedStack() {
242f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        if (mFocusedStack == null) {
243f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            return mHomeStack;
244f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        }
245de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
246de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
247de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
248de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
249de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
250de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
25229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
253de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
25420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
25520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getLastStack() {
257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
258de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
259de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
260de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
261de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
262de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
263de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
26429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
265de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2662219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2672219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
268de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean isFrontStack(ActivityStack stack) {
269ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack());
27020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
27120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
272de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void moveHomeStack(boolean toFront) {
273de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean homeInFront = isFrontStack(mHomeStack);
274de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (homeInFront ^ toFront) {
27576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: mStackState old=" +
27676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                    stackStateToString(mStackState) + " new=" + stackStateToString(homeInFront ?
27776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                    STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT));
278de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            mStackState = homeInFront ? STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT;
279de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
280de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
281de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
28269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    boolean resumeHomeActivity(ActivityRecord prev) {
28369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        moveHomeStack(true);
28469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (prev != null) {
285ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner            prev.task.mOnTopOfHome = false;
28669ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
287a82aa09ba3b8cada49f0b20777e7502e86bb0248Craig Mautner        mHomeStack.moveHomeTaskToTop();
288a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner        ActivityRecord r = mHomeStack.topRunningActivityLocked(null);
289a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner        if (r != null) {
290a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner            mService.setFocusedActivityLocked(r);
29105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            return resumeTopActivitiesLocked(mHomeStack, prev, null);
29269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
29369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        return mService.startHomeActivityLocked(mCurrentUser);
29469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    }
29569ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner
296de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final void setLaunchHomeTaskNextFlag(ActivityRecord sourceRecord, ActivityRecord r,
297de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityStack stack) {
298de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack == mHomeStack) {
299de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            return;
300de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
301de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if ((sourceRecord == null && getLastStack() == mHomeStack) ||
30286d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner                (sourceRecord != null && sourceRecord.isHomeActivity())) {
303de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r == null) {
304de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r = stack.topRunningActivityLocked(null);
305de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
30686d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner            if (r != null && !r.isHomeActivity() && r.isRootActivity()) {
307ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                r.task.mOnTopOfHome = true;
308de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
309de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
3102219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
3112219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
312270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void setDismissKeyguard(boolean dismiss) {
313270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mDismissKeyguardOnNextActivity = dismiss;
314270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
315270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
3168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
3178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
3188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            ActivityStack stack = mStacks.get(stackNdx);
3198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            TaskRecord task = stack.taskForIdLocked(id);
3208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (task != null) {
3218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return task;
3228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
3238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
3248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
3258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
3268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
3276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    ActivityRecord isInAnyStackLocked(IBinder token) {
3286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
3296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final ActivityRecord r = mStacks.get(stackNdx).isInStackLocked(token);
3306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (r != null) {
3316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return r;
3326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
3336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
3346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return null;
3356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
3366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
3378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
3388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
3398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
3408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
3418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
3428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
3438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
3448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
3458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
3468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
347de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void removeTask(TaskRecord task) {
348b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        mWindowManager.removeTask(task.taskId);
349de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack stack = task.stack;
350b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        final ActivityRecord r = stack.mResumedActivity;
351b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        if (r != null && r.task == task) {
352b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner            stack.mResumedActivity = null;
353b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        }
354de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.removeTask(task) && !stack.isHomeStack()) {
355a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner            if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack);
356de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            mStacks.remove(stack);
3574cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner            final int stackId = stack.mStackId;
358ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            final int nextStackId = mWindowManager.removeStack(stackId);
359a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner            // TODO: Perhaps we need to let the ActivityManager determine the next focus...
360ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (mFocusedStack == null || mFocusedStack.mStackId == stackId) {
3611602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner                // If this is the last app stack, set mFocusedStack to null.
36229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mFocusedStack = nextStackId == HOME_STACK_ID ? null : getStack(nextStackId);
363de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
364de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
365de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
366de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
367de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityRecord resumedAppLocked() {
368ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        ActivityStack stack = getFocusedStack();
369ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (stack == null) {
370ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return null;
371ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
372de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityRecord resumedActivity = stack.mResumedActivity;
373de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (resumedActivity == null || resumedActivity.app == null) {
374de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            resumedActivity = stack.mPausingActivity;
375de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (resumedActivity == null || resumedActivity.app == null) {
376de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resumedActivity = stack.topRunningActivityLocked(null);
377de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
378de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
379de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return resumedActivity;
380de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
381de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
38220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception {
38320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        boolean didSomething = false;
38420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
38520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
38620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
387858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (!isFrontStack(stack)) {
388858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                continue;
389858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
39020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            ActivityRecord hr = stack.topRunningActivityLocked(null);
39120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (hr != null) {
39220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                if (hr.app == null && app.uid == hr.info.applicationInfo.uid
39320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        && processName.equals(hr.processName)) {
39420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    try {
39520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        if (headless) {
39620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            Slog.e(TAG, "Starting activities not supported on headless device: "
39720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                                    + hr);
3982420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } else if (realStartActivityLocked(hr, app, true, true)) {
39920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            didSomething = true;
40020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
40120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    } catch (Exception e) {
40220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        Slog.w(TAG, "Exception in new application when starting activity "
40320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                              + hr.intent.getComponent().flattenToShortString(), e);
40420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        throw e;
40520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
40620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
40720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
40820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
409b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (!didSomething) {
410b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
411b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        }
41220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
41320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
41420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
41520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
41620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
4177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
4187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (!isFrontStack(stack)) {
4197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                continue;
4207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
4217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            final ActivityRecord resumedActivity = stack.mResumedActivity;
422dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            if (resumedActivity == null || !resumedActivity.idle) {
42320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                return false;
42420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
42520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
42620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
42720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
42820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
429de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesComplete() {
430de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
431de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
432967212cb542e6eeb308678367b53381bff984c31Craig Mautner            if (isFrontStack(stack)) {
433de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                final ActivityRecord r = stack.mResumedActivity;
434de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (r != null && r.state != ActivityState.RESUMED) {
435de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    return false;
436de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
437de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
438de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
439de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        // TODO: Not sure if this should check if all Paused are complete too.
440de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
441de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
44276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" +
44376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_BACK) + " new=" +
44476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_IN_BACK));
445de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStackState = STACK_STATE_HOME_IN_BACK;
446de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                break;
447de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
44876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" +
44976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_FRONT) + " new=" +
45076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_IN_FRONT));
451de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStackState = STACK_STATE_HOME_IN_FRONT;
452de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                break;
453de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
454de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
455de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
456de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
457de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesVisible() {
458de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
459de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
460de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityRecord r = stack.mResumedActivity;
461de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r != null && (!r.nowVisible || r.waitingVisible)) {
462de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return false;
463de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
464de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
465de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
466de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
467de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
468cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    boolean pauseBackStacks(boolean userLeaving) {
469cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        boolean someActivityPaused = false;
470cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
471cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
472cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (!isFrontStack(stack) && stack.mResumedActivity != null) {
473ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack +
474ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        " mResumedActivity=" + stack.mResumedActivity);
475cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                stack.startPausingLocked(userLeaving, false);
476cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                someActivityPaused = true;
477cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
478cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
479cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        return someActivityPaused;
480cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
481cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
482de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allPausedActivitiesComplete() {
483ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        boolean pausing = true;
484de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
485de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
48669ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            final ActivityRecord r = stack.mPausingActivity;
48769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            if (r != null && r.state != ActivityState.PAUSED
48869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPED
48969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPING) {
490ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_STATES) {
491ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state);
492ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    pausing = false;
493ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                } else {
494ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    return false;
495ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
496de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
497de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
498ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return pausing;
499de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
500de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
501ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityVisibleLocked(ActivityRecord r) {
502858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
503ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            WaitResult w = mWaitingActivityVisible.get(i);
504ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = false;
505ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
506ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
507ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
508ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
509ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = w.totalTime;
510ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
511ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
512ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        dismissKeyguard();
513ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
514ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
515ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
516ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            long thisTime, long totalTime) {
517ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
518c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner            WaitResult w = mWaitingActivityLaunched.remove(i);
519ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = timeout;
520ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
521ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
522ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
523ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = thisTime;
524ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = totalTime;
525ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
526ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
527ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
528ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
52929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    ActivityRecord topRunningActivityLocked() {
5301602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        final ActivityStack focusedStack = getFocusedStack();
5311602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        ActivityRecord r = focusedStack.topRunningActivityLocked(null);
5321602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        if (r != null) {
5331602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            return r;
53429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
5351602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner
53629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
53729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
538ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (stack != focusedStack && isFrontStack(stack)) {
53929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                r = stack.topRunningActivityLocked(null);
54029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                if (r != null) {
54129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    return r;
54229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                }
54329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
54429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
54529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        return null;
54629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
54729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
54820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
54920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
55020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        ActivityRecord r = null;
55120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
55220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
55320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityRecord ar =
55420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    stack.getTasksLocked(maxNum - list.size(), receiver, pending, list);
555de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (isFrontStack(stack)) {
55620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                r = ar;
55720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
55820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
55920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return r;
56020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
56120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
56223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
56323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String profileFile, ParcelFileDescriptor profileFd, int userId) {
56423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
56523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
56623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
56723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
56823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
56923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
57023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
57123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
57223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
57323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
57423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
57523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
57623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
57723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
57823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
57923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
58023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
58123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
58223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
58323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
58423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
58523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
58623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
58723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
58823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
58923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
59023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
59123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
59223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
59323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
59423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
59523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
59623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
59723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
59823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (profileFile != null) {
59923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
60023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
60123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            profileFile, profileFd,
60223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
60323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
60423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
60523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
60623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
60723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
60823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
6092219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
610de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        moveHomeStack(true);
6116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0,
6122219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner                null, false, null);
6138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
61523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
61623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String callingPackage, Intent intent, String resolvedType, IBinder resultTo,
61723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String resultWho, int requestCode, int startFlags, String profileFile,
61823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
61923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
62023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
62123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
62223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
62323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
62423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
62523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
62623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
62723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
62823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
62923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
63023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
63123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                profileFile, profileFd, userId);
63223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
63323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
63423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
63523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
63623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
63723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
63823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = Binder.getCallingPid();
63923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingUid = Binder.getCallingUid();
64023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
64123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
64223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
64323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
644ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            final ActivityStack stack = getFocusedStack();
645de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            stack.mConfigWillChange = config != null
64623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
64723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
648de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    "Starting activity when config will change = " + stack.mConfigWillChange);
64923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
65023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
65123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
65223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
65323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
65423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
65523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
65623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
65723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
65823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
65923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
66023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingUid = callingUid;
66123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
66223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
66323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
66423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid = callerApp.info.uid;
66523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
66623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
66776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                                      + " (pid=" + callingPid + ") when starting: "
66823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
66923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
67023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
67123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
67223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
67323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
67423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
67523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
67623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
67723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
67823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
67923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
68023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
68123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
68223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
68323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
68423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
68523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
68623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
68723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
68823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
68923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
69023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
69123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
69223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
69323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
69423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
69523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
69623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
69723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
69823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
69923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
70023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
70123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
70223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
70323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
70423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
70523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
70623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
70723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
70823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
70923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
71023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
71123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
71223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
71323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
71423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
71523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
71623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
71723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
71823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
71923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
7206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int res = startActivityLocked(caller, intent, resolvedType,
72123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
72223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    callingPackage, startFlags, options, componentSpecified, null);
72323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
724de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (stack.mConfigWillChange) {
72523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
72623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
72723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
72823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
72923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
73023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
731de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stack.mConfigWillChange = false;
73223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
73323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
73423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
73523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
73623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
73723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
73823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
73923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
74023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
74123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
742ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWaitingActivityLaunched.add(outResult);
74323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
74423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
74523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
74623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
74723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
74823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
74923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
750de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityRecord r = stack.topRunningActivityLocked(null);
75123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (r.nowVisible) {
75223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
75323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
75423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
75523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
75623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
75723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
758ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                        mWaitingActivityVisible.add(outResult);
75923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
76023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
76223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
76323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
76523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
76623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
77123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
77623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
77923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
78323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
78423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
78523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
78723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
79223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
79723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
79823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
79976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                ActivityRecord[] outActivity = new ActivityRecord[1];
80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
80623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
80723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
80823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
80923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
81023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
81123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
81323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
81423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
81523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
81623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
81723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
81823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, null, null, userId);
81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
82023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
82223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
82423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
82723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
82923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
83123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
83223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
83323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
83423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
8356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
83623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage,
83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, theseOptions, componentSpecified, outActivity);
83823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
83923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
84023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
84123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
84223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
84523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
84623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
84723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
84823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
84923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
85023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
85123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
8522420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
8532420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ProcessRecord app, boolean andResume, boolean checkConfig)
8542420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
8552420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8562420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
857ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager.setAppVisibility(r.appToken, true);
8582420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8592420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
8602420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
8612420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8622420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
8632420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
8642420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
8652420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
8662420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
8672420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
8682420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
869ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            Configuration config = mWindowManager.updateOrientationFromAppTokens(
8702420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
8712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
8722420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
8732420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
8742420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8752420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
8762420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
8772420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
8782420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
8792420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8802420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
8812420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8822420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
8832420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
8842420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
8852420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
8862420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mService.updateLruProcessLocked(app, true);
8872420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8882420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
8892420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
8902420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
8912420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
8922420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8932420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
8942420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<Intent> newIntents = null;
8952420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
8962420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
8972420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
8982420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8992420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
9002420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
9012420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
9022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
9032420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
9042420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
9052420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
9062420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
9072420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
908ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (r.isHomeActivity() && r.isNotResolverActivity()) {
9094ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                // Home process is the root process of the task.
9104ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                mService.mHomeProcess = r.task.mActivities.get(0).app;
9112420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9122420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
9132420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
9142420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
9152420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
9162420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
9172420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
9182420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
9192420ead0326bfd2587da6231be419e758dba1930Craig Mautner            boolean profileAutoStop = false;
9202420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
9212420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
9222420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
9232420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
9242420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
9252420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop = mService.mAutoStopProfiler;
9262420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
9272420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9282420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
9292420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
9302420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
9312420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
9322420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
9332420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
9342420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
9352420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
9362420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
9372420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
9382420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
9392420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
9402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
9412420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
9422420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
943a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);
9442420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
9452420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    System.identityHashCode(r), r.info,
946a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    new Configuration(mService.mConfiguration), r.compat,
947a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    app.repProcState, r.icicle, results, newIntents, !andResume,
9482420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.isNextTransitionForward(), profileFile, profileFd,
9492420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop);
9502420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9512420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
9522420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
9532420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
9542420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
9552420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
9562420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
9572420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
9582420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
9592420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
9602420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
9612420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
9622420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
9632420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
9642420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
9652420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
9662420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
9672420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
9682420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
9692420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9702420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9712420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
9722420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
9732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
9742420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
9752420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
9762420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
9772420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
9782420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.appDiedLocked(app, app.pid, app.thread);
9792420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
9802420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
9812420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
9822420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9832420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9842420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
9852420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
9862420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
9872420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
9882420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9892420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9902420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
9912420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
9922420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
9932420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
9942420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9952420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9962420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
9972420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
9982420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
9992420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
10002420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
10012420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
10022420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
10032420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
10042420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
10052420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
10062420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
10072420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
10082420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
10092420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10102420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
10122420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
10132420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
10142420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
1015de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (isFrontStack(stack)) {
10162420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
10172420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10182420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10192420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
10202420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
10212420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1022e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
1023e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            boolean andResume, boolean checkConfig) {
1024e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
1025e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
1026e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                r.info.applicationInfo.uid);
1027e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1028e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
1029e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1030e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
1031e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
1032d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                app.addPackage(r.info.packageName, mService.mProcessStats);
1033e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                realStartActivityLocked(r, app, andResume, checkConfig);
1034e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
1035e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
1036e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
1037e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
1038e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
1039e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1040e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
1041e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
1042e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
1043e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1044e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
1045e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                "activity", r.intent.getComponent(), false, false);
1046e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
1047e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
10486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
10496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
10506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String resultWho, int requestCode,
10516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options,
10526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            boolean componentSpecified, ActivityRecord[] outActivity) {
10536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
10546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
10566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
10576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
10586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
10596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
10606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
10616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
10626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
10636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
10646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
10656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
10666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
10706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
10716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
10726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
10736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
10766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
10776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
10786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
10796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
10806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
10816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
10826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
10836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
10846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
10856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
10886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int launchFlags = intent.getFlags();
10906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
10926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                && sourceRecord != null) {
10936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
10946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
10956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
10966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
10976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
10986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
11006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
11016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
11026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
11036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
11046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord.removeResultsLocked(
11056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    sourceRecord, resultWho, requestCode);
11066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
11106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
11116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
11126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
11136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
11166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
11176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
11186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
11196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
11226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
11236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
11246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
11256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
11266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
11286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
11296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
11306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
11336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
11346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
11356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
11366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
11376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
11386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
11396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
11406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
11416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
11436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
11446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
11456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
11466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
11476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
11486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
11496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
11506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
11516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
11526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
11536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
11546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
11566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
11576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1159dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
1160b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver                callingPid, resolvedType, aInfo.applicationInfo);
11615e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver
11626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
11636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
11646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
11656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
11666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
11675e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                abort |= !mService.mController.activityStarting(watchIntent,
11686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
11696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
11706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
11716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11725e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        }
11736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11745e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        if (abort) {
11755e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            if (resultRecord != null) {
11765e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
11776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
11786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11795e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // We pretend to the caller that it was really started, but
11805e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // they will just get a cancel result.
11815e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            setDismissKeyguard(false);
11825e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            ActivityOptions.abort(options);
11835e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            return ActivityManager.START_SUCCESS;
11846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
11876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                intent, resolvedType, aInfo, mService.mConfiguration,
1188de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resultRecord, resultWho, requestCode, componentSpecified, this);
11896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
11906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
11916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1193ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = getFocusedStack();
1194de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.mResumedActivity == null
1195de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                || stack.mResumedActivity.info.applicationInfo.uid != callingUid) {
11966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
11976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
1198de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, stack);
11996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mPendingActivityLaunches.add(pal);
12006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                setDismissKeyguard(false);
12016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
12026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
12036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
12076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
12086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
12096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
12106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
12116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
12126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
12136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
12146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
12156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        mService.doPendingActivityLaunchesLocked(false);
12186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options);
1220de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.mPausingActivity == null) {
12216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Someone asked to have the keyguard dismissed on the next
12226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
12236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
12246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
12256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            dismissKeyguard();
12266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
12286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
12296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1230ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityStack adjustStackFocus(ActivityRecord r) {
12311d001b670e34fe887488047f525a5430154626e1Craig Mautner        final TaskRecord task = r.task;
12321d001b670e34fe887488047f525a5430154626e1Craig Mautner        if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) {
1233ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (task != null) {
1234ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (mFocusedStack != task.stack) {
1235ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1236ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                            "adjustStackFocus: Setting focused stack to r=" + r + " task=" + task);
1237ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    mFocusedStack = task.stack;
1238ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                } else {
1239ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1240ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        "adjustStackFocus: Focused stack already=" + mFocusedStack);
1241858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                }
1242ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                return mFocusedStack;
1243858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1244ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1245ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (mFocusedStack != null) {
1246ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1247ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        "adjustStackFocus: Have a focused stack=" + mFocusedStack);
1248ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                return mFocusedStack;
1249de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
1250ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1251ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            for (int stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) {
1252ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                ActivityStack stack = mStacks.get(stackNdx);
1253ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (!stack.isHomeStack()) {
1254ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1255ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                            "adjustStackFocus: Setting focused stack=" + stack);
1256ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    mFocusedStack = stack;
1257ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    return mFocusedStack;
1258ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
12591d001b670e34fe887488047f525a5430154626e1Craig Mautner            }
1260ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1261ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            // Time to create the first app stack for this user.
1262ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            int stackId = mService.createStack(-1, HOME_STACK_ID,
1263ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                StackBox.TASK_STACK_GOES_OVER, 1.0f);
1264ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
1265ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    " stackId=" + stackId);
1266ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            mFocusedStack = getStack(stackId);
126729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return mFocusedStack;
1268de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1269de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return mHomeStack;
1270de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
1271de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
127229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    void setFocusedStack(ActivityRecord r) {
127329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        if (r == null) {
127429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return;
127529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
127686d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner        if (!r.isApplicationActivity() || (r.task != null && !r.task.isApplicationTask())) {
127729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_FRONT) {
1278e7c58b6d7d761b93e785b0a399e5b00fdb82f4ceCraig Mautner                if (DEBUG_STACK || DEBUG_FOCUS) Slog.d(TAG, "setFocusedStack: mStackState old=" +
127976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(mStackState) + " new=" +
128076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_FRONT) +
128176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        " Callers=" + Debug.getCallers(3));
128229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_FRONT;
128329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
128429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        } else {
1285ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1286ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    "setFocusedStack: Setting focused stack to r=" + r + " task=" + r.task +
1287ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    " Callers=" + Debug.getCallers(3));
128829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            mFocusedStack = r.task.stack;
128929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_BACK) {
129076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" +
129176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(mStackState) + " new=" +
129276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_BACK) +
129376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        " Callers=" + Debug.getCallers(3));
129429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_BACK;
129529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
129629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
129729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
129829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
12998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    final int startActivityUncheckedLocked(ActivityRecord r,
13008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord sourceRecord, int startFlags, boolean doResume,
13018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Bundle options) {
13028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final Intent intent = r.intent;
13038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final int callingUid = r.launchedFromUid;
13048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        int launchFlags = intent.getFlags();
13068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // We'll invoke onUserLeaving before onPause only if the launching
13088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // activity did not explicitly state that this is an automated launch.
1309de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
1310de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving);
13118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the caller has asked not to resume at this point, we make note
13138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // of this in the record so that we can skip it when trying to find
13148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // the top running activity.
13158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (!doResume) {
13168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.delayedResume = true;
13178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
13208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the onlyIfNeeded flag is set, then we can do this if the activity
13228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // being launched is the same as the one making the call...  or, as
13238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // a special case, if we do not know the caller then we count the
13248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // current top activity as the caller.
13258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
13268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord checkedCaller = sourceRecord;
13278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (checkedCaller == null) {
1328ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop);
13298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!checkedCaller.realActivity.equals(r.realActivity)) {
13318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // Caller is not the same as launcher, so always needed.
13328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
13338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (sourceRecord == null) {
13378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This activity is not being started from another...  in this
13388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // case we -always- start a new task.
13398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
134029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
134129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
13428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
13438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
13458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The original activity who is starting us is running as a single
13468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // instance...  this new activity it is starting must go on its
13478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // own task.
13488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
13498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
13508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
13518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The activity being started is a single instance...  it always
13528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // gets launched into its own task.
13538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
13548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1356de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack sourceStack;
1357525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner        TaskRecord sourceTask;
1358de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (sourceRecord != null) {
1359de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceTask = sourceRecord.task;
1360de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = sourceTask.stack;
1361de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        } else {
1362de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceTask = null;
1363de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = null;
1364de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1365de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
13668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
13678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // For whatever reason this activity is being launched into a new
13688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // task...  yet the caller has requested a result back.  Well, that
13698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // is pretty messed up, so instead immediately send back a cancel
13708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // and let the new task continue launched as normal without a
13718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // dependency on its originator.
13728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
13738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo.task.stack.sendActivityResultLocked(-1,
13748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    r.resultTo, r.resultWho, r.requestCode,
13758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                Activity.RESULT_CANCELED, null);
13768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo = null;
13778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean addingToTask = false;
13808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean movedHome = false;
13818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        TaskRecord reuseTask = null;
1382de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityStack targetStack;
13838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
13848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
13858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
13868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
13878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If bring to front is requested, and no result is requested, and
13888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // we can find a task that was started with this same
13898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // component, then instead of launching bring that one to the front.
13908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo == null) {
13918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // See if there is a task to bring to the front.  If this is
13928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // a SINGLE_INSTANCE activity, there can be one and only one
13938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // instance of it in the history, and it is always in its own
13948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // unique task, so we do a special search.
13958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
1396ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        ? findTaskLocked(r)
13978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        : findActivityLocked(intent, r.info);
13988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (intentActivity != null) {
139929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null) {
140029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        r.task = intentActivity.task;
140129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    }
14028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack = intentActivity.task.stack;
14030f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
1404de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    moveHomeStack(targetStack.isHomeStack());
14058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (intentActivity.task.intent == null) {
14068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // This task was started because of movement of
14078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the activity based on affinity...  now that we
14088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // are actually launching it, we can assign the
14098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // base intent.
14108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(intent, r.info);
14118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the target task is not in the front, then we need
14138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to bring it to the front...  except...  well, with
14148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
14158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to have the same behavior as if a new instance was
14168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // being started, which means not bringing it to the front
14178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // if the caller is not itself in the front.
1418165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    final ActivityStack lastStack = getLastStack();
1419165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    ActivityRecord curTop = lastStack == null?
1420165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                            null : lastStack.topRunningNonDelayedActivityLocked(notTop);
14217504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                    if (curTop != null && (curTop.task != intentActivity.task ||
14227504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                            curTop.task != lastStack.topTask())) {
14238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
1424d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                        if (sourceRecord == null || (sourceStack.topActivity() != null &&
1425d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                                sourceStack.topActivity().task == sourceRecord.task)) {
14268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // We really do want to push this one into the
14278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // user's face, right now.
14288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            movedHome = true;
1429de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            if ((launchFlags &
143029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
143129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
1432e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner                                // Caller wants to appear on home activity.
1433ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                                intentActivity.task.mOnTopOfHome = true;
1434de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            }
14358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            targetStack.moveTaskToFrontLocked(intentActivity.task, r, options);
14368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            options = null;
14378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
14388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the caller has requested that the target task be
14408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // reset, then do so.
14418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
14428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
14438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
14458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We don't need to start a new activity, and
14468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the client said not to do anything if that
14478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is the case, so this is it!  And for paranoia, make
14488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
14498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1450de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
145105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                            resumeTopActivitiesLocked(targetStack, null, options);
14528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
14538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
14548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
145529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
145629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
145729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
14588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
14598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags &
14618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
14628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
14638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The caller has requested to completely replace any
14648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task with its new activity.  Well that should
14658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // not be too hard...
14668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask = intentActivity.task;
14678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.performClearTaskLocked();
14688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.setIntent(r.intent, r.info);
14698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
14708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
14718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
14728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this situation we want to remove all activities
14738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from the task up to the one being started.  In most
14748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // cases this means we are resetting the task to its
14758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // initial state.
14768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ActivityRecord top =
14778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.performClearTaskLocked(r, launchFlags);
14788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (top != null) {
14798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (top.frontOfTask) {
14808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // Activity aliases may mean we use different
14818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intents for the top activity, so make sure
14828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the task now has the identity of the new
14838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intent.
14848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                top.task.setIntent(r.intent, r.info);
14858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
14868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
14878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    r, top.task);
14888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
14898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
14908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // A special case: we need to
14918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // start the activity because it is not currently
14928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // running, and the caller has asked to clear the
14938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // current task to have this activity at the top.
14948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
14958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // Now pretend like this activity is being started
14968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // by the top of its task, so it is put in the
14978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // right place.
14988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
14998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
15008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (r.realActivity.equals(intentActivity.task.realActivity)) {
15018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case the top activity on the task is the
15028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // same as the one being launched, so we take that
15038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // as a request to bring the task to the foreground.
15048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // If the top activity in the task is the root
15058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // activity, deliver this new intent to it if it
15068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // desires.
15078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
15088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
15098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                && intentActivity.realActivity.equals(r.realActivity)) {
15108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r,
15118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    intentActivity.task);
15128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (intentActivity.frontOfTask) {
15138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.setIntent(r.intent, r.info);
15148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
15158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            intentActivity.deliverNewIntentLocked(callingUid, r.intent);
15168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else if (!r.intent.filterEquals(intentActivity.task.intent)) {
15178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // In this case we are launching the root activity
15188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // of the task, but with a different intent.  We
15198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // should start a new instance on top.
15208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
15218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
15228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
15238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
15248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case an activity is being launched in to an
15258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task, without resetting that task.  This
15268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is typically the situation of launching an activity
15278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from a notification or shortcut.  We want to place
15288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the new activity on top of the current task.
15298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        addingToTask = true;
15308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        sourceRecord = intentActivity;
15318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (!intentActivity.task.rootWasReset) {
15328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case we are launching in to an existing task
15338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // that has not yet been started from its front door.
15348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The current task has been brought to the front.
15358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // Ideally, we'd probably like to place this new task
15368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // at the bottom of its stack, but that's a little hard
15378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // to do with the current organization of the code so
15388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // for now we'll just drop it.
15398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(r.intent, r.info);
15408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (!addingToTask && reuseTask == null) {
15428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We didn't do anything...  but it was needed (a.k.a., client
15438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // don't use that intent!)  And for paranoia, make
15448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
15458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1546e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner                            // Reset flag so it gets correctly reevaluated.
1547ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                            intentActivity.task.mOnTopOfHome = false;
1548de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            setLaunchHomeTaskNextFlag(sourceRecord, intentActivity, targetStack);
1549de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            targetStack.resumeTopActivityLocked(null, options);
15508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
15518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
15528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
155329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
155429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            "startActivityUncheckedLocked: task left null",
155529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            new RuntimeException("here").fillInStackTrace());
15568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_TASK_TO_FRONT;
15578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
15598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
15618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //String uri = r.intent.toURI();
15638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Intent intent2 = new Intent(uri);
15648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "Given intent: " + r.intent);
15658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "URI is: " + uri);
15668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "To intent: " + intent2);
15678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.packageName != null) {
15698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If the activity being launched is the same as the one currently
15708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // at the top, then we need to check if it should only be launched
15718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // once.
1572ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ActivityStack topStack = getFocusedStack();
1573de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop);
15748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (top != null && r.resultTo == null) {
15758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
15768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (top.app != null && top.app.thread != null) {
15778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
15798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
15808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top,
15818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    top.task);
15828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // For paranoia, make sure we have correctly
15838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // resumed the top activity.
15840f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                            topStack.mLastPausedActivity = null;
15858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (doResume) {
1586de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                setLaunchHomeTaskNextFlag(sourceRecord, null, topStack);
158705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                                resumeTopActivitiesLocked();
15888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
15898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
15908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
15918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // We don't need to start a new activity, and
15928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the client said not to do anything if that
15938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // is the case, so this is it!
159429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                if (r.task == null)  Slog.v(TAG,
159529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    "startActivityUncheckedLocked: task left null",
159629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    new RuntimeException("here").fillInStackTrace());
15978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
15988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
15998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
160029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            if (r.task == null)  Slog.v(TAG,
160129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
160229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
16038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            return ActivityManager.START_DELIVERED_TO_TOP;
16048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
16058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
16078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
16108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo != null) {
1611de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho,
1612de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.requestCode, Activity.RESULT_CANCELED, null);
16138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityOptions.abort(options);
161529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (r.task == null)  Slog.v(TAG,
161629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                "startActivityUncheckedLocked: task left null",
161729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                new RuntimeException("here").fillInStackTrace());
16188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            return ActivityManager.START_CLASS_NOT_FOUND;
16198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean newTask = false;
16228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean keepCurTransition = false;
16238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // Should this be considered a new task?
16258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo == null && !addingToTask
16268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1627ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            targetStack = adjustStackFocus(r);
1628de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
16298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (reuseTask == null) {
1630de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
1631de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        null, true);
1632de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
1633de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.task);
16348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else {
1635de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(reuseTask, reuseTask, true);
16368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            newTask = true;
16388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!movedHome) {
1639de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if ((launchFlags &
1640de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
1641de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
1642de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // Caller wants to appear on home activity, so before starting
1643de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // their own activity we will bring home to the front.
1644ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                    r.task.mOnTopOfHome = true;
1645de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
16468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord != null) {
1648525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            sourceTask = sourceRecord.task;
1649525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            targetStack = sourceTask.stack;
1650de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
16518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!addingToTask &&
16528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
16538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are adding the activity to an existing
16548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // task, but the caller has asked to clear that task if the
16558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // activity is already running.
1656525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags);
16578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                keepCurTransition = true;
16588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
16598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
16608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
16618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // For paranoia, make sure we have correctly
16628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // resumed the top activity.
16630f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
16648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
1665de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
16668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
16678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityOptions.abort(options);
166929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null)  Slog.v(TAG,
167029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "startActivityUncheckedLocked: task left null",
167129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        new RuntimeException("here").fillInStackTrace());
16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
16748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else if (!addingToTask &&
16758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
16768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are launching an activity in our own task
16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // that may already be running somewhere in the history, and
16788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // we want to shuffle it to the front of the stack if so.
1679525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r);
16808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
1681de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    final TaskRecord task = top.task;
1682de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    task.moveActivityToFrontLocked(top);
1683de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task);
16848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.updateOptionsLocked(options);
16858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
16860f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
16878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
1688de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
16898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
16908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
16928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
16938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // An existing activity is starting this new activity, so we want
16958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // to keep the new one in the same task as the one that is starting
16968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // it.
1697525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            r.setTask(sourceTask, sourceRecord.thumbHolder, false);
16988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
16998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in existing task " + r.task);
17008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
17028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This not being started from an existing activity, and not part
17038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // of a new task...  just put it in the top task, though these days
17048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // this case should never happen.
1705ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            targetStack = adjustStackFocus(r);
1706de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
17071602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            ActivityRecord prev = targetStack.topActivity();
1708de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            r.setTask(prev != null ? prev.task
1709de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
1710de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    null, true);
17118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
17128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in new guessed " + r.task);
17138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
17148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
17168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                intent, r.getUriPermissionsLocked());
17178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (newTask) {
17198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
17208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
17218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
1722de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        setLaunchHomeTaskNextFlag(sourceRecord, r, targetStack);
17230f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner        targetStack.mLastPausedActivity = null;
17248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
17251d001b670e34fe887488047f525a5430154626e1Craig Mautner        mService.setFocusedActivityLocked(r);
17268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return ActivityManager.START_SUCCESS;
17278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
17288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    void acquireLaunchWakelock() {
17307ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
17317ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
17327ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
17337ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.acquire();
17347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
17357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // To be safe, don't allow the wake lock to be held for too long.
17367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
17377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
17387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    }
17397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1740f333327782e14688e1c198c1192172d51308e90bCraig Mautner    // Checked.
1741f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
1742f333327782e14688e1c198c1192172d51308e90bCraig Mautner            Configuration config) {
1743f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
1744f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1745f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> stops = null;
1746f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> finishes = null;
1747f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<UserStartedState> startingUsers = null;
1748f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NS = 0;
1749f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NF = 0;
1750f333327782e14688e1c198c1192172d51308e90bCraig Mautner        IApplicationThread sendThumbnail = null;
1751f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean booting = false;
1752f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean enableScreen = false;
1753f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean activityRemoved = false;
1754f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1755f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord r = ActivityRecord.forToken(token);
1756f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (r != null) {
1757b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" +
1758b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner                    Debug.getCallers(4));
1759f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
1760f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r.finishLaunchTickingLocked();
17617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (fromTimeout) {
17627ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
17637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
1764f333327782e14688e1c198c1192172d51308e90bCraig Mautner
17657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // This is a hack to semi-deal with a race condition
17667ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // in the client where it can be constructed with a
17677ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // newer configuration from when we asked it to launch.
17687ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We'll update with whatever configuration it now says
17697ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // it used to launch.
17707ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (config != null) {
17717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                r.configuration = config;
17727ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
1773f333327782e14688e1c198c1192172d51308e90bCraig Mautner
17747ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We are now idle.  If someone is waiting for a thumbnail from
17757ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // us, we can now deliver.
17767ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            r.idle = true;
17777ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
17787ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
17797ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                sendThumbnail = r.app.thread;
17807ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                r.thumbnailNeeded = false;
17817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
17827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
17837ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
17847ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (!mService.mBooted && isFrontStack(r.task.stack)) {
17857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mBooted = true;
17867ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                enableScreen = true;
17877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
17887ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
17897ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
17907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (allResumedActivitiesIdle()) {
17917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (r != null) {
17927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.scheduleAppGcsLocked();
17937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
17947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
17957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
17967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
17977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER &&
17987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        Binder.getCallingUid() != Process.myUid()) {
17997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
1800f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
18017ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
1802f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
18037ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
1804f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1805f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1806f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Atomically retrieve all of the other things to do.
1807f333327782e14688e1c198c1192172d51308e90bCraig Mautner        stops = processStoppingActivitiesLocked(true);
1808f333327782e14688e1c198c1192172d51308e90bCraig Mautner        NS = stops != null ? stops.size() : 0;
1809f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if ((NF=mFinishingActivities.size()) > 0) {
1810f333327782e14688e1c198c1192172d51308e90bCraig Mautner            finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
1811f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mFinishingActivities.clear();
1812f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1813f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1814f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final ArrayList<ActivityRecord> thumbnails;
1815f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final int NT = mCancelledThumbnails.size();
1816f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (NT > 0) {
1817f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = new ArrayList<ActivityRecord>(mCancelledThumbnails);
1818f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mCancelledThumbnails.clear();
1819f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else {
1820f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = null;
1821f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1822f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1823f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (isFrontStack(mHomeStack)) {
1824f333327782e14688e1c198c1192172d51308e90bCraig Mautner            booting = mService.mBooting;
1825f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.mBooting = false;
1826f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1827f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1828f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mStartingUsers.size() > 0) {
1829f333327782e14688e1c198c1192172d51308e90bCraig Mautner            startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
1830f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mStartingUsers.clear();
1831f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1832f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1833f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Perform the following actions from unsynchronized state.
1834f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final IApplicationThread thumbnailThread = sendThumbnail;
1835f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.post(new Runnable() {
1836f333327782e14688e1c198c1192172d51308e90bCraig Mautner            @Override
1837f333327782e14688e1c198c1192172d51308e90bCraig Mautner            public void run() {
1838f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (thumbnailThread != null) {
1839f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    try {
1840f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        thumbnailThread.requestThumbnail(token);
1841f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    } catch (Exception e) {
1842f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
1843f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.sendPendingThumbnail(null, token, null, null, true);
1844f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
1845f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1846f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1847f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // Report back to any thumbnail receivers.
1848f333327782e14688e1c198c1192172d51308e90bCraig Mautner                for (int i = 0; i < NT; i++) {
1849f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    ActivityRecord r = thumbnails.get(i);
1850f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    mService.sendPendingThumbnail(r, null, null, null, true);
1851f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1852f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1853f333327782e14688e1c198c1192172d51308e90bCraig Mautner        });
1854f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1855f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Stop any activities that are scheduled to do so but have been
1856f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1857f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NS; i++) {
1858f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = stops.get(i);
1859f333327782e14688e1c198c1192172d51308e90bCraig Mautner            final ActivityStack stack = r.task.stack;
1860f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (r.finishing) {
1861f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
1862f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else {
1863f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.stopActivityLocked(r);
1864f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1865f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1866f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1867f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Finish any activities that are scheduled to do so but have been
1868f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1869f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NF; i++) {
1870f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = finishes.get(i);
1871f333327782e14688e1c198c1192172d51308e90bCraig Mautner            activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle");
1872f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1873f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1874f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (booting) {
1875f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.finishBooting();
1876f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else if (startingUsers != null) {
1877f333327782e14688e1c198c1192172d51308e90bCraig Mautner            for (int i = 0; i < startingUsers.size(); i++) {
1878f333327782e14688e1c198c1192172d51308e90bCraig Mautner                mService.finishUserSwitch(startingUsers.get(i));
1879f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1880f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1881f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1882f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mService.trimApplications();
1883f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //dump();
1884f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //mWindowManager.dump();
1885f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1886f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (enableScreen) {
1887f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.enableScreenAfterBoot();
1888f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1889f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1890f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (activityRemoved) {
189105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            resumeTopActivitiesLocked();
1892f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1893f333327782e14688e1c198c1192172d51308e90bCraig Mautner
18947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        return r;
1895f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
1896f333327782e14688e1c198c1192172d51308e90bCraig Mautner
18978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
18988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        // Just in case.
18998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
1901e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            mStacks.get(stackNdx).handleAppDiedLocked(app, restarting);
19028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
19068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.closeSystemDialogsLocked();
19108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
19148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
19158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
19168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
19178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
19188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
19228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                didSomething = true;
19238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
19248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
19268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1928a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    void updatePreviousProcessLocked(ActivityRecord r) {
1929a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now that this process has stopped, we may want to consider
1930a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // it to be the previous app to try to keep around in case
1931a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // the user wants to return to it.
1932a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
1933a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // First, found out what is currently the foreground app, so that
1934a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // we don't blow away the previous app if this activity is being
1935a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // hosted by the process that is actually still the foreground.
1936a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        ProcessRecord fgApp = null;
1937a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1938a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            final ActivityStack stack = mStacks.get(stackNdx);
1939a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            if (isFrontStack(stack)) {
1940a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                if (stack.mResumedActivity != null) {
1941a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    fgApp = stack.mResumedActivity.app;
1942a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                } else if (stack.mPausingActivity != null) {
1943a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    fgApp = stack.mPausingActivity.app;
1944a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                }
1945a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                break;
1946a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            }
1947a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
1948a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
1949a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now set this one as the previous process, only if that really
1950a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // makes sense to.
1951a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        if (r.app != null && fgApp != null && r.app != fgApp
1952a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
19534ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                && r.app != mService.mHomeProcess) {
1954a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcess = r.app;
1955a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
1956a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
1957a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    }
1958a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
195905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked() {
196005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return resumeTopActivitiesLocked(null, null, null);
196105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
196205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
196305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target,
196405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            Bundle targetOptions) {
196505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        if (targetStack == null) {
196605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            targetStack = getFocusedStack();
196705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        }
196805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        boolean result = false;
1969dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1970f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
1971f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            if (isFrontStack(stack)) {
197205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                if (stack == targetStack) {
197305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    result = stack.resumeTopActivityLocked(target, targetOptions);
197405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } else {
197505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    stack.resumeTopActivityLocked(null);
197605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                }
1977f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            }
19788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
197905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return result;
19808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
19838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.finishTopRunningActivityLocked(app);
19878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) {
19918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
19928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) {
19937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" +
19941d001b670e34fe887488047f525a5430154626e1Craig Mautner                        mStacks.get(stackNdx));
19958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return;
19968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
19978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2000967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ActivityStack getStack(int stackId) {
20018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
20028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
20038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.getStackId() == stackId) {
20048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return stack;
20058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
20088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2010967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ArrayList<ActivityStack> getStacks() {
2011967212cb542e6eeb308678367b53381bff984c31Craig Mautner        return new ArrayList<ActivityStack>(mStacks);
2012967212cb542e6eeb308678367b53381bff984c31Craig Mautner    }
2013967212cb542e6eeb308678367b53381bff984c31Craig Mautner
2014967212cb542e6eeb308678367b53381bff984c31Craig Mautner    int createStack() {
2015858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        while (true) {
2016858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (++mLastStackId <= HOME_STACK_ID) {
2017858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                mLastStackId = HOME_STACK_ID + 1;
2018858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
2019858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (getStack(mLastStackId) == null) {
2020858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                break;
20218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2023858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId));
2024858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        return mLastStackId;
20258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
2028b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        final TaskRecord task = anyTaskForIdLocked(taskId);
2029b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        if (task == null) {
2030b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner            return;
2031b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        }
20328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
20338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
20348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
20358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
20368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2037b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        removeTask(task);
2038b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        stack.addTask(task, toTop);
2039b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        mWindowManager.addTask(taskId, stackId, toTop);
204005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        resumeTopActivitiesLocked();
20418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2043ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityRecord findTaskLocked(ActivityRecord r) {
20448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2045ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2046ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (!r.isApplicationActivity() && !stack.isHomeStack()) {
2047ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                continue;
2048ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            }
2049ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            final ActivityRecord ar = stack.findTaskLocked(r);
20508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
20518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
20528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
20548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
20558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
20568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
20578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
20588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
20598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            final ActivityRecord ar = mStacks.get(stackNdx).findActivityLocked(intent, info);
20608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
20618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
20628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
20638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
20648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
20658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
20668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
20678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
20680eea92c67b292b005c152641a12b920fe145826cCraig Mautner        scheduleSleepTimeout();
20690eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mGoingToSleep.isHeld()) {
20700eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.acquire();
20717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
20727ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
20737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
20740eea92c67b292b005c152641a12b920fe145826cCraig Mautner                }
20757ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
20767ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
20770eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
20788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
20828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean timedout = false;
20830eea92c67b292b005c152641a12b920fe145826cCraig Mautner        goingToSleepLocked();
20840eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
20850eea92c67b292b005c152641a12b920fe145826cCraig Mautner
20860eea92c67b292b005c152641a12b920fe145826cCraig Mautner        final long endTime = System.currentTimeMillis() + timeout;
20870eea92c67b292b005c152641a12b920fe145826cCraig Mautner        while (true) {
20880eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean cantShutdown = false;
20890eea92c67b292b005c152641a12b920fe145826cCraig Mautner            for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
20900eea92c67b292b005c152641a12b920fe145826cCraig Mautner                cantShutdown |= mStacks.get(stackNdx).checkReadyForSleepLocked();
20910eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
20920eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (cantShutdown) {
20930eea92c67b292b005c152641a12b920fe145826cCraig Mautner                long timeRemaining = endTime - System.currentTimeMillis();
20940eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (timeRemaining > 0) {
20958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
20960eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        mService.wait(timeRemaining);
20978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
20988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
20990eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } else {
21000eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    Slog.w(TAG, "Activity manager shutdown timed out");
21010eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    timedout = true;
21020eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    break;
21038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
21040eea92c67b292b005c152641a12b920fe145826cCraig Mautner            } else {
21050eea92c67b292b005c152641a12b920fe145826cCraig Mautner                break;
21068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21080eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21090eea92c67b292b005c152641a12b920fe145826cCraig Mautner        // Force checkReadyForSleep to complete.
21100eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = true;
21110eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
21120eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
21148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
21168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
21170eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
21180eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
21190eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
21200eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
2121ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2123ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            stack.awakeFromSleepingLocked();
2124ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (isFrontStack(stack)) {
212505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                resumeTopActivitiesLocked();
2126de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
21278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21280eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.clear();
21290eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
21300eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21310eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void activitySleptLocked(ActivityRecord r) {
21320eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.remove(r);
21330eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
21340eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
21350eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21360eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void checkReadyForSleepLocked() {
21370eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mService.isSleepingOrShuttingDown()) {
21380eea92c67b292b005c152641a12b920fe145826cCraig Mautner            // Do not care.
21390eea92c67b292b005c152641a12b920fe145826cCraig Mautner            return;
21400eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
21410eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21420eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mSleepTimeout) {
21430eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean dontSleep = false;
21440eea92c67b292b005c152641a12b920fe145826cCraig Mautner            for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21450eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep |= mStacks.get(stackNdx).checkReadyForSleepLocked();
21460eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
21470eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21480eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mStoppingActivities.size() > 0) {
21490eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to stop; can't sleep yet.
21500eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
21510eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mStoppingActivities.size() + " activities");
21520eea92c67b292b005c152641a12b920fe145826cCraig Mautner                scheduleIdleLocked();
21530eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
21540eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
21550eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21560eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mGoingToSleepActivities.size() > 0) {
21570eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to sleep; can't sleep yet.
21580eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
21590eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mGoingToSleepActivities.size() + " activities");
21600eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
21610eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
21620eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21630eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (dontSleep) {
21640eea92c67b292b005c152641a12b920fe145826cCraig Mautner                return;
21650eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
21660eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
21670eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21680eea92c67b292b005c152641a12b920fe145826cCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21690eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mStacks.get(stackNdx).goToSleep();
21700eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
21710eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21720eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
21730eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21740eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
21750eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
21760eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
21770eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mService.mShuttingDown) {
21780eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mService.notifyAll();
21790eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
21808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2182ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean reportResumedActivityLocked(ActivityRecord r) {
2183ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = r.task.stack;
2184ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (isFrontStack(stack)) {
21855782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey            mService.updateUsageStats(r, true);
2186ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2187ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (allResumedActivitiesComplete()) {
2188ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
2189ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.executeAppTransition();
2190ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return true;
2191ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2192ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return false;
2193ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2194ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
21958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
21968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
21978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
21988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
21998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.handleAppCrashLocked(app);
22008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2203de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
2204580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // First the front stacks. In case any are not fullscreen and are in front of home.
2205580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        boolean showHomeBehindStack = false;
2206de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2207580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2208580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (isFrontStack(stack)) {
2209580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                showHomeBehindStack =
2210580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                        stack.ensureActivitiesVisibleLocked(starting, configChanges);
2211580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
2212580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        }
2213580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // Now do back stacks.
2214580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2215580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2216580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (!isFrontStack(stack)) {
2217580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                stack.ensureActivitiesVisibleLocked(starting, configChanges, showHomeBehindStack);
2218580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
22198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
22228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
22238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
22248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
22258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
22268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.scheduleDestroyActivities(app, false, reason);
22278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
22308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
22312420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
2232ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
2233ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        final String homePackageName = mService.getHomePackageName();
2234ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        if (homePackageName != null) {
2235ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            setHomePackageName(mCurrentUser, homePackageName);
22368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2237858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2238858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStartingUsers.add(uss);
2239ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        boolean haveActivities = false;
2240ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2241ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            haveActivities |= mStacks.get(stackNdx).switchUserLocked(userId);
2242ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        }
2243858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2244858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        resumeTopActivitiesLocked();
2245858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
22468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return haveActivities;
22472219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
22482219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
2249de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
2250de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        int N = mStoppingActivities.size();
2251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (N <= 0) return null;
2252de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2253de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ArrayList<ActivityRecord> stops = null;
2254de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2255de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean nowVisible = allResumedActivitiesVisible();
2256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int i=0; i<N; i++) {
2257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord s = mStoppingActivities.get(i);
2258de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
2259de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + nowVisible + " waitingVisible=" + s.waitingVisible
2260de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + " finishing=" + s.finishing);
2261de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (s.waitingVisible && nowVisible) {
2262de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mWaitingVisibleActivities.remove(s);
2263de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                s.waitingVisible = false;
2264de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (s.finishing) {
2265de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // If this activity is finishing, it is sitting on top of
2266de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // everyone else but we now know it is no longer needed...
2267de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // so get rid of it.  Otherwise, we need to go through the
2268de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // normal flow and hide it once we determine that it is
2269de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // hidden by the activities in front of it.
2270de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
2271ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWindowManager.setAppVisibility(s.appToken, false);
2272de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2273de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2274de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) {
2275de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
2276de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (stops == null) {
2277de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    stops = new ArrayList<ActivityRecord>();
2278de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2279de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stops.add(s);
2280de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStoppingActivities.remove(i);
2281de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                N--;
2282de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                i--;
2283de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2284de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2285de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2286de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return stops;
2287de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
2288de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2289cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    void validateTopActivitiesLocked() {
2290cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2291cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2292cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityRecord r = stack.topRunningActivityLocked(null);
2293f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner            final ActivityState state = r == null ? ActivityState.DESTROYED : r.state;
2294cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (isFrontStack(stack)) {
2295cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r == null) {
2296cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: null top activity, stack=" + stack);
2297cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                } else {
2298f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    final ActivityRecord pausing = stack.mPausingActivity;
2299f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (pausing != null && pausing == r) {
2300cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r +
2301f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
2302cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2303f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) {
2304cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r +
2305f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                                " state=" + state);
2306cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2307cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2308cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            } else {
2309f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                final ActivityRecord resumed = stack.mResumedActivity;
2310f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (resumed != null && resumed == r) {
2311cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r +
2312f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        " state=" + state);
2313cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2314f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (r != null && (state == ActivityState.INITIALIZING
2315f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        || state == ActivityState.RESUMED)) {
2316cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: activity in back resumed r=" + r +
2317f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
2318cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2319cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
2320cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
2321cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
2322cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
232376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner    private static String stackStateToString(int stackState) {
232476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner        switch (stackState) {
232576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_IN_FRONT: return "STACK_STATE_HOME_IN_FRONT";
232676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_TO_BACK: return "STACK_STATE_HOME_TO_BACK";
232776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_IN_BACK: return "STACK_STATE_HOME_IN_BACK";
232876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_TO_FRONT: return "STACK_STATE_HOME_TO_FRONT";
232976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            default: return "Unknown stackState=" + stackState;
233076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner        }
233176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner    }
233276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner
2333270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
2334270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:");
2335270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner                pw.println(mDismissKeyguardOnNextActivity);
233676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner        pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState));
23377ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        pw.print(prefix); pw.println("mSleepTimeout: " + mSleepTimeout);
23387ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        pw.print(prefix); pw.println("mCurTaskId: " + mCurTaskId);
2339ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        pw.print(prefix); pw.print("mHomePackageNames:");
2340ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                for (int i = 0; i < mHomePackageNames.size(); ++i) {
2341ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    pw.print(" ("); pw.print(mHomePackageNames.keyAt(i)); pw.print(",");
2342ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    pw.print(mHomePackageNames.valueAt(i)); pw.print(")");
2343ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
2344ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                pw.println();
2345270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
23468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
234720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
2348ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack().getDumpActivitiesLocked(name);
234920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
235020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
2351390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage,
2352390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            boolean needSep, String prefix) {
2353390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        if (activity != null) {
2354390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (dumpPackage == null || dumpPackage.equals(activity.packageName)) {
2355390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                if (needSep) {
2356390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    pw.println();
2357390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                }
2358390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.print(prefix);
2359390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println(activity);
23607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                return true;
2361390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
2362390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        }
23637ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return false;
2364390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    }
2365390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn
23668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
23678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
23687ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean printed = false;
23697ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean needSep = false;
23708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
23718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
23728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
23737ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            StringBuilder stackHeader = new StringBuilder(128);
23747ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            stackHeader.append("  Stack #");
23757ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            stackHeader.append(mStacks.indexOf(stack));
23767ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            stackHeader.append(":");
23777ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, needSep,
23787ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    stackHeader.toString());
23797ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, "    ", "Run", false, !dumpAll,
23807ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    false, dumpPackage, true, "    Running activities (most recent first):", null);
23817ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn
23827ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            needSep = printed;
23837ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep,
2384390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    "    mPausingActivity: ");
23857ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (pr) {
23867ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                printed = true;
23877ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                needSep = false;
23887ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
23897ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep,
2390390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    "    mResumedActivity: ");
23917ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (pr) {
23927ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                printed = true;
23937ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                needSep = false;
23947ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
23958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpAll) {
23967ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep,
2397390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                        "    mLastPausedActivity: ");
23987ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                if (pr) {
23997ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    printed = true;
24000f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    needSep = true;
24017ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                }
24020f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage,
24030f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                        needSep, "    mLastNoHistoryActivity: ");
24048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
24057ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            needSep = printed;
24068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
24078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
24087ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mFinishingActivities, "  ", "Fin", false, !dumpAll,
24097ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to finish:", null);
24107ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mStoppingActivities, "  ", "Stop", false, !dumpAll,
24117ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to stop:", null);
24127ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, "  ", "Wait", false, !dumpAll,
24137ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting for another to become visible:",
24147ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                null);
24157ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
24167ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
24177ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
24187ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
2419de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
24207ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return printed;
24218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2423390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
24248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
24257ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            String dumpPackage, boolean needNL, String header1, String header2) {
24268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
2427390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String innerPrefix = null;
2428390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String[] args = null;
2429390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        boolean printed = false;
24308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
24318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
24328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
24338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
24348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
2435390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (innerPrefix == null) {
2436390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                innerPrefix = prefix + "      ";
2437390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                args = new String[0];
2438390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
2439390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            printed = true;
24408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
24418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
2442390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println("");
24438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
24448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
24457ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header1 != null) {
24467ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header1);
24477ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header1 = null;
24487ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
24497ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header2 != null) {
24507ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header2);
24517ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header2 = null;
2452390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
24538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
24548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
24558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
24568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
24578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
24588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
24598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
24608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
24618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
24628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
24638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
24648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
24658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
24668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
24678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
24688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
24698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
24708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
24718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
24728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
24738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
24748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
24758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
24768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
24778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
24788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
24798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
24808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
24818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
24828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
24838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
24848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
24858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
24868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
24878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
24888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
24898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
24908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
24918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
24928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
24938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
24948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
24958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
24968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
24978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
24988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
24998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
25008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
25018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
25028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2503390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        return printed;
25048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2505ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2506f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void scheduleIdleTimeoutLocked(ActivityRecord next) {
2507b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4));
2508c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
2509c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
2510f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2511f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2512f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final void scheduleIdleLocked() {
251305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(IDLE_NOW_MSG);
2514f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2515f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2516f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void removeTimeoutsForActivityLocked(ActivityRecord r) {
2517b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4));
2518f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
2519f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2520f333327782e14688e1c198c1192172d51308e90bCraig Mautner
252105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    final void scheduleResumeTopActivities() {
252205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
252305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
252405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
25250eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void removeSleepTimeouts() {
25260eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = false;
25270eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
25280eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
25290eea92c67b292b005c152641a12b920fe145826cCraig Mautner
25300eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final void scheduleSleepTimeout() {
25310eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
25320eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT);
25330eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
25340eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2535ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    private final class ActivityStackSupervisorHandler extends Handler {
2536f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2537ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public ActivityStackSupervisorHandler(Looper looper) {
2538ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            super(looper);
2539ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2540ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2541f333327782e14688e1c198c1192172d51308e90bCraig Mautner        void activityIdleInternal(ActivityRecord r) {
2542f333327782e14688e1c198c1192172d51308e90bCraig Mautner            synchronized (mService) {
2543f333327782e14688e1c198c1192172d51308e90bCraig Mautner                activityIdleInternalLocked(r != null ? r.appToken : null, true, null);
2544f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
25457ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
25467ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2547ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        @Override
2548ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public void handleMessage(Message msg) {
2549ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            switch (msg.what) {
2550f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_TIMEOUT_MSG: {
25515eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
2552f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    if (mService.mDidDexOpt) {
2553f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.mDidDexOpt = false;
2554f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
2555f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        nmsg.obj = msg.obj;
2556f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
2557f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        return;
2558f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
2559f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // We don't at this point know if the activity is fullscreen,
2560f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // so we need to be conservative and assume it isn't.
2561f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2562f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
2563f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_NOW_MSG: {
25645eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
2565f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2566f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
256705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                case RESUME_TOP_ACTIVITY_MSG: {
256805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    synchronized (mService) {
256905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                        resumeTopActivitiesLocked();
257005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    }
257105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } break;
25720eea92c67b292b005c152641a12b920fe145826cCraig Mautner                case SLEEP_TIMEOUT_MSG: {
25730eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    synchronized (mService) {
25740eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        if (mService.isSleepingOrShuttingDown()) {
25750eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
25760eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            mSleepTimeout = true;
25770eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            checkReadyForSleepLocked();
25780eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        }
25790eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    }
25800eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } break;
25817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                case LAUNCH_TIMEOUT_MSG: {
25827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    if (mService.mDidDexOpt) {
25837ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mService.mDidDexOpt = false;
25847ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
25857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        return;
25867ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
25877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    synchronized (mService) {
25887ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        if (mLaunchingActivity.isHeld()) {
25897ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
25907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            if (VALIDATE_WAKE_LOCK_CALLER
25917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                    && Binder.getCallingUid() != Process.myUid()) {
25927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                throw new IllegalStateException("Calling must be system uid");
25937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            }
25947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            mLaunchingActivity.release();
25957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        }
25967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
25977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                } break;
2598ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
2599ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2600ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2601858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2602ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    String getHomePackageName() {
2603ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return mHomePackageNames.get(mCurrentUser);
2604ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    }
2605858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2606ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    void setHomePackageName(int userId, String homePackageName) {
2607ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        if (DEBUG_SWITCH) Slog.d(TAG, "setHomePackageName: user=" + userId + " package="
2608ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                + homePackageName);
2609ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        mHomePackageNames.put(userId, homePackageName);
2610858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    }
2611270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
2612