ActivityStackSupervisor.java revision b59dcfd5e108fdffbc610ef109cccecbbd11cd75
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;
256170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_RESULTS;
262420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_SWITCH;
278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_TASKS;
288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING;
2905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautnerimport static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG;
308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG;
318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
322420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity;
3323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager;
3423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions;
3523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals;
36ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager;
3723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread;
3820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.IThumbnailReceiver;
3923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent;
4020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
4123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
422420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo;
4323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
442219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
4523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
462219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
4723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
482219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
4923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
5023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
5123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
5223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
5323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
55b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug;
56ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler;
5723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
582219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
592420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message;
6023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
6223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
636170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle;
642420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog;
658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
66858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautnerimport android.util.SparseArray;
672219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
6823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
696170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
702420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
71de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport com.android.server.wm.StackBox;
72ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService;
7323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
76270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
772219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
79270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
80270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpublic class ActivityStackSupervisor {
81a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner    static final boolean DEBUG_STACK = ActivityManagerService.DEBUG_STACK;
82a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner
83de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG = ActivityManagerService.DEBUG || false;
84de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_ADD_REMOVE = DEBUG || false;
85de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_APP = DEBUG || false;
86de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_SAVED_STATE = DEBUG || false;
87de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_STATES = DEBUG || false;
88b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner    static final boolean DEBUG_IDLE = DEBUG || false;
892420ead0326bfd2587da6231be419e758dba1930Craig Mautner
902219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
91270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
92f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** How long we wait until giving up on the last activity telling us it is idle. */
93f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_TIMEOUT = 10*1000;
94f333327782e14688e1c198c1192172d51308e90bCraig Mautner
9505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG;
9605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1;
9705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2;
98f333327782e14688e1c198c1192172d51308e90bCraig Mautner
99270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
1002219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Context mContext;
1012219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Looper mLooper;
102270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
103ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ActivityStackSupervisorHandler mHandler;
104ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
105ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** Short cut */
106ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    WindowManagerService mWindowManager;
107ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
108270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    /** Dismiss the keyguard after the next activity is displayed? */
109270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    private boolean mDismissKeyguardOnNextActivity = false;
110270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
112d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner    private int mLastStackId = HOME_STACK_ID;
1138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
1158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
1168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
1178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1182420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
1192420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
1202420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** The stack containing the launcher app */
1222219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
12320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
124de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** The non-home stack currently receiving input or launching the next activity. If home is
12529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner     * in front then mHomeStack overrides mFocusedStack. */
12629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    private ActivityStack mFocusedStack;
1278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** All the non-launcher stacks */
1292219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
1302219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
131de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_FRONT = 0;
132de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_BACK = 1;
133de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_BACK = 2;
134de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_FRONT = 3;
135de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private int mStackState = STACK_STATE_HOME_IN_FRONT;
136de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
137de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are waiting for a new activity to become visible before completing
138de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * whatever operation they are supposed to do. */
139de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();
140de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
141ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next visible activity. */
142ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
143ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
144ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
145ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next launched activity. */
146ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
147ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
148ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
149de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are ready to be stopped, but waiting for the next activity to
150de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * settle down before doing so. */
151de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();
152de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
153f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of activities that are ready to be finished, but waiting for the previous activity to
154f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * settle down before doing so.  It contains ActivityRecord objects. */
155f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();
156f333327782e14688e1c198c1192172d51308e90bCraig Mautner
157f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of ActivityRecord objects that have been finished and must still report back to a
158f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * pending thumbnail receiver. */
159f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mCancelledThumbnails = new ArrayList<ActivityRecord>();
160f333327782e14688e1c198c1192172d51308e90bCraig Mautner
161f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** Used on user changes */
162f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>();
163f333327782e14688e1c198c1192172d51308e90bCraig Mautner
164de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity
165de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * is being brought in front of us. */
166de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean mUserLeaving = false;
167de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
168858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    /** Stacks belonging to users other than mCurrentUser. Indexed by userId. */
169858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    final SparseArray<UserState> mUserStates = new SparseArray<UserState>();
170858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
1712219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service, Context context,
1722219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner            Looper looper) {
173270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
1742219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mContext = context;
1752219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mLooper = looper;
176ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHandler = new ActivityStackSupervisorHandler(looper);
1772219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1782219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
179ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void setWindowManager(WindowManagerService wm) {
180ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager = wm;
181ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID);
1828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        mStacks.add(mHomeStack);
183270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
184270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
185270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void dismissKeyguard() {
186270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        if (mDismissKeyguardOnNextActivity) {
187270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mDismissKeyguardOnNextActivity = false;
188ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.dismissKeyguard();
189270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        }
190270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
191270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
192ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    ActivityStack getFocusedStack() {
193f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        if (mFocusedStack == null) {
194f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            return mHomeStack;
195f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        }
196de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
197de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
198de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
199de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
200de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
201de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
202de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
20329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
204de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
20520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
20620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
207de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getLastStack() {
208de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
209de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
210de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
211de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
212de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
213de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
214de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
21529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
216de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2172219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2182219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
219ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean isFocusedStack(ActivityStack stack) {
220ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack() == stack;
221ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
222ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
223de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean isFrontStack(ActivityStack stack) {
224858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        if (stack.mCurrentUser != mCurrentUser) {
225858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            return false;
226858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        }
227ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack());
22820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
22920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
230de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void moveHomeStack(boolean toFront) {
231de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean homeInFront = isFrontStack(mHomeStack);
232de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (homeInFront ^ toFront) {
233de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            mStackState = homeInFront ? STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT;
234de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
235de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
236de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
23769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    boolean resumeHomeActivity(ActivityRecord prev) {
23869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        moveHomeStack(true);
23969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (prev != null) {
24069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            prev.mLaunchHomeTaskNext = false;
24169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
24269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (mHomeStack.topRunningActivityLocked(null) != null) {
24305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            return resumeTopActivitiesLocked(mHomeStack, prev, null);
24469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
24569ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        return mService.startHomeActivityLocked(mCurrentUser);
24669ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    }
24769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner
248de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final void setLaunchHomeTaskNextFlag(ActivityRecord sourceRecord, ActivityRecord r,
249de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityStack stack) {
250de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack == mHomeStack) {
251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            return;
252de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
253de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if ((sourceRecord == null && getLastStack() == mHomeStack) ||
254de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                (sourceRecord != null && sourceRecord.isHomeActivity)) {
255de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r == null) {
256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r = stack.topRunningActivityLocked(null);
257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
258de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r != null && !r.isHomeActivity && r.isRootActivity()) {
259de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.mLaunchHomeTaskNext = true;
260de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
261de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2622219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2632219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
264270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void setDismissKeyguard(boolean dismiss) {
265270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mDismissKeyguardOnNextActivity = dismiss;
266270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
267270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
2688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
2698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            ActivityStack stack = mStacks.get(stackNdx);
2718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            TaskRecord task = stack.taskForIdLocked(id);
2728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (task != null) {
2738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return task;
2748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
2758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
2778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    ActivityRecord isInAnyStackLocked(IBinder token) {
2806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final ActivityRecord r = mStacks.get(stackNdx).isInStackLocked(token);
2826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (r != null) {
2836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return r;
2846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
2856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
2866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return null;
2876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
2886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
2898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
2908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
2918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
2928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
2938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
2948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
2958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
2968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
2978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
299de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void removeTask(TaskRecord task) {
300de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack stack = task.stack;
301de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.removeTask(task) && !stack.isHomeStack()) {
302a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner            if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack);
303de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            mStacks.remove(stack);
3044cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner            final int stackId = stack.mStackId;
305ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            final int nextStackId = mWindowManager.removeStack(stackId);
306a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner            // TODO: Perhaps we need to let the ActivityManager determine the next focus...
30729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mFocusedStack.mStackId == stackId) {
30829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mFocusedStack = nextStackId == HOME_STACK_ID ? null : getStack(nextStackId);
309de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
310de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
311de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
312de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
313de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityRecord resumedAppLocked() {
314ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        ActivityStack stack = getFocusedStack();
315ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (stack == null) {
316ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return null;
317ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
318de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityRecord resumedActivity = stack.mResumedActivity;
319de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (resumedActivity == null || resumedActivity.app == null) {
320de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            resumedActivity = stack.mPausingActivity;
321de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (resumedActivity == null || resumedActivity.app == null) {
322de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resumedActivity = stack.topRunningActivityLocked(null);
323de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
324de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
325de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return resumedActivity;
326de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
327de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
32820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception {
32920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        boolean didSomething = false;
33020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
33120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
33220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
333858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (!isFrontStack(stack)) {
334858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                continue;
335858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
33620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            ActivityRecord hr = stack.topRunningActivityLocked(null);
33720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (hr != null) {
33820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                if (hr.app == null && app.uid == hr.info.applicationInfo.uid
33920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        && processName.equals(hr.processName)) {
34020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    try {
34120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        if (headless) {
34220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            Slog.e(TAG, "Starting activities not supported on headless device: "
34320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                                    + hr);
3442420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } else if (realStartActivityLocked(hr, app, true, true)) {
34520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            didSomething = true;
34620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
34720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    } catch (Exception e) {
34820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        Slog.w(TAG, "Exception in new application when starting activity "
34920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                              + hr.intent.getComponent().flattenToShortString(), e);
35020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        throw e;
35120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
35220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
35320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
35420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
355b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (!didSomething) {
356b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
357b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        }
35820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
35920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
36020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
36120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
36220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
363dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            final ActivityRecord resumedActivity = mStacks.get(stackNdx).mResumedActivity;
364dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            if (resumedActivity == null || !resumedActivity.idle) {
36520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                return false;
36620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
36720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
36820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
36920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
37020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
371de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesComplete() {
372de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
373de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
374967212cb542e6eeb308678367b53381bff984c31Craig Mautner            if (isFrontStack(stack)) {
375de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                final ActivityRecord r = stack.mResumedActivity;
376de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (r != null && r.state != ActivityState.RESUMED) {
377de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    return false;
378de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
379de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
380de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
381de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        // TODO: Not sure if this should check if all Paused are complete too.
382de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
383de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
384de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStackState = STACK_STATE_HOME_IN_BACK;
385de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                break;
386de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
387de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStackState = STACK_STATE_HOME_IN_FRONT;
388de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                break;
389de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
390de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
391de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
392de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
393de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesVisible() {
394de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
395de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
396de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityRecord r = stack.mResumedActivity;
397de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r != null && (!r.nowVisible || r.waitingVisible)) {
398de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return false;
399de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
400de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
401de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
402de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
403de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
404cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    boolean pauseBackStacks(boolean userLeaving) {
405cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        boolean someActivityPaused = false;
406cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
407cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
408cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (!isFrontStack(stack) && stack.mResumedActivity != null) {
409cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                stack.startPausingLocked(userLeaving, false);
410cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                someActivityPaused = true;
411cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
412cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
413cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        return someActivityPaused;
414cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
415cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
416de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allPausedActivitiesComplete() {
417de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
418de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
41969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            final ActivityRecord r = stack.mPausingActivity;
42069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            if (r != null && r.state != ActivityState.PAUSED
42169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPED
42269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPING) {
42369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                return false;
424de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
425de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
426de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
427de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
428de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
429ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityVisibleLocked(ActivityRecord r) {
430858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
431ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            WaitResult w = mWaitingActivityVisible.get(i);
432ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = false;
433ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
434ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
435ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
436ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
437ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = w.totalTime;
438ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
439ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
440ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        dismissKeyguard();
441ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
442ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
443ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
444ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            long thisTime, long totalTime) {
445ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
446c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner            WaitResult w = mWaitingActivityLaunched.remove(i);
447ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = timeout;
448ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
449ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
450ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
451ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = thisTime;
452ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = totalTime;
453ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
454ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
455ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
456ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
45729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    ActivityRecord topRunningActivityLocked() {
45829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        ActivityRecord r = null;
45929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        if (mFocusedStack != null) {
46029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            r = mFocusedStack.topRunningActivityLocked(null);
46129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (r != null) {
46229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return r;
46329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
46429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
46529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
46629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
467858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (stack.mCurrentUser != mCurrentUser) {
468858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                continue;
469858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
47029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (stack != mFocusedStack && isFrontStack(stack)) {
47129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                r = stack.topRunningActivityLocked(null);
47229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                if (r != null) {
47329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    return r;
47429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                }
47529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
47629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
47729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        return null;
47829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
47929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
48020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
48120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
48220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        ActivityRecord r = null;
48320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final int numStacks = mStacks.size();
48420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
48520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
48620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityRecord ar =
48720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    stack.getTasksLocked(maxNum - list.size(), receiver, pending, list);
488de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (isFrontStack(stack)) {
48920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                r = ar;
49020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
49120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
49220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return r;
49320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
49420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
49523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
49623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String profileFile, ParcelFileDescriptor profileFd, int userId) {
49723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
49823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
49923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
50023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
50123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
50223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
50323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
50423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
50523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
50623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
50723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
50823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
50923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
51023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
51123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
51223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
51323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
51423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
51523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
51623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
51723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
51823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
51923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
52023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
52123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
52223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
52323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
52423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
52523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
52623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
52723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
52823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
52923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
53023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
53123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (profileFile != null) {
53223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
53323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
53423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            profileFile, profileFd,
53523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
53623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
53723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
53823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
53923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
54023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
54123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
5422219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
543de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        moveHomeStack(true);
5446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0,
5452219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner                null, false, null);
5468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
54823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
54923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String callingPackage, Intent intent, String resolvedType, IBinder resultTo,
55023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String resultWho, int requestCode, int startFlags, String profileFile,
55123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
55223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
55323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
55423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
55523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
55623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
55723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
55823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
55923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
56023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
56123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
56223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
56323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
56423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                profileFile, profileFd, userId);
56523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
56623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
56723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
56823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
56923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
57023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
57123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = Binder.getCallingPid();
57223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingUid = Binder.getCallingUid();
57323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
57423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
57523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
57623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
577ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            final ActivityStack stack = getFocusedStack();
578de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            stack.mConfigWillChange = config != null
57923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
58023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
581de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    "Starting activity when config will change = " + stack.mConfigWillChange);
58223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
58323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
58423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
58523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
58623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
58723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
58823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
58923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
59023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
59123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
59223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
59323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingPid = callingPid;
59423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingUid = callingUid;
59523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
59623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
59723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
59823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingPid = callerApp.pid;
59923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid = callerApp.info.uid;
60023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
60123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
60223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + " (pid=" + realCallingPid + ") when starting: "
60323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
60423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
60523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
60623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
60723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
60823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
60923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
61023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
61123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
61223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
61323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
61423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
61523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
61623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
61723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
61823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
61923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
62023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
62123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
62223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
62323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
62423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
62523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
62623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
62723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
62823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
62923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
63023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
63123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
63223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
63323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
63423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
63523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
63623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
63723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
63823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
63923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
64023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
64123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
64223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
64323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
64423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
64523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
64623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
64723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
64823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
64923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
65023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
65123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
65223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
65323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
65423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
6556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int res = startActivityLocked(caller, intent, resolvedType,
65623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
65723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    callingPackage, startFlags, options, componentSpecified, null);
65823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
659de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (stack.mConfigWillChange) {
66023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
66123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
66223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
66323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
66423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
66523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
666de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stack.mConfigWillChange = false;
66723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
66823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
66923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
67023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
67123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
67223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
67323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
67423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
67523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
67623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
677ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWaitingActivityLaunched.add(outResult);
67823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
67923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
68023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
68123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
68223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
68323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
68423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
685de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityRecord r = stack.topRunningActivityLocked(null);
68623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (r.nowVisible) {
68723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
68823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
68923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
69023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
69123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
69223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
693ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                        mWaitingActivityVisible.add(outResult);
69423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
69523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
69623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
69723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
69823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
69923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
70023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
70123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
70223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
70323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
70423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
70523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
70623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
70723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
70823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
70923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
71023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
71123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
71223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
71323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
71423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
71523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
71623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
71723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
71823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
71923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
72023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
72123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityRecord[] outActivity = new ActivityRecord[1];
72223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
72323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
72423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
72523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
72623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
72723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
72823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
72923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
73023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
73123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
73223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
73323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
73423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
73523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
73623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
73723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
73823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
73923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
74023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
74123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
74223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
74323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
74423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
74523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
74623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
74723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
74823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
74923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
75023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
75123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
75223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
75323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
75423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, null, null, userId);
75523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
75623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
75723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
75823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
75923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
76023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
76223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
76323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
76523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
76623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
7716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage,
77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, theseOptions, componentSpecified, outActivity);
77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
77623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
77923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
78323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
78423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
78523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
78723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
7882420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
7892420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ProcessRecord app, boolean andResume, boolean checkConfig)
7902420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
7912420ead0326bfd2587da6231be419e758dba1930Craig Mautner
7922420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
793ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager.setAppVisibility(r.appToken, true);
7942420ead0326bfd2587da6231be419e758dba1930Craig Mautner
7952420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
7962420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
7972420ead0326bfd2587da6231be419e758dba1930Craig Mautner
7982420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
7992420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
8002420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
8012420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
8022420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
8032420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
8042420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
805ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            Configuration config = mWindowManager.updateOrientationFromAppTokens(
8062420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
8072420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
8082420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
8092420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
8102420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
8122420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
8132420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
8142420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
8152420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8162420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
8172420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8182420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
8192420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
8202420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
8212420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
8222420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mService.updateLruProcessLocked(app, true);
8232420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8242420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
8252420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
8262420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
8272420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
8282420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8292420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
8302420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<Intent> newIntents = null;
8312420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
8322420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
8332420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
8342420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8352420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
8362420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
8372420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
8382420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
8392420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
8402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
8412420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
8422420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
8432420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8442420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.isHomeActivity) {
8452420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.mHomeProcess = app;
8462420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8472420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
8482420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
8492420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
8502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
8512420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
8522420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
8532420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
8542420ead0326bfd2587da6231be419e758dba1930Craig Mautner            boolean profileAutoStop = false;
8552420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
8562420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
8572420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
8582420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
8592420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
8602420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop = mService.mAutoStopProfiler;
8612420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
8622420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8632420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
8642420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
8652420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
8662420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
8672420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
8682420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
8692420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
8702420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
8712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
8722420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
8732420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
8742420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
8752420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
8762420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
8772420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8782420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
8792420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    System.identityHashCode(r), r.info,
8802420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    new Configuration(mService.mConfiguration),
8812420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.compat, r.icicle, results, newIntents, !andResume,
8822420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.isNextTransitionForward(), profileFile, profileFd,
8832420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop);
8842420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8852420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
8862420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
8872420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
8882420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
8892420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
8902420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
8912420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
8922420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
8932420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
8942420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
8952420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
8962420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
8972420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
8982420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
8992420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
9002420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
9012420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
9022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
9032420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9042420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9052420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
9062420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
9072420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
9082420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
9092420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
9102420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
9112420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
9122420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.appDiedLocked(app, app.pid, app.thread);
9132420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
9142420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
9152420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
9162420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9172420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9182420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
9192420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
9202420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
9212420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
9222420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9232420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9242420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
9252420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
9262420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
9272420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
9282420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9292420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9302420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
9312420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
9322420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
9332420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
9342420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
9352420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
9362420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
9372420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
9382420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
9392420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
9402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
9412420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
9422420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
9432420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9442420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9452420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
9462420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
9472420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
9482420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
949de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (isFrontStack(stack)) {
9502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
9512420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9522420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9532420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
9542420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
9552420ead0326bfd2587da6231be419e758dba1930Craig Mautner
956e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
957e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            boolean andResume, boolean checkConfig) {
958e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
959e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
960e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                r.info.applicationInfo.uid);
961e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
962e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
963e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
964e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
965e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
966e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                app.addPackage(r.info.packageName);
967e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                realStartActivityLocked(r, app, andResume, checkConfig);
968e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
969e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
970e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
971e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
972e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
973e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
974e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
975e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
976e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
977e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
978e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
979e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                "activity", r.intent.getComponent(), false, false);
980e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
981e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
9826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
9836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
9846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String resultWho, int requestCode,
9856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options,
9866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            boolean componentSpecified, ActivityRecord[] outActivity) {
9876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
9886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
9896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
9906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
9916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
9926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
9936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
9946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
9956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
9966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
9976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
9986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
9996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
10006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
10046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
10056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
10066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
10076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
10106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
10116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
10126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
10136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
10146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
10156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
10166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
10176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
10186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
10196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
10226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int launchFlags = intent.getFlags();
10246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
10266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                && sourceRecord != null) {
10276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
10286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
10296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
10306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
10316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
10326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
10346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
10356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
10366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
10376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
10386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord.removeResultsLocked(
10396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    sourceRecord, resultWho, requestCode);
10406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
10446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
10456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
10466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
10476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
10506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
10516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
10526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
10536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
10566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
10576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
10586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
10596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
10606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
10626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
10636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
10646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
10676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
10686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
10696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
10706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
10716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
10726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
10736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
10746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
10756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
10776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
10786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
10796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
10806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
10816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
10826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
10836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
10846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
10856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
10866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
10876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
10886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
10906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
10916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10936617c3c6d3d50559779fc7694a82f920b70ce4ffBen Gruver        boolean abort = !mService.mIntentFirewall.checkStartActivity(intent,
10947b879f4b93c43d943da8f946446b468912cb6ba1Ben Gruver                callerApp==null?null:callerApp.info, callingUid, callingPid, resolvedType, aInfo);
10955e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver
10966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
10976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
10986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
10996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
11006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
11015e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                abort |= !mService.mController.activityStarting(watchIntent,
11026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
11036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
11046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
11056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11065e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        }
11076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11085e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        if (abort) {
11095e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            if (resultRecord != null) {
11105e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
11116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
11126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11135e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // We pretend to the caller that it was really started, but
11145e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // they will just get a cancel result.
11155e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            setDismissKeyguard(false);
11165e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            ActivityOptions.abort(options);
11175e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            return ActivityManager.START_SUCCESS;
11186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
11216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                intent, resolvedType, aInfo, mService.mConfiguration,
1122de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resultRecord, resultWho, requestCode, componentSpecified, this);
11236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
11246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
11256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1127ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = getFocusedStack();
1128de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.mResumedActivity == null
1129de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                || stack.mResumedActivity.info.applicationInfo.uid != callingUid) {
11306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
11316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
1132de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, stack);
11336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mPendingActivityLaunches.add(pal);
11346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                setDismissKeyguard(false);
11356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
11366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
11376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
11416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
11426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
11436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
11446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
11456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
11466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
11476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
11486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
11496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        mService.doPendingActivityLaunchesLocked(false);
11526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options);
1154de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.mPausingActivity == null) {
11556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Someone asked to have the keyguard dismissed on the next
11566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
11576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
11586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
11596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            dismissKeyguard();
11606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
11626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
11636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1164de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getCorrectStack(ActivityRecord r) {
1165de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (!r.isHomeActivity) {
1166858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            int stackNdx;
1167858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            for (stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) {
1168858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                if (mStacks.get(stackNdx).mCurrentUser == mCurrentUser) {
1169858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                    break;
1170858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                }
1171858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1172858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (stackNdx == 0) {
1173858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                // Time to create the first app stack for this user.
11744cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner                int stackId = mService.createStack(-1, HOME_STACK_ID,
11754cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner                        StackBox.TASK_STACK_GOES_OVER, 1.0f);
117629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mFocusedStack = getStack(stackId);
1177de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
117829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return mFocusedStack;
1179de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1180de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return mHomeStack;
1181de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
1182de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
118329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    void setFocusedStack(ActivityRecord r) {
118429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        if (r == null) {
118529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return;
118629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
118729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        if (r.isHomeActivity) {
118829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_FRONT) {
118929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_FRONT;
119029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
119129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        } else {
119229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            mFocusedStack = r.task.stack;
119329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_BACK) {
119429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_BACK;
119529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
119629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
119729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
119829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
11998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    final int startActivityUncheckedLocked(ActivityRecord r,
12008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord sourceRecord, int startFlags, boolean doResume,
12018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Bundle options) {
12028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final Intent intent = r.intent;
12038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final int callingUid = r.launchedFromUid;
12048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        int launchFlags = intent.getFlags();
12068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // We'll invoke onUserLeaving before onPause only if the launching
12088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // activity did not explicitly state that this is an automated launch.
1209de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
1210de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving);
12118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the caller has asked not to resume at this point, we make note
12138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // of this in the record so that we can skip it when trying to find
12148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // the top running activity.
12158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (!doResume) {
12168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.delayedResume = true;
12178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
12208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the onlyIfNeeded flag is set, then we can do this if the activity
12228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // being launched is the same as the one making the call...  or, as
12238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // a special case, if we do not know the caller then we count the
12248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // current top activity as the caller.
12258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
12268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord checkedCaller = sourceRecord;
12278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (checkedCaller == null) {
1228ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop);
12298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
12308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!checkedCaller.realActivity.equals(r.realActivity)) {
12318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // Caller is not the same as launcher, so always needed.
12328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
12338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
12348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (sourceRecord == null) {
12378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This activity is not being started from another...  in this
12388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // case we -always- start a new task.
12398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
124029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
124129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
12428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
12438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
12448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
12458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The original activity who is starting us is running as a single
12468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // instance...  this new activity it is starting must go on its
12478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // own task.
12488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
12498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
12508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
12518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The activity being started is a single instance...  it always
12528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // gets launched into its own task.
12538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
12548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack sourceStack;
1257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final TaskRecord sourceTask;
1258de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (sourceRecord != null) {
1259de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceTask = sourceRecord.task;
1260de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = sourceTask.stack;
1261de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        } else {
1262de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceTask = null;
1263de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = null;
1264de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1265de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
12668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
12678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // For whatever reason this activity is being launched into a new
12688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // task...  yet the caller has requested a result back.  Well, that
12698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // is pretty messed up, so instead immediately send back a cancel
12708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // and let the new task continue launched as normal without a
12718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // dependency on its originator.
12728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
12738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo.task.stack.sendActivityResultLocked(-1,
12748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    r.resultTo, r.resultWho, r.requestCode,
12758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                Activity.RESULT_CANCELED, null);
12768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo = null;
12778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean addingToTask = false;
12808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean movedHome = false;
12818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        TaskRecord reuseTask = null;
1282de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityStack targetStack;
12838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
12848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
12858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
12868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
12878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If bring to front is requested, and no result is requested, and
12888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // we can find a task that was started with this same
12898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // component, then instead of launching bring that one to the front.
12908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo == null) {
12918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // See if there is a task to bring to the front.  If this is
12928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // a SINGLE_INSTANCE activity, there can be one and only one
12938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // instance of it in the history, and it is always in its own
12948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // unique task, so we do a special search.
12958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
12968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ? findTaskLocked(intent, r.info)
12978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        : findActivityLocked(intent, r.info);
12988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (intentActivity != null) {
129929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null) {
130029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        r.task = intentActivity.task;
130129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    }
13028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack = intentActivity.task.stack;
1303de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    moveHomeStack(targetStack.isHomeStack());
13048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (intentActivity.task.intent == null) {
13058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // This task was started because of movement of
13068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the activity based on affinity...  now that we
13078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // are actually launching it, we can assign the
13088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // base intent.
13098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(intent, r.info);
13108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
13118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the target task is not in the front, then we need
13128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to bring it to the front...  except...  well, with
13138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
13148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to have the same behavior as if a new instance was
13158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // being started, which means not bringing it to the front
13168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // if the caller is not itself in the front.
1317165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    final ActivityStack lastStack = getLastStack();
1318165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    ActivityRecord curTop = lastStack == null?
1319165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                            null : lastStack.topRunningNonDelayedActivityLocked(notTop);
13208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (curTop != null && curTop.task != intentActivity.task) {
13218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
1322de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        if (sourceRecord == null || sourceStack.topActivity() == sourceRecord) {
13238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // We really do want to push this one into the
13248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // user's face, right now.
13258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            movedHome = true;
1326de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            if ((launchFlags &
132729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
132829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
1329de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                // Caller wants to appear on home activity, so before starting
1330de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                // their own activity we will bring home to the front.
1331de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                r.mLaunchHomeTaskNext = true;
1332de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            }
13338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            targetStack.moveTaskToFrontLocked(intentActivity.task, r, options);
13348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            options = null;
13358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
13368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
13378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the caller has requested that the target task be
13388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // reset, then do so.
13398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
13408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
13418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
13428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
13438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We don't need to start a new activity, and
13448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the client said not to do anything if that
13458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is the case, so this is it!  And for paranoia, make
13468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
13478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1348de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
134905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                            resumeTopActivitiesLocked(targetStack, null, options);
13508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
13518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
13528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
135329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
135429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
135529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
13568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
13578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
13588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags &
13598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
13608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
13618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The caller has requested to completely replace any
13628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task with its new activity.  Well that should
13638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // not be too hard...
13648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask = intentActivity.task;
13658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.performClearTaskLocked();
13668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.setIntent(r.intent, r.info);
13678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
13688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
13698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
13708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this situation we want to remove all activities
13718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from the task up to the one being started.  In most
13728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // cases this means we are resetting the task to its
13738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // initial state.
13748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ActivityRecord top =
13758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.performClearTaskLocked(r, launchFlags);
13768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (top != null) {
13778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (top.frontOfTask) {
13788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // Activity aliases may mean we use different
13798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intents for the top activity, so make sure
13808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the task now has the identity of the new
13818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intent.
13828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                top.task.setIntent(r.intent, r.info);
13838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
13848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
13858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    r, top.task);
13868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
13878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
13888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // A special case: we need to
13898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // start the activity because it is not currently
13908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // running, and the caller has asked to clear the
13918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // current task to have this activity at the top.
13928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
13938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // Now pretend like this activity is being started
13948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // by the top of its task, so it is put in the
13958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // right place.
13968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
13978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
13988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (r.realActivity.equals(intentActivity.task.realActivity)) {
13998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case the top activity on the task is the
14008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // same as the one being launched, so we take that
14018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // as a request to bring the task to the foreground.
14028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // If the top activity in the task is the root
14038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // activity, deliver this new intent to it if it
14048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // desires.
14058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
14068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
14078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                && intentActivity.realActivity.equals(r.realActivity)) {
14088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r,
14098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    intentActivity.task);
14108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (intentActivity.frontOfTask) {
14118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.setIntent(r.intent, r.info);
14128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
14138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            intentActivity.deliverNewIntentLocked(callingUid, r.intent);
14148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else if (!r.intent.filterEquals(intentActivity.task.intent)) {
14158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // In this case we are launching the root activity
14168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // of the task, but with a different intent.  We
14178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // should start a new instance on top.
14188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
14198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
14208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
14218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
14228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case an activity is being launched in to an
14238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task, without resetting that task.  This
14248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is typically the situation of launching an activity
14258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from a notification or shortcut.  We want to place
14268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the new activity on top of the current task.
14278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        addingToTask = true;
14288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        sourceRecord = intentActivity;
14298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (!intentActivity.task.rootWasReset) {
14308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case we are launching in to an existing task
14318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // that has not yet been started from its front door.
14328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The current task has been brought to the front.
14338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // Ideally, we'd probably like to place this new task
14348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // at the bottom of its stack, but that's a little hard
14358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // to do with the current organization of the code so
14368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // for now we'll just drop it.
14378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(r.intent, r.info);
14388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (!addingToTask && reuseTask == null) {
14408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We didn't do anything...  but it was needed (a.k.a., client
14418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // don't use that intent!)  And for paranoia, make
14428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
14438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1444de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            setLaunchHomeTaskNextFlag(sourceRecord, intentActivity, targetStack);
1445de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            targetStack.resumeTopActivityLocked(null, options);
14468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
14478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
14488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
144929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
145029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            "startActivityUncheckedLocked: task left null",
145129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            new RuntimeException("here").fillInStackTrace());
14528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_TASK_TO_FRONT;
14538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
14558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
14568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
14578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //String uri = r.intent.toURI();
14598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Intent intent2 = new Intent(uri);
14608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "Given intent: " + r.intent);
14618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "URI is: " + uri);
14628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "To intent: " + intent2);
14638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.packageName != null) {
14658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If the activity being launched is the same as the one currently
14668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // at the top, then we need to check if it should only be launched
14678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // once.
1468ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ActivityStack topStack = getFocusedStack();
1469de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop);
14708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (top != null && r.resultTo == null) {
14718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
14728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (top.app != null && top.app.thread != null) {
14738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
14748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
14758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
14768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top,
14778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    top.task);
14788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // For paranoia, make sure we have correctly
14798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // resumed the top activity.
14808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (doResume) {
1481de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                setLaunchHomeTaskNextFlag(sourceRecord, null, topStack);
148205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                                resumeTopActivitiesLocked();
14838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
14848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
14858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
14868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // We don't need to start a new activity, and
14878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the client said not to do anything if that
14888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // is the case, so this is it!
148929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                if (r.task == null)  Slog.v(TAG,
149029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    "startActivityUncheckedLocked: task left null",
149129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    new RuntimeException("here").fillInStackTrace());
14928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
14938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
14948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
149529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            if (r.task == null)  Slog.v(TAG,
149629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
149729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
14988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            return ActivityManager.START_DELIVERED_TO_TOP;
14998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
15008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
15028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
15058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo != null) {
1506de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho,
1507de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.requestCode, Activity.RESULT_CANCELED, null);
15088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityOptions.abort(options);
151029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (r.task == null)  Slog.v(TAG,
151129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                "startActivityUncheckedLocked: task left null",
151229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                new RuntimeException("here").fillInStackTrace());
15138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            return ActivityManager.START_CLASS_NOT_FOUND;
15148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
15158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean newTask = false;
15178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean keepCurTransition = false;
15188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // Should this be considered a new task?
15208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo == null && !addingToTask
15218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1522de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            targetStack = getCorrectStack(r);
1523de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
15248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (reuseTask == null) {
1525de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
1526de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        null, true);
1527de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
1528de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.task);
15298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else {
1530de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(reuseTask, reuseTask, true);
15318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            newTask = true;
15338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!movedHome) {
1534de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if ((launchFlags &
1535de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
1536de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
1537de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // Caller wants to appear on home activity, so before starting
1538de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // their own activity we will bring home to the front.
1539de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    r.mLaunchHomeTaskNext = true;
1540de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
15418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord != null) {
1543de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            targetStack = sourceRecord.task.stack;
1544de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
15458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!addingToTask &&
15468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
15478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are adding the activity to an existing
15488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // task, but the caller has asked to clear that task if the
15498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // activity is already running.
15508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord top = sourceRecord.task.performClearTaskLocked(r, launchFlags);
15518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                keepCurTransition = true;
15528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
15538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
15548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
15558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // For paranoia, make sure we have correctly
15568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // resumed the top activity.
15578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
1558de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
15598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
15608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityOptions.abort(options);
156229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null)  Slog.v(TAG,
156329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "startActivityUncheckedLocked: task left null",
156429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        new RuntimeException("here").fillInStackTrace());
15658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
15668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
15678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else if (!addingToTask &&
15688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
15698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are launching an activity in our own task
15708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // that may already be running somewhere in the history, and
15718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // we want to shuffle it to the front of the stack if so.
15728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                final ActivityRecord top =
15738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.findActivityInHistoryLocked(r, sourceRecord.task);
15748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
1575de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    final TaskRecord task = top.task;
1576de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    task.moveActivityToFrontLocked(top);
1577de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task);
15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.updateOptionsLocked(options);
15798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
15808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
1581de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
15828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
15838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
158429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null)  Slog.v(TAG,
158529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "startActivityUncheckedLocked: task left null",
158629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        new RuntimeException("here").fillInStackTrace());
15878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
15888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
15898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // An existing activity is starting this new activity, so we want
15918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // to keep the new one in the same task as the one that is starting
15928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // it.
1593de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false);
15948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
15958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in existing task " + r.task);
15968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
15988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This not being started from an existing activity, and not part
15998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // of a new task...  just put it in the top task, though these days
16008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // this case should never happen.
1601f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            ActivityStack lastStack = getLastStack();
1602f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            targetStack = lastStack != null ? lastStack : mHomeStack;
1603de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
1604f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            ActivityRecord prev = lastStack == null ? null : targetStack.topActivity();
1605de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            r.setTask(prev != null ? prev.task
1606de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
1607de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    null, true);
16088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
16098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in new guessed " + r.task);
16108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
16138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                intent, r.getUriPermissionsLocked());
16148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (newTask) {
16168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
16178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
1619de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        setLaunchHomeTaskNextFlag(sourceRecord, r, targetStack);
16208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
16218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return ActivityManager.START_SUCCESS;
16228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
16238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1624f333327782e14688e1c198c1192172d51308e90bCraig Mautner    // Checked.
1625f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
1626f333327782e14688e1c198c1192172d51308e90bCraig Mautner            Configuration config) {
1627f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
1628f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1629f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord res = null;
1630f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1631f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> stops = null;
1632f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> finishes = null;
1633f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<UserStartedState> startingUsers = null;
1634f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NS = 0;
1635f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NF = 0;
1636f333327782e14688e1c198c1192172d51308e90bCraig Mautner        IApplicationThread sendThumbnail = null;
1637f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean booting = false;
1638f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean enableScreen = false;
1639f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean activityRemoved = false;
1640f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1641f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord r = ActivityRecord.forToken(token);
1642f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (r != null) {
1643b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" +
1644b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner                    Debug.getCallers(4));
1645f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
1646f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r.finishLaunchTickingLocked();
1647f333327782e14688e1c198c1192172d51308e90bCraig Mautner            res = r.task.stack.activityIdleInternalLocked(token, fromTimeout, config);
1648f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (res != null) {
1649f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (fromTimeout) {
1650f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
1651f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1652f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1653f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // This is a hack to semi-deal with a race condition
1654f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // in the client where it can be constructed with a
1655f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // newer configuration from when we asked it to launch.
1656f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // We'll update with whatever configuration it now says
1657f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // it used to launch.
1658f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (config != null) {
1659f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    r.configuration = config;
1660f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1661f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1662f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // We are now idle.  If someone is waiting for a thumbnail from
1663f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // us, we can now deliver.
1664f333327782e14688e1c198c1192172d51308e90bCraig Mautner                r.idle = true;
1665f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (allResumedActivitiesIdle()) {
1666f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    mService.scheduleAppGcsLocked();
1667f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1668f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
1669f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    sendThumbnail = r.app.thread;
1670f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    r.thumbnailNeeded = false;
1671f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1672f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1673f333327782e14688e1c198c1192172d51308e90bCraig Mautner                //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
1674f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (!mService.mBooted && isFrontStack(r.task.stack)) {
1675f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    mService.mBooted = true;
1676f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    enableScreen = true;
1677f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1678f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else if (fromTimeout) {
1679f333327782e14688e1c198c1192172d51308e90bCraig Mautner                reportActivityLaunchedLocked(fromTimeout, null, -1, -1);
1680f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1681f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1682f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1683f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Atomically retrieve all of the other things to do.
1684f333327782e14688e1c198c1192172d51308e90bCraig Mautner        stops = processStoppingActivitiesLocked(true);
1685f333327782e14688e1c198c1192172d51308e90bCraig Mautner        NS = stops != null ? stops.size() : 0;
1686f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if ((NF=mFinishingActivities.size()) > 0) {
1687f333327782e14688e1c198c1192172d51308e90bCraig Mautner            finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
1688f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mFinishingActivities.clear();
1689f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1690f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1691f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final ArrayList<ActivityRecord> thumbnails;
1692f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final int NT = mCancelledThumbnails.size();
1693f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (NT > 0) {
1694f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = new ArrayList<ActivityRecord>(mCancelledThumbnails);
1695f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mCancelledThumbnails.clear();
1696f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else {
1697f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = null;
1698f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1699f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1700f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (isFrontStack(mHomeStack)) {
1701f333327782e14688e1c198c1192172d51308e90bCraig Mautner            booting = mService.mBooting;
1702f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.mBooting = false;
1703f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1704f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1705f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mStartingUsers.size() > 0) {
1706f333327782e14688e1c198c1192172d51308e90bCraig Mautner            startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
1707f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mStartingUsers.clear();
1708f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1709f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1710f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Perform the following actions from unsynchronized state.
1711f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final IApplicationThread thumbnailThread = sendThumbnail;
1712f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.post(new Runnable() {
1713f333327782e14688e1c198c1192172d51308e90bCraig Mautner            @Override
1714f333327782e14688e1c198c1192172d51308e90bCraig Mautner            public void run() {
1715f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (thumbnailThread != null) {
1716f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    try {
1717f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        thumbnailThread.requestThumbnail(token);
1718f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    } catch (Exception e) {
1719f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
1720f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.sendPendingThumbnail(null, token, null, null, true);
1721f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
1722f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1723f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1724f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // Report back to any thumbnail receivers.
1725f333327782e14688e1c198c1192172d51308e90bCraig Mautner                for (int i = 0; i < NT; i++) {
1726f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    ActivityRecord r = thumbnails.get(i);
1727f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    mService.sendPendingThumbnail(r, null, null, null, true);
1728f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1729f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1730f333327782e14688e1c198c1192172d51308e90bCraig Mautner        });
1731f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1732f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Stop any activities that are scheduled to do so but have been
1733f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1734f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NS; i++) {
1735f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = stops.get(i);
1736f333327782e14688e1c198c1192172d51308e90bCraig Mautner            final ActivityStack stack = r.task.stack;
1737f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (r.finishing) {
1738f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
1739f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else {
1740f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.stopActivityLocked(r);
1741f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1742f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1743f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1744f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Finish any activities that are scheduled to do so but have been
1745f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1746f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NF; i++) {
1747f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = finishes.get(i);
1748f333327782e14688e1c198c1192172d51308e90bCraig Mautner            activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle");
1749f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1750f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1751f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (booting) {
1752f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.finishBooting();
1753f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else if (startingUsers != null) {
1754f333327782e14688e1c198c1192172d51308e90bCraig Mautner            for (int i = 0; i < startingUsers.size(); i++) {
1755f333327782e14688e1c198c1192172d51308e90bCraig Mautner                mService.finishUserSwitch(startingUsers.get(i));
1756f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1757f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1758f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1759f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mService.trimApplications();
1760f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //dump();
1761f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //mWindowManager.dump();
1762f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1763f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (enableScreen) {
1764f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.enableScreenAfterBoot();
1765f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1766f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1767f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (activityRemoved) {
176805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            resumeTopActivitiesLocked();
1769f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1770f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1771f333327782e14688e1c198c1192172d51308e90bCraig Mautner        return res;
1772f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
1773f333327782e14688e1c198c1192172d51308e90bCraig Mautner
17748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
17758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        // Just in case.
17768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
17778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
1778e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            mStacks.get(stackNdx).handleAppDiedLocked(app, restarting);
17798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
17808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
17818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
17828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
17838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
17848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
17858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
17868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.closeSystemDialogsLocked();
17878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
17888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
17898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
17908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
17918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
17928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
17938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
17948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
17958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
17968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
17978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
17988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
17998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                didSomething = true;
18008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
18018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
18038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
180505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked() {
180605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return resumeTopActivitiesLocked(null, null, null);
180705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
180805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
180905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target,
181005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            Bundle targetOptions) {
181105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        if (targetStack == null) {
181205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            targetStack = getFocusedStack();
181305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        }
181405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        boolean result = false;
1815dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1816f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
1817f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            if (isFrontStack(stack)) {
181805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                if (stack == targetStack) {
181905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    result = stack.resumeTopActivityLocked(target, targetOptions);
182005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } else {
182105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    stack.resumeTopActivityLocked(null);
182205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                }
1823f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            }
18248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
182505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return result;
18268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
18288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
18298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
18308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
18318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
18328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.finishTopRunningActivityLocked(app);
18338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
18368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) {
18378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) {
18398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return;
18408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
18418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1844967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ActivityStack getStack(int stackId) {
18458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
18478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.getStackId() == stackId) {
18488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return stack;
18498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
18508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
18528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1854967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ArrayList<ActivityStack> getStacks() {
1855967212cb542e6eeb308678367b53381bff984c31Craig Mautner        return new ArrayList<ActivityStack>(mStacks);
1856967212cb542e6eeb308678367b53381bff984c31Craig Mautner    }
1857967212cb542e6eeb308678367b53381bff984c31Craig Mautner
1858967212cb542e6eeb308678367b53381bff984c31Craig Mautner    int createStack() {
1859858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        while (true) {
1860858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (++mLastStackId <= HOME_STACK_ID) {
1861858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                mLastStackId = HOME_STACK_ID + 1;
1862858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1863858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (getStack(mLastStackId) == null) {
1864858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                break;
18658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
18668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
1867858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId));
1868858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        return mLastStackId;
18698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
18718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
18728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
18738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
18748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
18758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
18768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        stack.moveTask(taskId, toTop);
187805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        resumeTopActivitiesLocked();
18798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
18818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) {
18828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            final ActivityRecord ar = mStacks.get(stackNdx).findTaskLocked(intent, info);
18848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
18858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
18868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
18878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
18888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
18898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
18908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
18918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
18928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            final ActivityRecord ar = mStacks.get(stackNdx).findActivityLocked(intent, info);
18948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
18958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
18968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
18978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
18988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
18998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
19008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
19018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
19028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
19038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).stopIfSleepingLocked();
19048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
19088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean timedout = false;
19098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mResumedActivity != null) {
19138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.stopIfSleepingLocked();
19148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                final long endTime = System.currentTimeMillis() + timeout;
19158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                while (stack.mResumedActivity != null || stack.mPausingActivity != null) {
19168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    long delay = endTime - System.currentTimeMillis();
19178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (delay <= 0) {
19188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        Slog.w(TAG, "Activity manager shutdown timed out");
19198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        timedout = true;
19208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        break;
19218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
19228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
19238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        mService.wait();
19248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
19258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
19268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
19278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
19288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
19308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
1933ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
19348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
1935ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            stack.awakeFromSleepingLocked();
1936ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (isFrontStack(stack)) {
193705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                resumeTopActivitiesLocked();
1938de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
19398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1942ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean reportResumedActivityLocked(ActivityRecord r) {
1943ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = r.task.stack;
1944ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (isFrontStack(stack)) {
19455782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey            mService.updateUsageStats(r, true);
1946ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mService.setFocusedActivityLocked(r);
1947ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
1948ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (allResumedActivitiesComplete()) {
1949ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
1950ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.executeAppTransition();
1951ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return true;
1952ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
1953ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return false;
1954ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
1955ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
19568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
19578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.handleAppCrashLocked(app);
19618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1964de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
1965580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // First the front stacks. In case any are not fullscreen and are in front of home.
1966580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        boolean showHomeBehindStack = false;
1967de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1968580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
1969580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (isFrontStack(stack)) {
1970580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                showHomeBehindStack =
1971580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                        stack.ensureActivitiesVisibleLocked(starting, configChanges);
1972580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
1973580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        }
1974580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // Now do back stacks.
1975580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1976580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
1977580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (!isFrontStack(stack)) {
1978580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                stack.ensureActivitiesVisibleLocked(starting, configChanges, showHomeBehindStack);
1979580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
19808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
19848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.scheduleDestroyActivities(app, false, reason);
19888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
1992858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mUserStates.put(mCurrentUser, new UserState());
19932420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
1994858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        UserState userState = mUserStates.get(userId);
1995858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        if (userState != null) {
1996858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            userState.restore();
1997858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mUserStates.delete(userId);
1998858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        } else {
1999858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mFocusedStack = null;
2000858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mStackState = STACK_STATE_HOME_IN_FRONT;
20018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2002858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2003858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStartingUsers.add(uss);
2004b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        boolean haveActivities = mHomeStack.switchUserLocked(userId);
2005858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2006858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        resumeTopActivitiesLocked();
2007858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
20088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return haveActivities;
20092219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
20102219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
2011de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
2012de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        int N = mStoppingActivities.size();
2013de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (N <= 0) return null;
2014de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2015de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ArrayList<ActivityRecord> stops = null;
2016de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2017de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean nowVisible = allResumedActivitiesVisible();
2018de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int i=0; i<N; i++) {
2019de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord s = mStoppingActivities.get(i);
2020de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
2021de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + nowVisible + " waitingVisible=" + s.waitingVisible
2022de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + " finishing=" + s.finishing);
2023de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (s.waitingVisible && nowVisible) {
2024de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mWaitingVisibleActivities.remove(s);
2025de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                s.waitingVisible = false;
2026de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (s.finishing) {
2027de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // If this activity is finishing, it is sitting on top of
2028de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // everyone else but we now know it is no longer needed...
2029de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // so get rid of it.  Otherwise, we need to go through the
2030de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // normal flow and hide it once we determine that it is
2031de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // hidden by the activities in front of it.
2032de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
2033ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWindowManager.setAppVisibility(s.appToken, false);
2034de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2035de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2036de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) {
2037de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
2038de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (stops == null) {
2039de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    stops = new ArrayList<ActivityRecord>();
2040de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2041de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stops.add(s);
2042de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStoppingActivities.remove(i);
2043de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                N--;
2044de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                i--;
2045de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2046de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2047de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2048de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return stops;
2049de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
2050de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2051cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    void validateTopActivitiesLocked() {
2052cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2053cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2054cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityRecord r = stack.topRunningActivityLocked(null);
2055cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (isFrontStack(stack)) {
2056cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r == null) {
2057cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: null top activity, stack=" + stack);
2058cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                } else {
2059cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    if (stack.mPausingActivity != null) {
2060cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r +
2061cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                            " state=" + r.state);
2062cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2063cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    if (r.state != ActivityState.INITIALIZING &&
2064cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                            r.state != ActivityState.RESUMED) {
2065cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r +
2066cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                                " state=" + r.state);
2067cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2068cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2069cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            } else {
2070cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (stack.mResumedActivity != null) {
2071cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r +
2072cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        " state=" + r.state);
2073cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2074cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r != null && (r.state == ActivityState.INITIALIZING
2075cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        || r.state == ActivityState.RESUMED)) {
2076cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: activity in back resumed r=" + r +
2077cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                            " state=" + r.state);
2078cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2079cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
2080cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
2081cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
2082cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
2083270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
2084270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:");
2085270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner                pw.println(mDismissKeyguardOnNextActivity);
2086270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
20878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
208820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
2089ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack().getDumpActivitiesLocked(name);
209020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
209120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
20928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
20938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
20948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
20958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
20968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
20978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.print(mStacks.indexOf(stack)); pw.println(":");
20988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage);
20998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
21008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  Running activities (most recent first):");
21018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            dumpHistoryList(fd, pw, stack.mLRUActivities, "  ", "Run", false, !dumpAll, false,
21028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    dumpPackage);
21038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mGoingToSleepActivities.size() > 0) {
21048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
21058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to sleep:");
21068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mGoingToSleepActivities, "  ", "Sleep", false,
21078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
21088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
21108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.println(mStacks.indexOf(stack));
21118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mPausingActivity != null) {
21128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mPausingActivity: " + stack.mPausingActivity);
21138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mResumedActivity: " + stack.mResumedActivity);
21158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpAll) {
21168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mLastPausedActivity: " + stack.mLastPausedActivity);
21178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mSleepTimeout: " + stack.mSleepTimeout);
21188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2121f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mFinishingActivities.size() > 0) {
2122f333327782e14688e1c198c1192172d51308e90bCraig Mautner            pw.println(" ");
2123f333327782e14688e1c198c1192172d51308e90bCraig Mautner            pw.println("  Activities waiting to finish:");
2124f333327782e14688e1c198c1192172d51308e90bCraig Mautner            dumpHistoryList(fd, pw, mFinishingActivities, "  ", "Fin", false, !dumpAll, false,
2125f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    dumpPackage);
2126f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2127f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2128de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (mStoppingActivities.size() > 0) {
2129de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            pw.println(" ");
2130de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            pw.println("  Activities waiting to stop:");
2131de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            dumpHistoryList(fd, pw, mStoppingActivities, "  ", "Stop", false, !dumpAll, false,
2132de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    dumpPackage);
2133de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2134de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2135de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (mWaitingVisibleActivities.size() > 0) {
2136de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            pw.println(" ");
2137de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            pw.println("  Activities waiting for another to become visible:");
2138de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            dumpHistoryList(fd, pw, mWaitingVisibleActivities, "  ", "Wait", false, !dumpAll,
2139de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    false, dumpPackage);
2140de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2141de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
21428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (dumpAll) {
21438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
21448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mCurTaskId: " + mCurTaskId);
21458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return true;
21478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
21498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    static final void dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
21508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
21518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String dumpPackage) {
21528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
21538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean needNL = false;
21548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String innerPrefix = prefix + "      ";
21558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String[] args = new String[0];
21568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
21578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
21588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
21598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
21608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
21628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
21638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
21648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
21658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
21678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
21688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
21698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
21708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
21718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
21728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
21738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
21748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
21758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
21768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
21778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
21788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
21798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
21808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
21828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
21838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
21848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
21858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
21868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
21878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
21888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
21898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
21908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
21918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
21928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
21948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
21958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
21968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
21978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
21988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
21998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
22008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
22018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
22028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
22038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
22048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
22058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
22068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
22078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
22088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
22098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
22108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
22118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
22128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
22138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
22148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
22158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2217ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2218f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void scheduleIdleTimeoutLocked(ActivityRecord next) {
2219b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4));
2220c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
2221c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
2222f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2223f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2224f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final void scheduleIdleLocked() {
222505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(IDLE_NOW_MSG);
2226f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2227f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2228f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void removeTimeoutsForActivityLocked(ActivityRecord r) {
2229b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4));
2230f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
2231f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2232f333327782e14688e1c198c1192172d51308e90bCraig Mautner
223305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    final void scheduleResumeTopActivities() {
223405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
223505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
223605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
2237ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    private final class ActivityStackSupervisorHandler extends Handler {
2238f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2239ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public ActivityStackSupervisorHandler(Looper looper) {
2240ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            super(looper);
2241ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2242ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2243f333327782e14688e1c198c1192172d51308e90bCraig Mautner        void activityIdleInternal(ActivityRecord r) {
2244f333327782e14688e1c198c1192172d51308e90bCraig Mautner            synchronized (mService) {
2245f333327782e14688e1c198c1192172d51308e90bCraig Mautner                activityIdleInternalLocked(r != null ? r.appToken : null, true, null);
2246f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
2247f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2248f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2249ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        @Override
2250ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public void handleMessage(Message msg) {
2251ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            switch (msg.what) {
2252f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_TIMEOUT_MSG: {
2253b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: Callers=" +
2254b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner                            Debug.getCallers(4));
2255f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    if (mService.mDidDexOpt) {
2256f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.mDidDexOpt = false;
2257f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
2258f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        nmsg.obj = msg.obj;
2259f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
2260f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        return;
2261f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
2262f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // We don't at this point know if the activity is fullscreen,
2263f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // so we need to be conservative and assume it isn't.
2264f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2265f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
2266f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_NOW_MSG: {
2267f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2268f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
226905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                case RESUME_TOP_ACTIVITY_MSG: {
227005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    synchronized (mService) {
227105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                        resumeTopActivitiesLocked();
227205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    }
227305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } break;
2274ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
2275ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2276ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2277858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2278858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    private final class UserState {
2279858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        final ActivityStack mSavedFocusedStack;
2280858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        final int mSavedStackState;
2281858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2282858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        public UserState() {
2283858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            ActivityStackSupervisor supervisor = ActivityStackSupervisor.this;
2284858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mSavedFocusedStack = supervisor.mFocusedStack;
2285858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mSavedStackState = supervisor.mStackState;
2286858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        }
2287858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2288858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        void restore() {
2289858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            ActivityStackSupervisor supervisor = ActivityStackSupervisor.this;
2290858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            supervisor.mFocusedStack = mSavedFocusedStack;
2291858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            supervisor.mStackState = mSavedStackState;
2292858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        }
2293858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    }
2294270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
2295