ActivityStackSupervisor.java revision 93529a475e4935aa78599556a5c1a18d9425d8c2
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
7393529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautnerimport android.util.SparseBooleanArray;
7423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
75cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe;
766170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
772420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
78de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport com.android.server.wm.StackBox;
79ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService;
8023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
83270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
842219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
86270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
87be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornpublic final class ActivityStackSupervisor {
88de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG = ActivityManagerService.DEBUG || false;
89de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_ADD_REMOVE = DEBUG || false;
90de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_APP = DEBUG || false;
91de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_SAVED_STATE = DEBUG || false;
92b3370cec719ccfe09c9fc83edc2dd2f833df3945Craig Mautner    static final boolean DEBUG_STATES = DEBUG || true;
93b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner    static final boolean DEBUG_IDLE = DEBUG || false;
942420ead0326bfd2587da6231be419e758dba1930Craig Mautner
952219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
96270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
97f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** How long we wait until giving up on the last activity telling us it is idle. */
98f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_TIMEOUT = 10*1000;
99f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1000eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** How long we can hold the sleep wake lock before giving up. */
1010eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT = 5*1000;
1020eea92c67b292b005c152641a12b920fe145826cCraig Mautner
1037ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // How long we can hold the launch wake lock before giving up.
1047ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT = 10*1000;
1057ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
10605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG;
10705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1;
10805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2;
1090eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3;
1107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4;
1117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // For debugging to make sure the caller when acquiring/releasing our
1137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // wake lock is the system process.
1147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final boolean VALIDATE_WAKE_LOCK_CALLER = false;
115f333327782e14688e1c198c1192172d51308e90bCraig Mautner
116270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
1172219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Context mContext;
1182219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Looper mLooper;
119270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
120ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ActivityStackSupervisorHandler mHandler;
121ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
122ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** Short cut */
123ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    WindowManagerService mWindowManager;
124ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
125270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    /** Dismiss the keyguard after the next activity is displayed? */
1265314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner    boolean mDismissKeyguardOnNextActivity = false;
127270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
129d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner    private int mLastStackId = HOME_STACK_ID;
1308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
1328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
1338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
1348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1352420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
1362420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
1372420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** The stack containing the launcher app */
1392219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
14020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
141de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** The non-home stack currently receiving input or launching the next activity. If home is
14241c0f353c6209bf02708483b6f712fafde759925Craig Mautner     * in front then mHomeStack overrides mFocusedStack.
14341c0f353c6209bf02708483b6f712fafde759925Craig Mautner     * DO NOT ACCESS DIRECTLY - It may be null, use getFocusedStack() */
14429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    private ActivityStack mFocusedStack;
1458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** All the non-launcher stacks */
1472219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
1482219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
149de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_FRONT = 0;
150de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_BACK = 1;
151de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_BACK = 2;
152de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_FRONT = 3;
153de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private int mStackState = STACK_STATE_HOME_IN_FRONT;
154de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
155de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are waiting for a new activity to become visible before completing
156de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * whatever operation they are supposed to do. */
157de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();
158de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
159ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next visible activity. */
160ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
161ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
162ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
163ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next launched activity. */
164ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
165ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
166ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
167de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are ready to be stopped, but waiting for the next activity to
168de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * settle down before doing so. */
169de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();
170de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
171f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of activities that are ready to be finished, but waiting for the previous activity to
172f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * settle down before doing so.  It contains ActivityRecord objects. */
173f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();
174f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1750eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** List of activities that are in the process of going to sleep. */
1760eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>();
1770eea92c67b292b005c152641a12b920fe145826cCraig Mautner
178f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of ActivityRecord objects that have been finished and must still report back to a
179f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * pending thumbnail receiver. */
180f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mCancelledThumbnails = new ArrayList<ActivityRecord>();
181f333327782e14688e1c198c1192172d51308e90bCraig Mautner
182f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** Used on user changes */
183f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>();
184f333327782e14688e1c198c1192172d51308e90bCraig Mautner
185de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity
186de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * is being brought in front of us. */
187de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean mUserLeaving = false;
188de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
1890eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** Set when we have taken too long waiting to go to sleep. */
1900eea92c67b292b005c152641a12b920fe145826cCraig Mautner    boolean mSleepTimeout = false;
1910eea92c67b292b005c152641a12b920fe145826cCraig Mautner
1920eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /**
1937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * We don't want to allow the device to go to sleep while in the process
1947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * of launching an activity.  This is primarily to allow alarm intent
1957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * receivers to launch an activity and get that to run before the device
1967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * goes back to sleep.
1977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     */
1987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    final PowerManager.WakeLock mLaunchingActivity;
1997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2007ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    /**
2010eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * Set when the system is going to sleep, until we have
2020eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * successfully paused the current activity and released our wake lock.
2030eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * At that point the system is allowed to actually sleep.
2040eea92c67b292b005c152641a12b920fe145826cCraig Mautner     */
2050eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final PowerManager.WakeLock mGoingToSleep;
2060eea92c67b292b005c152641a12b920fe145826cCraig Mautner
20793529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    /** State of the stacks when user switched, indexed by userId. */
20893529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    SparseBooleanArray mUserHomeInFront = new SparseBooleanArray(2);
20993529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
2102219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service, Context context,
2112219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner            Looper looper) {
212270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
2132219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mContext = context;
2142219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mLooper = looper;
2150eea92c67b292b005c152641a12b920fe145826cCraig Mautner        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
2160eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
217ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHandler = new ActivityStackSupervisorHandler(looper);
2187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
2197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
2207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
2217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity =
2227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
2237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.setReferenceCounted(false);
2242219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2252219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
226ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void setWindowManager(WindowManagerService wm) {
227ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager = wm;
228ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID);
2298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        mStacks.add(mHomeStack);
230270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
231270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
232270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void dismissKeyguard() {
2335314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner        if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen("");
234270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        if (mDismissKeyguardOnNextActivity) {
235270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mDismissKeyguardOnNextActivity = false;
236ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.dismissKeyguard();
237270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        }
238270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
239270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
240ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    ActivityStack getFocusedStack() {
241f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        if (mFocusedStack == null) {
242f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            return mHomeStack;
243f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        }
244de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
245de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
246de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
247de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
248de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
249de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
250de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
25129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
252de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
25320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
25420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
255de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getLastStack() {
256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
258de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
259de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
260de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
261de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
262de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
26329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
264de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2652219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2662219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
267de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean isFrontStack(ActivityStack stack) {
268ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack());
26920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
27020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
271de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void moveHomeStack(boolean toFront) {
272de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean homeInFront = isFrontStack(mHomeStack);
273de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (homeInFront ^ toFront) {
27476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: mStackState old=" +
27576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                    stackStateToString(mStackState) + " new=" + stackStateToString(homeInFront ?
27676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                    STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT));
277de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            mStackState = homeInFront ? STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT;
278de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
279de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
280de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
28169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    boolean resumeHomeActivity(ActivityRecord prev) {
28269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        moveHomeStack(true);
28369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (prev != null) {
284ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner            prev.task.mOnTopOfHome = false;
28569ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
286a82aa09ba3b8cada49f0b20777e7502e86bb0248Craig Mautner        mHomeStack.moveHomeTaskToTop();
287a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner        ActivityRecord r = mHomeStack.topRunningActivityLocked(null);
288a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner        if (r != null) {
289a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner            mService.setFocusedActivityLocked(r);
29005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            return resumeTopActivitiesLocked(mHomeStack, prev, null);
29169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
29269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        return mService.startHomeActivityLocked(mCurrentUser);
29369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    }
29469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner
295de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final void setLaunchHomeTaskNextFlag(ActivityRecord sourceRecord, ActivityRecord r,
296de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityStack stack) {
297de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack == mHomeStack) {
298de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            return;
299de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
300de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if ((sourceRecord == null && getLastStack() == mHomeStack) ||
30186d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner                (sourceRecord != null && sourceRecord.isHomeActivity())) {
302de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r == null) {
303de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r = stack.topRunningActivityLocked(null);
304de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
30586d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner            if (r != null && !r.isHomeActivity() && r.isRootActivity()) {
306ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                r.task.mOnTopOfHome = true;
307de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
308de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
3092219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
3102219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
311270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void setDismissKeyguard(boolean dismiss) {
3125314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner        if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(" dismiss=" + 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
4682acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner    /**
4692acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * Pause all activities in either all of the stacks or just the back stacks.
4702acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving().
4712acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @return true if any activity was paused as a result of this call.
4722acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     */
4735314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner    boolean pauseBackStacks(boolean userLeaving) {
474cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        boolean someActivityPaused = false;
475cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
476cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
4775314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner            if (!isFrontStack(stack) && stack.mResumedActivity != null) {
4785314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner                if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack +
479ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        " mResumedActivity=" + stack.mResumedActivity);
480cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                stack.startPausingLocked(userLeaving, false);
481cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                someActivityPaused = true;
482cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
483cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
484cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        return someActivityPaused;
485cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
486cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
487de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allPausedActivitiesComplete() {
488ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        boolean pausing = true;
489de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
490de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
49169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            final ActivityRecord r = stack.mPausingActivity;
49269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            if (r != null && r.state != ActivityState.PAUSED
49369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPED
49469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPING) {
495ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_STATES) {
496ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state);
497ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    pausing = false;
498ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                } else {
499ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    return false;
500ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
501de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
502de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
503ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return pausing;
504de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
505de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
506ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityVisibleLocked(ActivityRecord r) {
507858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
508ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            WaitResult w = mWaitingActivityVisible.get(i);
509ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = false;
510ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
511ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
512ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
513ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
514ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = w.totalTime;
515ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
516ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
517ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        dismissKeyguard();
518ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
519ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
520ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
521ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            long thisTime, long totalTime) {
522ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
523c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner            WaitResult w = mWaitingActivityLaunched.remove(i);
524ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = timeout;
525ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
526ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
527ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
528ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = thisTime;
529ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = totalTime;
530ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
531ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
532ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
533ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
53429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    ActivityRecord topRunningActivityLocked() {
5351602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        final ActivityStack focusedStack = getFocusedStack();
5361602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        ActivityRecord r = focusedStack.topRunningActivityLocked(null);
5371602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        if (r != null) {
5381602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            return r;
53929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
5401602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner
54129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
54229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
543ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (stack != focusedStack && isFrontStack(stack)) {
54429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                r = stack.topRunningActivityLocked(null);
54529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                if (r != null) {
54629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    return r;
54729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                }
54829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
54929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
55029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        return null;
55129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
55229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
55320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
55420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
55520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        ActivityRecord r = null;
556c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner
557c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // Gather all of the running tasks for each stack into runningTaskLists.
558c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        final int numStacks = mStacks.size();
559c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        ArrayList<RunningTaskInfo>[] runningTaskLists = new ArrayList[numStacks];
560c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        for (int stackNdx = numStacks - 1; stackNdx >= 0; --stackNdx) {
56120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
562c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>();
563c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            runningTaskLists[stackNdx] = stackTaskList;
564c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            final ActivityRecord ar = stack.getTasksLocked(receiver, pending, stackTaskList);
565de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (isFrontStack(stack)) {
56620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                r = ar;
56720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
56820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
569c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner
570c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // The lists are already sorted from most recent to oldest. Just pull the most recent off
571c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // each list and add it to list. Stop when all lists are empty or maxNum reached.
572c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        while (maxNum > 0) {
573c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            long mostRecentActiveTime = Long.MIN_VALUE;
574c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            ArrayList<RunningTaskInfo> selectedStackList = null;
575c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
576c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists[stackNdx];
577c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                if (!stackTaskList.isEmpty()) {
578c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    final long lastActiveTime = stackTaskList.get(0).lastActiveTime;
579c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    if (lastActiveTime > mostRecentActiveTime) {
580c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        mostRecentActiveTime = lastActiveTime;
581c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        selectedStackList = stackTaskList;
582c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    }
583c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                }
584c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
585c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            if (selectedStackList != null) {
586c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                list.add(selectedStackList.remove(0));
587c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                --maxNum;
588c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            } else {
589c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                break;
590c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
591c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        }
592c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner
59320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return r;
59420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
59520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
59623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
59723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String profileFile, ParcelFileDescriptor profileFd, int userId) {
59823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
59923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
60023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
60123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
60223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
60323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
60423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
60523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
60623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
60723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
60823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
60923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
61023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
61123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
61223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
61323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
61423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
61523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
61623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
61723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
61823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
61923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
62023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
62123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
62223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
62323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
62423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
62523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
62623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
62723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
62823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
62923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
63023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
63123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
63223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (profileFile != null) {
63323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
63423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
63523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            profileFile, profileFd,
63623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
63723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
63823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
63923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
64023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
64123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
64223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
6432219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
644de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        moveHomeStack(true);
6456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0,
6462219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner                null, false, null);
6478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
64923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
65023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String callingPackage, Intent intent, String resolvedType, IBinder resultTo,
65123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String resultWho, int requestCode, int startFlags, String profileFile,
65223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
65323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
65423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
65523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
65623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
65723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
65823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
65923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
66023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
66123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
66223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
66323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
66423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
66523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                profileFile, profileFd, userId);
66623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
66723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
66823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
66923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
67023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
67123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
67223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = Binder.getCallingPid();
67323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingUid = Binder.getCallingUid();
67423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
67523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
67623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
67723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
678ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            final ActivityStack stack = getFocusedStack();
679de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            stack.mConfigWillChange = config != null
68023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
68123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
682de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    "Starting activity when config will change = " + stack.mConfigWillChange);
68323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
68423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
68523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
68623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
68723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
68823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
68923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
69023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
69123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
69223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
69323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
69423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingUid = callingUid;
69523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
69623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
69723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
69823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid = callerApp.info.uid;
69923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
70023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
70176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                                      + " (pid=" + callingPid + ") when starting: "
70223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
70323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
70423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
70523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
70623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
70723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
70823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
70923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
71023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
71123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
71223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
71323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
71423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
71523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
71623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
71723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
71823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
71923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
72023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
72123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
72223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
72323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
72423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
72523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
72623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
72723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
72823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
72923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
73023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
73123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
73223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
73323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
73423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
73523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
73623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
73723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
73823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
73923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
74023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
74123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
74223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
74323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
74423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
74523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
74623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
74723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
74823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
74923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
75023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
75123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
75223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
75323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
7546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int res = startActivityLocked(caller, intent, resolvedType,
75523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
75623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    callingPackage, startFlags, options, componentSpecified, null);
75723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
758de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (stack.mConfigWillChange) {
75923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
76023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
76223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
76323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
765de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stack.mConfigWillChange = false;
76623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
77123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
776ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWaitingActivityLaunched.add(outResult);
77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
77923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
78323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
784de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityRecord r = stack.topRunningActivityLocked(null);
78523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (r.nowVisible) {
78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
78723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
792ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                        mWaitingActivityVisible.add(outResult);
79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
79723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
79823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
79923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
80623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
80723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
80823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
80923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
81023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
81123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
81323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
81423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
81523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
81623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
81723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
81823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
82023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
82223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
82423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
82723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
82923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
83123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
83223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
83376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                ActivityRecord[] outActivity = new ActivityRecord[1];
83423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
83523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
83623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
83823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
83923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
84023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
84123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
84223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
84523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
84623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
84723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
84823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
84923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
85023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
85123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
85223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, null, null, userId);
85323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
85423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
85523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
85623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
85723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
85823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
85923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
86023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
86123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
86223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
86323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
86423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
86523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
86623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
86723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
86823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
8696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
87023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage,
87123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, theseOptions, componentSpecified, outActivity);
87223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
87323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
87423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
87523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
87623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
87723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
87823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
87923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
88023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
88123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
88223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
88323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
88423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
88523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
8862420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
8872420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ProcessRecord app, boolean andResume, boolean checkConfig)
8882420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
8892420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8902420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
891323f78001d86e626fe2a62e404f893b6cd847b1fCraig Mautner        if (true) Slog.d(TAG, "realStartActivity: setting app visibility true");
892ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager.setAppVisibility(r.appToken, true);
8932420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8942420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
8952420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
8962420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8972420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
8982420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
8992420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
9002420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
9012420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
9022420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
9032420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
904ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            Configuration config = mWindowManager.updateOrientationFromAppTokens(
9052420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
9062420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
9072420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
9082420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9092420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9102420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
9112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
9122420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
9132420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
9142420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9152420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
9162420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9172420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
9182420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
9192420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
9202420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9213bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        mService.updateLruProcessLocked(app, true, true);
9222420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9232420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
9242420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
9252420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
9262420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
9272420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9282420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
9292420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<Intent> newIntents = null;
9302420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
9312420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
9322420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
9332420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9342420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
9352420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
9362420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
9372420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
9382420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
9392420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
9402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
9412420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
9422420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
943ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (r.isHomeActivity() && r.isNotResolverActivity()) {
9444ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                // Home process is the root process of the task.
9454ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                mService.mHomeProcess = r.task.mActivities.get(0).app;
9462420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9472420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
9482420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
9492420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
9502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
9512420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
9522420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
9532420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
9542420ead0326bfd2587da6231be419e758dba1930Craig Mautner            boolean profileAutoStop = false;
9552420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
9562420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
9572420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
9582420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
9592420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
9602420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop = mService.mAutoStopProfiler;
9612420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
9622420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9632420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
9642420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
9652420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
9662420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
9672420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
9682420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
9692420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
9702420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
9712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
9722420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
9732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
9742420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
9752420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
9762420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
9772420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
978a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);
9792420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
9802420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    System.identityHashCode(r), r.info,
981a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    new Configuration(mService.mConfiguration), r.compat,
982a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    app.repProcState, r.icicle, results, newIntents, !andResume,
9832420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.isNextTransitionForward(), profileFile, profileFd,
9842420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop);
9852420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9862420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
9872420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
9882420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
9892420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
9902420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
9912420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
9922420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
9932420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
9942420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
9952420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
9962420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
9972420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
9982420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
9992420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
10002420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
10012420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
10022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
10032420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
10042420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
10052420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10062420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
10072420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
10082420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
10092420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
10102420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
10112420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
10122420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
10132420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.appDiedLocked(app, app.pid, app.thread);
10142420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
10152420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
10162420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
10172420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
10182420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10192420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
10202420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
10212420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
10222420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
10232420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10242420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10252420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
10262420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
10272420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
10282420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
10292420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10302420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10312420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
10322420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
10332420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
10342420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
10352420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
10362420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
10372420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
10382420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
10392420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
10402420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
10412420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
10422420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
10432420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
10442420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10452420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10462420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
10472420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
10482420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
10492420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
1050de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (isFrontStack(stack)) {
10512420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
10522420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10532420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10542420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
10552420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
10562420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1057e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
1058e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            boolean andResume, boolean checkConfig) {
1059e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
1060e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
10613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                r.info.applicationInfo.uid, true);
1062e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1063e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
1064e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1065e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
1066e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
1067d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn                app.addPackage(r.info.packageName, mService.mProcessStats);
1068e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                realStartActivityLocked(r, app, andResume, checkConfig);
1069e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
1070e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
1071e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
1072e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
1073e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
1074e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1075e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
1076e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
1077e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
1078e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1079e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
10803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                "activity", r.intent.getComponent(), false, false, true);
1081e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
1082e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
10836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
10846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
10856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String resultWho, int requestCode,
10866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options,
10876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            boolean componentSpecified, ActivityRecord[] outActivity) {
10886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
10896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
10916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
10926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
10936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
10946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
10956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
10966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
10976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
10986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
10996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
11006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
11016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
11056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
11066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
11076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
11086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
11116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
11126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
11136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
11146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
11156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
11166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
11176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
11186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
11196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
11206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
11236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int launchFlags = intent.getFlags();
11256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
11276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                && sourceRecord != null) {
11286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
11296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
11306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
11316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
11326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
11336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
11356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
11366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
11376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
11386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
11396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord.removeResultsLocked(
11406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    sourceRecord, resultWho, requestCode);
11416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
11456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
11466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
11476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
11486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
11516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
11526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
11536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
11546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
11576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
11586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
11596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
11606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
11616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
11636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
11646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
11656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
11686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
11696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
11706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
11716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
11726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
11736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
11746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
11756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
11766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
11786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
11796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
11806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
11816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
11826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
11836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
11846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
11856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
11866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
11876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
11886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
11896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
11916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
11926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1194dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
1195b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver                callingPid, resolvedType, aInfo.applicationInfo);
11965e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver
11976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
11986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
11996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
12006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
12016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
12025e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                abort |= !mService.mController.activityStarting(watchIntent,
12036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
12046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
12056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
12066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12075e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        }
12086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12095e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        if (abort) {
12105e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            if (resultRecord != null) {
12115e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
12126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
12136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12145e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // We pretend to the caller that it was really started, but
12155e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // they will just get a cancel result.
12165e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            setDismissKeyguard(false);
12175e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            ActivityOptions.abort(options);
12185e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            return ActivityManager.START_SUCCESS;
12196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
12226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                intent, resolvedType, aInfo, mService.mConfiguration,
1223de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resultRecord, resultWho, requestCode, componentSpecified, this);
12246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
12256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
12266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1228ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = getFocusedStack();
1229de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.mResumedActivity == null
1230de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                || stack.mResumedActivity.info.applicationInfo.uid != callingUid) {
12316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
12326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
1233de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, stack);
12346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mPendingActivityLaunches.add(pal);
12356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                setDismissKeyguard(false);
12366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
12376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
12386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
12426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
12436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
12446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
12456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
12466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
12476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
12486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
12496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
12506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        mService.doPendingActivityLaunchesLocked(false);
12536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options);
125510385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner
125610385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner        if (allPausedActivitiesComplete()) {
125710385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner            // If someone asked to have the keyguard dismissed on the next
12586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
12596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
12606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
12616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            dismissKeyguard();
12626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
12646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
12656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1266ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityStack adjustStackFocus(ActivityRecord r) {
12671d001b670e34fe887488047f525a5430154626e1Craig Mautner        final TaskRecord task = r.task;
12681d001b670e34fe887488047f525a5430154626e1Craig Mautner        if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) {
1269ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (task != null) {
1270ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (mFocusedStack != task.stack) {
1271ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1272ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                            "adjustStackFocus: Setting focused stack to r=" + r + " task=" + task);
1273ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    mFocusedStack = task.stack;
1274ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                } else {
1275ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1276ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        "adjustStackFocus: Focused stack already=" + mFocusedStack);
1277858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                }
1278ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                return mFocusedStack;
1279858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1280ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1281ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (mFocusedStack != null) {
1282ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1283ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        "adjustStackFocus: Have a focused stack=" + mFocusedStack);
1284ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                return mFocusedStack;
1285de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
1286ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1287ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            for (int stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) {
1288ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                ActivityStack stack = mStacks.get(stackNdx);
1289ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (!stack.isHomeStack()) {
1290ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1291ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                            "adjustStackFocus: Setting focused stack=" + stack);
1292ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    mFocusedStack = stack;
1293ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    return mFocusedStack;
1294ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
12951d001b670e34fe887488047f525a5430154626e1Craig Mautner            }
1296ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1297ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            // Time to create the first app stack for this user.
1298ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            int stackId = mService.createStack(-1, HOME_STACK_ID,
1299ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                StackBox.TASK_STACK_GOES_OVER, 1.0f);
1300ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
1301ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    " stackId=" + stackId);
1302ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            mFocusedStack = getStack(stackId);
130329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return mFocusedStack;
1304de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1305de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return mHomeStack;
1306de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
1307de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
130829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    void setFocusedStack(ActivityRecord r) {
130929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        if (r == null) {
131029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return;
131129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
131286d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner        if (!r.isApplicationActivity() || (r.task != null && !r.task.isApplicationTask())) {
131329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_FRONT) {
1314e7c58b6d7d761b93e785b0a399e5b00fdb82f4ceCraig Mautner                if (DEBUG_STACK || DEBUG_FOCUS) Slog.d(TAG, "setFocusedStack: mStackState old=" +
131576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(mStackState) + " new=" +
131676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_FRONT) +
131776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        " Callers=" + Debug.getCallers(3));
131829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_FRONT;
131929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
132029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        } else {
1321ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1322ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    "setFocusedStack: Setting focused stack to r=" + r + " task=" + r.task +
1323ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    " Callers=" + Debug.getCallers(3));
132429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            mFocusedStack = r.task.stack;
132529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_BACK) {
132676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" +
132776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(mStackState) + " new=" +
132876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_BACK) +
132976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        " Callers=" + Debug.getCallers(3));
133029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_BACK;
133129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
133229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
133329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
133429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
13358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    final int startActivityUncheckedLocked(ActivityRecord r,
13368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord sourceRecord, int startFlags, boolean doResume,
13378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Bundle options) {
13388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final Intent intent = r.intent;
13398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final int callingUid = r.launchedFromUid;
13408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        int launchFlags = intent.getFlags();
13428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // We'll invoke onUserLeaving before onPause only if the launching
13448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // activity did not explicitly state that this is an automated launch.
1345de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
1346de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving);
13478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the caller has asked not to resume at this point, we make note
13498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // of this in the record so that we can skip it when trying to find
13508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // the top running activity.
13518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (!doResume) {
13528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.delayedResume = true;
13538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
13568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the onlyIfNeeded flag is set, then we can do this if the activity
13588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // being launched is the same as the one making the call...  or, as
13598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // a special case, if we do not know the caller then we count the
13608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // current top activity as the caller.
13618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
13628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord checkedCaller = sourceRecord;
13638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (checkedCaller == null) {
1364ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop);
13658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!checkedCaller.realActivity.equals(r.realActivity)) {
13678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // Caller is not the same as launcher, so always needed.
13688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
13698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (sourceRecord == null) {
13738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This activity is not being started from another...  in this
13748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // case we -always- start a new task.
13758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
137629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
137729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
13788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
13798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
13818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The original activity who is starting us is running as a single
13828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // instance...  this new activity it is starting must go on its
13838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // own task.
13848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
13858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
13868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
13878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The activity being started is a single instance...  it always
13888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // gets launched into its own task.
13898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
13908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1392de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack sourceStack;
1393525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner        TaskRecord sourceTask;
1394de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (sourceRecord != null) {
1395de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceTask = sourceRecord.task;
1396de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = sourceTask.stack;
1397de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        } else {
1398de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceTask = null;
1399de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = null;
1400de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1401de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
14028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
14038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // For whatever reason this activity is being launched into a new
14048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // task...  yet the caller has requested a result back.  Well, that
14058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // is pretty messed up, so instead immediately send back a cancel
14068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // and let the new task continue launched as normal without a
14078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // dependency on its originator.
14088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
14098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo.task.stack.sendActivityResultLocked(-1,
14108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    r.resultTo, r.resultWho, r.requestCode,
14118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                Activity.RESULT_CANCELED, null);
14128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo = null;
14138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
14148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean addingToTask = false;
14168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean movedHome = false;
14178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        TaskRecord reuseTask = null;
1418de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityStack targetStack;
14198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
14208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
14218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
14228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
14238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If bring to front is requested, and no result is requested, and
14248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // we can find a task that was started with this same
14258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // component, then instead of launching bring that one to the front.
14268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo == null) {
14278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // See if there is a task to bring to the front.  If this is
14288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // a SINGLE_INSTANCE activity, there can be one and only one
14298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // instance of it in the history, and it is always in its own
14308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // unique task, so we do a special search.
14318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
1432ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        ? findTaskLocked(r)
14338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        : findActivityLocked(intent, r.info);
14348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (intentActivity != null) {
143529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null) {
143629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        r.task = intentActivity.task;
143729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    }
14388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack = intentActivity.task.stack;
14390f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
1440de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    moveHomeStack(targetStack.isHomeStack());
14418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (intentActivity.task.intent == null) {
14428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // This task was started because of movement of
14438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the activity based on affinity...  now that we
14448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // are actually launching it, we can assign the
14458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // base intent.
14468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(intent, r.info);
14478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the target task is not in the front, then we need
14498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to bring it to the front...  except...  well, with
14508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
14518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to have the same behavior as if a new instance was
14528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // being started, which means not bringing it to the front
14538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // if the caller is not itself in the front.
1454165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    final ActivityStack lastStack = getLastStack();
1455165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    ActivityRecord curTop = lastStack == null?
1456165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                            null : lastStack.topRunningNonDelayedActivityLocked(notTop);
14577504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                    if (curTop != null && (curTop.task != intentActivity.task ||
14587504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                            curTop.task != lastStack.topTask())) {
14598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
1460d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                        if (sourceRecord == null || (sourceStack.topActivity() != null &&
1461d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                                sourceStack.topActivity().task == sourceRecord.task)) {
14628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // We really do want to push this one into the
14638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // user's face, right now.
14648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            movedHome = true;
1465de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            if ((launchFlags &
146629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
146729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
1468e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner                                // Caller wants to appear on home activity.
1469ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                                intentActivity.task.mOnTopOfHome = true;
1470de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            }
14718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            targetStack.moveTaskToFrontLocked(intentActivity.task, r, options);
14728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            options = null;
14738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
14748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the caller has requested that the target task be
14768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // reset, then do so.
14778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
14788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
14798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
14818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We don't need to start a new activity, and
14828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the client said not to do anything if that
14838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is the case, so this is it!  And for paranoia, make
14848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
14858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1486de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
148705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                            resumeTopActivitiesLocked(targetStack, null, options);
14888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
14898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
14908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
149129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
149229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
149329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
14948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
14958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags &
14978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
14988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
14998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The caller has requested to completely replace any
15008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task with its new activity.  Well that should
15018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // not be too hard...
15028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask = intentActivity.task;
15038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.performClearTaskLocked();
15048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.setIntent(r.intent, r.info);
15058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
15068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
15078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
15088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this situation we want to remove all activities
15098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from the task up to the one being started.  In most
15108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // cases this means we are resetting the task to its
15118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // initial state.
15128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ActivityRecord top =
15138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.performClearTaskLocked(r, launchFlags);
15148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (top != null) {
15158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (top.frontOfTask) {
15168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // Activity aliases may mean we use different
15178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intents for the top activity, so make sure
15188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the task now has the identity of the new
15198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intent.
15208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                top.task.setIntent(r.intent, r.info);
15218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
15228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
15238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    r, top.task);
15248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
15258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
15268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // A special case: we need to
15278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // start the activity because it is not currently
15288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // running, and the caller has asked to clear the
15298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // current task to have this activity at the top.
15308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
15318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // Now pretend like this activity is being started
15328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // by the top of its task, so it is put in the
15338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // right place.
15348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
15358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
15368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (r.realActivity.equals(intentActivity.task.realActivity)) {
15378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case the top activity on the task is the
15388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // same as the one being launched, so we take that
15398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // as a request to bring the task to the foreground.
15408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // If the top activity in the task is the root
15418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // activity, deliver this new intent to it if it
15428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // desires.
15438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
15448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
15458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                && intentActivity.realActivity.equals(r.realActivity)) {
15468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r,
15478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    intentActivity.task);
15488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (intentActivity.frontOfTask) {
15498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.setIntent(r.intent, r.info);
15508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
15518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            intentActivity.deliverNewIntentLocked(callingUid, r.intent);
15528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else if (!r.intent.filterEquals(intentActivity.task.intent)) {
15538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // In this case we are launching the root activity
15548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // of the task, but with a different intent.  We
15558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // should start a new instance on top.
15568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
15578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
15588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
15598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
15608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case an activity is being launched in to an
15618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task, without resetting that task.  This
15628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is typically the situation of launching an activity
15638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from a notification or shortcut.  We want to place
15648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the new activity on top of the current task.
15658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        addingToTask = true;
15668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        sourceRecord = intentActivity;
15678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (!intentActivity.task.rootWasReset) {
15688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case we are launching in to an existing task
15698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // that has not yet been started from its front door.
15708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The current task has been brought to the front.
15718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // Ideally, we'd probably like to place this new task
15728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // at the bottom of its stack, but that's a little hard
15738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // to do with the current organization of the code so
15748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // for now we'll just drop it.
15758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(r.intent, r.info);
15768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (!addingToTask && reuseTask == null) {
15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We didn't do anything...  but it was needed (a.k.a., client
15798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // don't use that intent!)  And for paranoia, make
15808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
15818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1582e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner                            // Reset flag so it gets correctly reevaluated.
1583ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                            intentActivity.task.mOnTopOfHome = false;
1584de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            setLaunchHomeTaskNextFlag(sourceRecord, intentActivity, targetStack);
1585de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            targetStack.resumeTopActivityLocked(null, options);
15868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
15878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
15888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
158929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
159029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            "startActivityUncheckedLocked: task left null",
159129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            new RuntimeException("here").fillInStackTrace());
15928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_TASK_TO_FRONT;
15938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
15958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
15978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //String uri = r.intent.toURI();
15998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Intent intent2 = new Intent(uri);
16008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "Given intent: " + r.intent);
16018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "URI is: " + uri);
16028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "To intent: " + intent2);
16038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.packageName != null) {
16058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If the activity being launched is the same as the one currently
16068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // at the top, then we need to check if it should only be launched
16078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // once.
1608ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ActivityStack topStack = getFocusedStack();
1609de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop);
16108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (top != null && r.resultTo == null) {
16118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
16128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (top.app != null && top.app.thread != null) {
16138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
16148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
16158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
16168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top,
16178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    top.task);
16188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // For paranoia, make sure we have correctly
16198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // resumed the top activity.
16200f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                            topStack.mLastPausedActivity = null;
16218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (doResume) {
1622de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                setLaunchHomeTaskNextFlag(sourceRecord, null, topStack);
162305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                                resumeTopActivitiesLocked();
16248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
16258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
16268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
16278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // We don't need to start a new activity, and
16288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the client said not to do anything if that
16298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // is the case, so this is it!
163029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                if (r.task == null)  Slog.v(TAG,
163129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    "startActivityUncheckedLocked: task left null",
163229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    new RuntimeException("here").fillInStackTrace());
16338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
16348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
16358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
163629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            if (r.task == null)  Slog.v(TAG,
163729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
163829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
16398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            return ActivityManager.START_DELIVERED_TO_TOP;
16408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
16418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
16438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
16468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo != null) {
1647de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho,
1648de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.requestCode, Activity.RESULT_CANCELED, null);
16498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityOptions.abort(options);
165129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (r.task == null)  Slog.v(TAG,
165229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                "startActivityUncheckedLocked: task left null",
165329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                new RuntimeException("here").fillInStackTrace());
16548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            return ActivityManager.START_CLASS_NOT_FOUND;
16558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean newTask = false;
16588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean keepCurTransition = false;
16598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // Should this be considered a new task?
16618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo == null && !addingToTask
16628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1663ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            targetStack = adjustStackFocus(r);
1664de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
16658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (reuseTask == null) {
1666de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
1667de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        null, true);
1668de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
1669de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.task);
16708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else {
1671de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(reuseTask, reuseTask, true);
16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            newTask = true;
16748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!movedHome) {
1675de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if ((launchFlags &
1676de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
1677de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
1678de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // Caller wants to appear on home activity, so before starting
1679de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // their own activity we will bring home to the front.
1680ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                    r.task.mOnTopOfHome = true;
1681de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
16828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord != null) {
1684525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            sourceTask = sourceRecord.task;
1685525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            targetStack = sourceTask.stack;
1686de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
16878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!addingToTask &&
16888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
16898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are adding the activity to an existing
16908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // task, but the caller has asked to clear that task if the
16918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // activity is already running.
1692525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags);
16938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                keepCurTransition = true;
16948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
16958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
16968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
16978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // For paranoia, make sure we have correctly
16988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // resumed the top activity.
16990f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
17008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
1701de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
17028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
17038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
17048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityOptions.abort(options);
170529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null)  Slog.v(TAG,
170629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "startActivityUncheckedLocked: task left null",
170729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        new RuntimeException("here").fillInStackTrace());
17088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
17098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
17108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else if (!addingToTask &&
17118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
17128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are launching an activity in our own task
17138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // that may already be running somewhere in the history, and
17148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // we want to shuffle it to the front of the stack if so.
1715525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r);
17168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
1717de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    final TaskRecord task = top.task;
1718de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    task.moveActivityToFrontLocked(top);
1719de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task);
17208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.updateOptionsLocked(options);
17218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
17220f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
17238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
1724de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
17258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
17268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
17278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
17288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
17298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
17308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // An existing activity is starting this new activity, so we want
17318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // to keep the new one in the same task as the one that is starting
17328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // it.
1733525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            r.setTask(sourceTask, sourceRecord.thumbHolder, false);
17348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
17358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in existing task " + r.task);
17368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
17388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This not being started from an existing activity, and not part
17398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // of a new task...  just put it in the top task, though these days
17408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // this case should never happen.
1741ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            targetStack = adjustStackFocus(r);
1742de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
17431602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            ActivityRecord prev = targetStack.topActivity();
1744de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            r.setTask(prev != null ? prev.task
1745de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
1746de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    null, true);
17478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
17488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in new guessed " + r.task);
17498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
17508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
17528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                intent, r.getUriPermissionsLocked());
17538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (newTask) {
17558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
17568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
17578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
1758de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        setLaunchHomeTaskNextFlag(sourceRecord, r, targetStack);
17590f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner        targetStack.mLastPausedActivity = null;
17608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
17611d001b670e34fe887488047f525a5430154626e1Craig Mautner        mService.setFocusedActivityLocked(r);
17628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return ActivityManager.START_SUCCESS;
17638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
17648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    void acquireLaunchWakelock() {
17667ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
17677ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
17687ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
17697ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.acquire();
17707ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
17717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // To be safe, don't allow the wake lock to be held for too long.
17727ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
17737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
17747ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    }
17757ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1776f333327782e14688e1c198c1192172d51308e90bCraig Mautner    // Checked.
1777f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
1778f333327782e14688e1c198c1192172d51308e90bCraig Mautner            Configuration config) {
1779f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
1780f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1781f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> stops = null;
1782f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> finishes = null;
1783f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<UserStartedState> startingUsers = null;
1784f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NS = 0;
1785f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NF = 0;
1786f333327782e14688e1c198c1192172d51308e90bCraig Mautner        IApplicationThread sendThumbnail = null;
1787f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean booting = false;
1788f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean enableScreen = false;
1789f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean activityRemoved = false;
1790f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1791f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord r = ActivityRecord.forToken(token);
1792f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (r != null) {
1793b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" +
1794b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner                    Debug.getCallers(4));
1795f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
1796f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r.finishLaunchTickingLocked();
17977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (fromTimeout) {
17987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
17997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
1800f333327782e14688e1c198c1192172d51308e90bCraig Mautner
18017ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // This is a hack to semi-deal with a race condition
18027ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // in the client where it can be constructed with a
18037ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // newer configuration from when we asked it to launch.
18047ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We'll update with whatever configuration it now says
18057ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // it used to launch.
18067ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (config != null) {
18077ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                r.configuration = config;
18087ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
1809f333327782e14688e1c198c1192172d51308e90bCraig Mautner
18107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We are now idle.  If someone is waiting for a thumbnail from
18117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // us, we can now deliver.
18127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            r.idle = true;
18137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
18147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
18157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                sendThumbnail = r.app.thread;
18167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                r.thumbnailNeeded = false;
18177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
18187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
18197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
18207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (!mService.mBooted && isFrontStack(r.task.stack)) {
18217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mBooted = true;
18227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                enableScreen = true;
18237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
18247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
18257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
18267ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (allResumedActivitiesIdle()) {
18277ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (r != null) {
18287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.scheduleAppGcsLocked();
18297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
18307ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
18317ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
18327ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
18337ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER &&
18347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        Binder.getCallingUid() != Process.myUid()) {
18357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
1836f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
18377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
1838f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
18397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
1840f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1841f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1842f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Atomically retrieve all of the other things to do.
1843f333327782e14688e1c198c1192172d51308e90bCraig Mautner        stops = processStoppingActivitiesLocked(true);
1844f333327782e14688e1c198c1192172d51308e90bCraig Mautner        NS = stops != null ? stops.size() : 0;
1845f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if ((NF=mFinishingActivities.size()) > 0) {
1846f333327782e14688e1c198c1192172d51308e90bCraig Mautner            finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
1847f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mFinishingActivities.clear();
1848f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1849f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1850f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final ArrayList<ActivityRecord> thumbnails;
1851f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final int NT = mCancelledThumbnails.size();
1852f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (NT > 0) {
1853f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = new ArrayList<ActivityRecord>(mCancelledThumbnails);
1854f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mCancelledThumbnails.clear();
1855f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else {
1856f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = null;
1857f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1858f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1859f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (isFrontStack(mHomeStack)) {
1860f333327782e14688e1c198c1192172d51308e90bCraig Mautner            booting = mService.mBooting;
1861f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.mBooting = false;
1862f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1863f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1864f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mStartingUsers.size() > 0) {
1865f333327782e14688e1c198c1192172d51308e90bCraig Mautner            startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
1866f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mStartingUsers.clear();
1867f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1868f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1869f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Perform the following actions from unsynchronized state.
1870f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final IApplicationThread thumbnailThread = sendThumbnail;
1871f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.post(new Runnable() {
1872f333327782e14688e1c198c1192172d51308e90bCraig Mautner            @Override
1873f333327782e14688e1c198c1192172d51308e90bCraig Mautner            public void run() {
1874f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (thumbnailThread != null) {
1875f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    try {
1876f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        thumbnailThread.requestThumbnail(token);
1877f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    } catch (Exception e) {
1878f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
1879f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.sendPendingThumbnail(null, token, null, null, true);
1880f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
1881f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1882f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1883f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // Report back to any thumbnail receivers.
1884f333327782e14688e1c198c1192172d51308e90bCraig Mautner                for (int i = 0; i < NT; i++) {
1885f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    ActivityRecord r = thumbnails.get(i);
1886f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    mService.sendPendingThumbnail(r, null, null, null, true);
1887f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1888f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1889f333327782e14688e1c198c1192172d51308e90bCraig Mautner        });
1890f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1891f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Stop any activities that are scheduled to do so but have been
1892f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1893f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NS; i++) {
1894f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = stops.get(i);
1895f333327782e14688e1c198c1192172d51308e90bCraig Mautner            final ActivityStack stack = r.task.stack;
1896f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (r.finishing) {
1897f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
1898f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else {
1899f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.stopActivityLocked(r);
1900f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1901f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1902f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1903f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Finish any activities that are scheduled to do so but have been
1904f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1905f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NF; i++) {
1906f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = finishes.get(i);
1907f333327782e14688e1c198c1192172d51308e90bCraig Mautner            activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle");
1908f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1909f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1910f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (booting) {
1911f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.finishBooting();
1912f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else if (startingUsers != null) {
1913f333327782e14688e1c198c1192172d51308e90bCraig Mautner            for (int i = 0; i < startingUsers.size(); i++) {
1914f333327782e14688e1c198c1192172d51308e90bCraig Mautner                mService.finishUserSwitch(startingUsers.get(i));
1915f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1916f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1917f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1918f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mService.trimApplications();
1919f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //dump();
1920f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //mWindowManager.dump();
1921f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1922f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (enableScreen) {
1923f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.enableScreenAfterBoot();
1924f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1925f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1926f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (activityRemoved) {
192705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            resumeTopActivitiesLocked();
1928f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1929f333327782e14688e1c198c1192172d51308e90bCraig Mautner
19307ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        return r;
1931f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
1932f333327782e14688e1c198c1192172d51308e90bCraig Mautner
19338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
19346b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner        boolean launchHomeTaskNext = false;
19356b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner        final ActivityStack focusedStack = getFocusedStack();
19368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19386b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19396b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner            // Only update launchHomeTaskNext for the focused stack.
194051277a85216b2ebbd2df858b1ba190976a4b917bCraig Mautner            launchHomeTaskNext |= (stack.handleAppDiedLocked(app) && stack == focusedStack);
19416b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner        }
19426b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner
19436b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner        if (!restarting) {
19446b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner            if (launchHomeTaskNext) {
19456b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner                resumeHomeActivity(null);
19466b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner            } else {
19476b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner                if (!resumeTopActivitiesLocked(focusedStack, null, null)) {
19486b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner                    // If there was nothing to resume, and we are not already
19496b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner                    // restarting this process, but there is a visible activity that
19506b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner                    // is hosted by the process...  then make sure all visible
19516b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner                    // activities are running, taking care of restarting this
19526b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner                    // process.
19536b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner                    ensureActivitiesVisibleLocked(null, 0);
19546b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner                }
19556b74cb5df5810b670155611cfad88ed3e3fac820Craig Mautner            }
19568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
19608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.closeSystemDialogsLocked();
19648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
196793529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    void removeUserLocked(int userId) {
196893529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        mUserHomeInFront.delete(userId);
196993529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    }
197093529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
19718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
19728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
19738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
19748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
19758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
19768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
19808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                didSomething = true;
19818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
19828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
19848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1986a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    void updatePreviousProcessLocked(ActivityRecord r) {
1987a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now that this process has stopped, we may want to consider
1988a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // it to be the previous app to try to keep around in case
1989a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // the user wants to return to it.
1990a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
1991a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // First, found out what is currently the foreground app, so that
1992a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // we don't blow away the previous app if this activity is being
1993a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // hosted by the process that is actually still the foreground.
1994a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        ProcessRecord fgApp = null;
1995a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1996a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            final ActivityStack stack = mStacks.get(stackNdx);
1997a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            if (isFrontStack(stack)) {
1998a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                if (stack.mResumedActivity != null) {
1999a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    fgApp = stack.mResumedActivity.app;
2000a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                } else if (stack.mPausingActivity != null) {
2001a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    fgApp = stack.mPausingActivity.app;
2002a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                }
2003a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                break;
2004a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            }
2005a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2006a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
2007a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now set this one as the previous process, only if that really
2008a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // makes sense to.
2009a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        if (r.app != null && fgApp != null && r.app != fgApp
2010a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
20114ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                && r.app != mService.mHomeProcess) {
2012a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcess = r.app;
2013a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
2014a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2015a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    }
2016a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
201705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked() {
201805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return resumeTopActivitiesLocked(null, null, null);
201905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
202005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
202105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target,
202205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            Bundle targetOptions) {
202305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        if (targetStack == null) {
202405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            targetStack = getFocusedStack();
202505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        }
202605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        boolean result = false;
2027dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2028f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2029f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            if (isFrontStack(stack)) {
203005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                if (stack == targetStack) {
203105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    result = stack.resumeTopActivityLocked(target, targetOptions);
203205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } else {
203305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    stack.resumeTopActivityLocked(null);
203405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                }
2035f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            }
20368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
203705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return result;
20388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
20418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
20428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
20438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
20448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.finishTopRunningActivityLocked(app);
20458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) {
20498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
20508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) {
20517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" +
20521d001b670e34fe887488047f525a5430154626e1Craig Mautner                        mStacks.get(stackNdx));
20538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return;
20548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2058967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ActivityStack getStack(int stackId) {
20598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
20608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
20618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.getStackId() == stackId) {
20628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return stack;
20638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
20668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2068967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ArrayList<ActivityStack> getStacks() {
2069967212cb542e6eeb308678367b53381bff984c31Craig Mautner        return new ArrayList<ActivityStack>(mStacks);
2070967212cb542e6eeb308678367b53381bff984c31Craig Mautner    }
2071967212cb542e6eeb308678367b53381bff984c31Craig Mautner
2072967212cb542e6eeb308678367b53381bff984c31Craig Mautner    int createStack() {
2073858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        while (true) {
2074858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (++mLastStackId <= HOME_STACK_ID) {
2075858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                mLastStackId = HOME_STACK_ID + 1;
2076858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
2077858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (getStack(mLastStackId) == null) {
2078858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                break;
20798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2081858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId));
2082858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        return mLastStackId;
20838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
2086b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        final TaskRecord task = anyTaskForIdLocked(taskId);
2087b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        if (task == null) {
2088b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner            return;
2089b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        }
20908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
20918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
20928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
20938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
20948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2095b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        removeTask(task);
2096b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        stack.addTask(task, toTop);
2097b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        mWindowManager.addTask(taskId, stackId, toTop);
209805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        resumeTopActivitiesLocked();
20998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2101ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityRecord findTaskLocked(ActivityRecord r) {
21028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2103ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2104ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (!r.isApplicationActivity() && !stack.isHomeStack()) {
2105ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                continue;
2106ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            }
2107ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            final ActivityRecord ar = stack.findTaskLocked(r);
21088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
21098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
21108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
21118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
21128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
21138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
21148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
21158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
21168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            final ActivityRecord ar = mStacks.get(stackNdx).findActivityLocked(intent, info);
21188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
21198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
21208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
21218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
21228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
21238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
21248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
21258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
21260eea92c67b292b005c152641a12b920fe145826cCraig Mautner        scheduleSleepTimeout();
21270eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mGoingToSleep.isHeld()) {
21280eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.acquire();
21297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
21307ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
21317ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
21320eea92c67b292b005c152641a12b920fe145826cCraig Mautner                }
21337ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
21347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
21350eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
21368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2137ce15e157a6cf56fc73961ccb8c5ab18b1bf70280Amith Yamasani        checkReadyForSleepLocked();
21388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
21408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
21418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean timedout = false;
21420eea92c67b292b005c152641a12b920fe145826cCraig Mautner        goingToSleepLocked();
21430eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21440eea92c67b292b005c152641a12b920fe145826cCraig Mautner        final long endTime = System.currentTimeMillis() + timeout;
21450eea92c67b292b005c152641a12b920fe145826cCraig Mautner        while (true) {
21460eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean cantShutdown = false;
21470eea92c67b292b005c152641a12b920fe145826cCraig Mautner            for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21480eea92c67b292b005c152641a12b920fe145826cCraig Mautner                cantShutdown |= mStacks.get(stackNdx).checkReadyForSleepLocked();
21490eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
21500eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (cantShutdown) {
21510eea92c67b292b005c152641a12b920fe145826cCraig Mautner                long timeRemaining = endTime - System.currentTimeMillis();
21520eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (timeRemaining > 0) {
21538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
21540eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        mService.wait(timeRemaining);
21558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
21568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
21570eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } else {
21580eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    Slog.w(TAG, "Activity manager shutdown timed out");
21590eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    timedout = true;
21600eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    break;
21618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
21620eea92c67b292b005c152641a12b920fe145826cCraig Mautner            } else {
21630eea92c67b292b005c152641a12b920fe145826cCraig Mautner                break;
21648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21660eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21670eea92c67b292b005c152641a12b920fe145826cCraig Mautner        // Force checkReadyForSleep to complete.
21680eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = true;
21690eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
21700eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
21728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
21748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
21750eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
21760eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
21770eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
21780eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
2179ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2181ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            stack.awakeFromSleepingLocked();
21825314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner            if (isFrontStack(stack)) {
21835314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner                resumeTopActivitiesLocked();
21845314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner            }
21858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21860eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.clear();
21870eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
21880eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21890eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void activitySleptLocked(ActivityRecord r) {
21900eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.remove(r);
21910eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
21920eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
21930eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21940eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void checkReadyForSleepLocked() {
21950eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mService.isSleepingOrShuttingDown()) {
21960eea92c67b292b005c152641a12b920fe145826cCraig Mautner            // Do not care.
21970eea92c67b292b005c152641a12b920fe145826cCraig Mautner            return;
21980eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
21990eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22000eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mSleepTimeout) {
22010eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean dontSleep = false;
22020eea92c67b292b005c152641a12b920fe145826cCraig Mautner            for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
22030eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep |= mStacks.get(stackNdx).checkReadyForSleepLocked();
22040eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
22050eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22060eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mStoppingActivities.size() > 0) {
22070eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to stop; can't sleep yet.
22080eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
22090eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mStoppingActivities.size() + " activities");
22100eea92c67b292b005c152641a12b920fe145826cCraig Mautner                scheduleIdleLocked();
22110eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
22120eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
22130eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22140eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mGoingToSleepActivities.size() > 0) {
22150eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to sleep; can't sleep yet.
22160eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
22170eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mGoingToSleepActivities.size() + " activities");
22180eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
22190eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
22200eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22210eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (dontSleep) {
22220eea92c67b292b005c152641a12b920fe145826cCraig Mautner                return;
22230eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
22240eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
22250eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22260eea92c67b292b005c152641a12b920fe145826cCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
22270eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mStacks.get(stackNdx).goToSleep();
22280eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
22290eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22300eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
22310eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22320eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
22330eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
22340eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
22350eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mService.mShuttingDown) {
22360eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mService.notifyAll();
22370eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
22388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2240ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean reportResumedActivityLocked(ActivityRecord r) {
2241ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = r.task.stack;
2242ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (isFrontStack(stack)) {
22435782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey            mService.updateUsageStats(r, true);
2244ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2245ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (allResumedActivitiesComplete()) {
2246ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
2247ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.executeAppTransition();
2248ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return true;
2249ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2250ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return false;
2251ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2252ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
22538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
22548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
22558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
22568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
22578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.handleAppCrashLocked(app);
22588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2261de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
2262580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // First the front stacks. In case any are not fullscreen and are in front of home.
2263580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        boolean showHomeBehindStack = false;
2264de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2265580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2266580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (isFrontStack(stack)) {
2267580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                showHomeBehindStack =
2268580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                        stack.ensureActivitiesVisibleLocked(starting, configChanges);
2269580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
2270580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        }
2271580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // Now do back stacks.
2272580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2273580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2274580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (!isFrontStack(stack)) {
2275580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                stack.ensureActivitiesVisibleLocked(starting, configChanges, showHomeBehindStack);
2276580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
22778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
22808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
22818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
22828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
22838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
22848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.scheduleDestroyActivities(app, false, reason);
22858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
22888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
228993529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        mUserHomeInFront.put(mCurrentUser, isFrontStack(mHomeStack));
229093529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        final boolean homeInFront = mUserHomeInFront.get(userId, true);
22912420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
2292ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
2293858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStartingUsers.add(uss);
2294ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
229593529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner            mStacks.get(stackNdx).switchUserLocked(userId);
2296ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        }
2297858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
229893529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        moveHomeStack(homeInFront);
229993529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        return homeInFront;
23002219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
23012219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
2302de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
2303de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        int N = mStoppingActivities.size();
2304de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (N <= 0) return null;
2305de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2306de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ArrayList<ActivityRecord> stops = null;
2307de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2308de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean nowVisible = allResumedActivitiesVisible();
2309de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int i=0; i<N; i++) {
2310de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord s = mStoppingActivities.get(i);
2311323f78001d86e626fe2a62e404f893b6cd847b1fCraig Mautner            if (true || localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
2312de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + nowVisible + " waitingVisible=" + s.waitingVisible
2313de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + " finishing=" + s.finishing);
2314de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (s.waitingVisible && nowVisible) {
2315de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mWaitingVisibleActivities.remove(s);
2316de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                s.waitingVisible = false;
2317de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (s.finishing) {
2318de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // If this activity is finishing, it is sitting on top of
2319de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // everyone else but we now know it is no longer needed...
2320de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // so get rid of it.  Otherwise, we need to go through the
2321de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // normal flow and hide it once we determine that it is
2322de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // hidden by the activities in front of it.
2323de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
2324ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWindowManager.setAppVisibility(s.appToken, false);
2325de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2326de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2327de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) {
2328de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
2329de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (stops == null) {
2330de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    stops = new ArrayList<ActivityRecord>();
2331de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2332de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stops.add(s);
2333de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStoppingActivities.remove(i);
2334de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                N--;
2335de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                i--;
2336de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2337de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2338de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2339de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return stops;
2340de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
2341de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2342cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    void validateTopActivitiesLocked() {
2343cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2344cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2345cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityRecord r = stack.topRunningActivityLocked(null);
2346f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner            final ActivityState state = r == null ? ActivityState.DESTROYED : r.state;
2347cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (isFrontStack(stack)) {
2348cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r == null) {
2349cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: null top activity, stack=" + stack);
2350cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                } else {
2351f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    final ActivityRecord pausing = stack.mPausingActivity;
2352f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (pausing != null && pausing == r) {
2353cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r +
2354f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
2355cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2356f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) {
2357cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r +
2358f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                                " state=" + state);
2359cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2360cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2361cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            } else {
2362f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                final ActivityRecord resumed = stack.mResumedActivity;
2363f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (resumed != null && resumed == r) {
2364cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r +
2365f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        " state=" + state);
2366cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2367f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (r != null && (state == ActivityState.INITIALIZING
2368f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        || state == ActivityState.RESUMED)) {
2369cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: activity in back resumed r=" + r +
2370f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
2371cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2372cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
2373cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
2374cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
2375cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
237676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner    private static String stackStateToString(int stackState) {
237776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner        switch (stackState) {
237876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_IN_FRONT: return "STACK_STATE_HOME_IN_FRONT";
237976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_TO_BACK: return "STACK_STATE_HOME_TO_BACK";
238076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_IN_BACK: return "STACK_STATE_HOME_IN_BACK";
238176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_TO_FRONT: return "STACK_STATE_HOME_TO_FRONT";
238276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            default: return "Unknown stackState=" + stackState;
238376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner        }
238476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner    }
238576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner
2386270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
2387270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:");
2388270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner                pw.println(mDismissKeyguardOnNextActivity);
238976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner        pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState));
23907ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        pw.print(prefix); pw.println("mSleepTimeout: " + mSleepTimeout);
23917ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        pw.print(prefix); pw.println("mCurTaskId: " + mCurTaskId);
239293529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        pw.print(prefix); pw.println("mUserHomeInFront: " + mUserHomeInFront);
2393270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
23948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
239520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
2396ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack().getDumpActivitiesLocked(name);
239720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
239820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
2399390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage,
2400390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            boolean needSep, String prefix) {
2401390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        if (activity != null) {
2402390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (dumpPackage == null || dumpPackage.equals(activity.packageName)) {
2403390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                if (needSep) {
2404390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    pw.println();
2405390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                }
2406390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.print(prefix);
2407390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println(activity);
24087ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                return true;
2409390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
2410390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        }
24117ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return false;
2412390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    }
2413390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn
24148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
24158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
24167ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean printed = false;
24177ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean needSep = false;
24188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
24198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
24208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
24217ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            StringBuilder stackHeader = new StringBuilder(128);
24227ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            stackHeader.append("  Stack #");
24237ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            stackHeader.append(mStacks.indexOf(stack));
24247ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            stackHeader.append(":");
24257ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, needSep,
24267ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    stackHeader.toString());
24277ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, "    ", "Run", false, !dumpAll,
24287ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    false, dumpPackage, true, "    Running activities (most recent first):", null);
24297ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn
24307ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            needSep = printed;
24317ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep,
2432390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    "    mPausingActivity: ");
24337ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (pr) {
24347ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                printed = true;
24357ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                needSep = false;
24367ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
24377ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep,
2438390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    "    mResumedActivity: ");
24397ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (pr) {
24407ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                printed = true;
24417ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                needSep = false;
24427ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
24438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpAll) {
24447ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep,
2445390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                        "    mLastPausedActivity: ");
24467ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                if (pr) {
24477ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    printed = true;
24480f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    needSep = true;
24497ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                }
24500f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage,
24510f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                        needSep, "    mLastNoHistoryActivity: ");
24528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
24537ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            needSep = printed;
24548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
24558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
24567ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mFinishingActivities, "  ", "Fin", false, !dumpAll,
24577ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to finish:", null);
24587ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mStoppingActivities, "  ", "Stop", false, !dumpAll,
24597ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to stop:", null);
24607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, "  ", "Wait", false, !dumpAll,
24617ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting for another to become visible:",
24627ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                null);
24637ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
24647ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
24657ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
24667ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
2467de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
24687ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return printed;
24698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2471390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
24728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
24737ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            String dumpPackage, boolean needNL, String header1, String header2) {
24748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
2475390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String innerPrefix = null;
2476390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String[] args = null;
2477390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        boolean printed = false;
24788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
24798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
24808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
24818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
24828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
2483390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (innerPrefix == null) {
2484390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                innerPrefix = prefix + "      ";
2485390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                args = new String[0];
2486390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
2487390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            printed = true;
24888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
24898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
2490390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println("");
24918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
24928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
24937ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header1 != null) {
24947ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header1);
24957ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header1 = null;
24967ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
24977ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header2 != null) {
24987ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header2);
24997ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header2 = null;
2500390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
25018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
25028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
25038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
25048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
25058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
25068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
25078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
25088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
25098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
25108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
25118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
25128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
25138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
25148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
25158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
25168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
25178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
25188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
25198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
25208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
25218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
25228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
25238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
25248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
25258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
25268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
25278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
25288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
25298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
25308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
25318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
25328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
25338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
25348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
25358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
25368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
25378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
25388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
25398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
25408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
25418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
25428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
25438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
25448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
25458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
25468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
25478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
25488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
25498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
25508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2551390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        return printed;
25528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2553ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2554f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void scheduleIdleTimeoutLocked(ActivityRecord next) {
2555b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4));
2556c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
2557c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
2558f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2559f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2560f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final void scheduleIdleLocked() {
256105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(IDLE_NOW_MSG);
2562f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2563f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2564f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void removeTimeoutsForActivityLocked(ActivityRecord r) {
2565b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4));
2566f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
2567f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2568f333327782e14688e1c198c1192172d51308e90bCraig Mautner
256905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    final void scheduleResumeTopActivities() {
257005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
257105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
257205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
25730eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void removeSleepTimeouts() {
25740eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = false;
25750eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
25760eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
25770eea92c67b292b005c152641a12b920fe145826cCraig Mautner
25780eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final void scheduleSleepTimeout() {
25790eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
25800eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT);
25810eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
25820eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2583ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    private final class ActivityStackSupervisorHandler extends Handler {
2584f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2585ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public ActivityStackSupervisorHandler(Looper looper) {
2586ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            super(looper);
2587ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2588ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2589f333327782e14688e1c198c1192172d51308e90bCraig Mautner        void activityIdleInternal(ActivityRecord r) {
2590f333327782e14688e1c198c1192172d51308e90bCraig Mautner            synchronized (mService) {
2591f333327782e14688e1c198c1192172d51308e90bCraig Mautner                activityIdleInternalLocked(r != null ? r.appToken : null, true, null);
2592f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
25937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
25947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2595ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        @Override
2596ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public void handleMessage(Message msg) {
2597ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            switch (msg.what) {
2598f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_TIMEOUT_MSG: {
25995eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
2600f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    if (mService.mDidDexOpt) {
2601f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.mDidDexOpt = false;
2602f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
2603f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        nmsg.obj = msg.obj;
2604f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
2605f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        return;
2606f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
2607f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // We don't at this point know if the activity is fullscreen,
2608f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // so we need to be conservative and assume it isn't.
2609f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2610f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
2611f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_NOW_MSG: {
26125eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
2613f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2614f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
261505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                case RESUME_TOP_ACTIVITY_MSG: {
261605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    synchronized (mService) {
261705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                        resumeTopActivitiesLocked();
261805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    }
261905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } break;
26200eea92c67b292b005c152641a12b920fe145826cCraig Mautner                case SLEEP_TIMEOUT_MSG: {
26210eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    synchronized (mService) {
26220eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        if (mService.isSleepingOrShuttingDown()) {
26230eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
26240eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            mSleepTimeout = true;
26250eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            checkReadyForSleepLocked();
26260eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        }
26270eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    }
26280eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } break;
26297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                case LAUNCH_TIMEOUT_MSG: {
26307ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    if (mService.mDidDexOpt) {
26317ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mService.mDidDexOpt = false;
26327ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
26337ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        return;
26347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
26357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    synchronized (mService) {
26367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        if (mLaunchingActivity.isHeld()) {
26377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
26387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            if (VALIDATE_WAKE_LOCK_CALLER
26397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                    && Binder.getCallingUid() != Process.myUid()) {
26407ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                throw new IllegalStateException("Calling must be system uid");
26417ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            }
26427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            mLaunchingActivity.release();
26437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        }
26447ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
26457ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                } break;
2646ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
2647ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2648ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2649270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
2650