ActivityStackSupervisor.java revision 580ea81ccdf29a7af0da88b43d2676fec93e4e5d
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;
298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG;
308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
312420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity;
3223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager;
3323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions;
3423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals;
35ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager;
3623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread;
3720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.IThumbnailReceiver;
3823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent;
3920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
4023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
412420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo;
4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
432219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
4423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
452219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
472219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
4823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
4923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
5023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
5123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
5223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
54ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler;
5523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
562219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
572420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message;
5823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
6023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
616170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle;
622420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog;
638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
64858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautnerimport android.util.SparseArray;
652219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
6623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
676170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
682420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
69de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport com.android.server.wm.StackBox;
70ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService;
7123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
74270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
752219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
77270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
78270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpublic class ActivityStackSupervisor {
79a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner    static final boolean DEBUG_STACK = ActivityManagerService.DEBUG_STACK;
80a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner
81de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG = ActivityManagerService.DEBUG || false;
82de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_ADD_REMOVE = DEBUG || false;
83de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_APP = DEBUG || false;
84de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_SAVED_STATE = DEBUG || false;
85de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_STATES = DEBUG || false;
862420ead0326bfd2587da6231be419e758dba1930Craig Mautner
872219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
88270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
89f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** How long we wait until giving up on the last activity telling us it is idle. */
90f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_TIMEOUT = 10*1000;
91f333327782e14688e1c198c1192172d51308e90bCraig Mautner
92f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_TIMEOUT_MSG = ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG;
93f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_NOW_MSG = ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG + 1;
94f333327782e14688e1c198c1192172d51308e90bCraig Mautner
95270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
962219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Context mContext;
972219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Looper mLooper;
98270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
99ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ActivityStackSupervisorHandler mHandler;
100ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
101ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** Short cut */
102ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    WindowManagerService mWindowManager;
103ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
104270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    /** Dismiss the keyguard after the next activity is displayed? */
105270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    private boolean mDismissKeyguardOnNextActivity = false;
106270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
108d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner    private int mLastStackId = HOME_STACK_ID;
1098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
1118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
1128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
1138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1142420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
1152420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
1162420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** The stack containing the launcher app */
1182219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
11920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
120de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** The non-home stack currently receiving input or launching the next activity. If home is
12129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner     * in front then mHomeStack overrides mFocusedStack. */
12229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    private ActivityStack mFocusedStack;
1238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** All the non-launcher stacks */
1252219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
1262219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
127de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_FRONT = 0;
128de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_BACK = 1;
129de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_BACK = 2;
130de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_FRONT = 3;
131de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private int mStackState = STACK_STATE_HOME_IN_FRONT;
132de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
133de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are waiting for a new activity to become visible before completing
134de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * whatever operation they are supposed to do. */
135de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();
136de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
137ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next visible activity. */
138ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
139ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
140ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
141ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next launched activity. */
142ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
143ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
144ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
145de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are ready to be stopped, but waiting for the next activity to
146de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * settle down before doing so. */
147de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();
148de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
149f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of activities that are ready to be finished, but waiting for the previous activity to
150f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * settle down before doing so.  It contains ActivityRecord objects. */
151f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();
152f333327782e14688e1c198c1192172d51308e90bCraig Mautner
153f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of ActivityRecord objects that have been finished and must still report back to a
154f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * pending thumbnail receiver. */
155f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mCancelledThumbnails = new ArrayList<ActivityRecord>();
156f333327782e14688e1c198c1192172d51308e90bCraig Mautner
157f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** Used on user changes */
158f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>();
159f333327782e14688e1c198c1192172d51308e90bCraig Mautner
160de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity
161de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * is being brought in front of us. */
162de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean mUserLeaving = false;
163de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
164858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    /** Stacks belonging to users other than mCurrentUser. Indexed by userId. */
165858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    final SparseArray<UserState> mUserStates = new SparseArray<UserState>();
166858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
1672219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service, Context context,
1682219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner            Looper looper) {
169270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
1702219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mContext = context;
1712219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mLooper = looper;
172ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHandler = new ActivityStackSupervisorHandler(looper);
1732219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
1742219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
175ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void setWindowManager(WindowManagerService wm) {
176ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager = wm;
177ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID);
1788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        mStacks.add(mHomeStack);
179270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
180270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
181270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void dismissKeyguard() {
182270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        if (mDismissKeyguardOnNextActivity) {
183270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mDismissKeyguardOnNextActivity = false;
184ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.dismissKeyguard();
185270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        }
186270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
187270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
188ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    ActivityStack getFocusedStack() {
189f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        if (mFocusedStack == null) {
190f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            return mHomeStack;
191f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        }
192de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
193de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
194de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
195de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
196de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
197de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
198de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
19929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
200de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
20120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
20220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
203de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getLastStack() {
204de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
205de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
206de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
207de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
208de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
209de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
210de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
21129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
212de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2132219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2142219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
215ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean isFocusedStack(ActivityStack stack) {
216ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack() == stack;
217ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
218ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
219de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean isFrontStack(ActivityStack stack) {
220858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        if (stack.mCurrentUser != mCurrentUser) {
221858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            return false;
222858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        }
223ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack());
22420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
22520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
226de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void moveHomeStack(boolean toFront) {
227de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean homeInFront = isFrontStack(mHomeStack);
228de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (homeInFront ^ toFront) {
229de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            mStackState = homeInFront ? STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT;
230de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
231de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
232de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
23369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    boolean resumeHomeActivity(ActivityRecord prev) {
23469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        moveHomeStack(true);
23569ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (prev != null) {
23669ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            prev.mLaunchHomeTaskNext = false;
23769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
23869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (mHomeStack.topRunningActivityLocked(null) != null) {
23969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            return mHomeStack.resumeTopActivityLocked(prev);
24069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
24169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        return mService.startHomeActivityLocked(mCurrentUser);
24269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    }
24369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner
244de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final void setLaunchHomeTaskNextFlag(ActivityRecord sourceRecord, ActivityRecord r,
245de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityStack stack) {
246de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack == mHomeStack) {
247de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            return;
248de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
249de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if ((sourceRecord == null && getLastStack() == mHomeStack) ||
250de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                (sourceRecord != null && sourceRecord.isHomeActivity)) {
251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r == null) {
252de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r = stack.topRunningActivityLocked(null);
253de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
254de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r != null && !r.isHomeActivity && r.isRootActivity()) {
255de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.mLaunchHomeTaskNext = true;
256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2582219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2592219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
260270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void setDismissKeyguard(boolean dismiss) {
261270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mDismissKeyguardOnNextActivity = dismiss;
262270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
263270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
2648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
2658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            ActivityStack stack = mStacks.get(stackNdx);
2678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            TaskRecord task = stack.taskForIdLocked(id);
2688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (task != null) {
2698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return task;
2708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
2718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
2738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    ActivityRecord isInAnyStackLocked(IBinder token) {
2766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final ActivityRecord r = mStacks.get(stackNdx).isInStackLocked(token);
2786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (r != null) {
2796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return r;
2806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
2816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
2826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return null;
2836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
2846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
2858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
2868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
2878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
2888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
2898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
2908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
2918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
2928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
2938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
295de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void removeTask(TaskRecord task) {
296de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack stack = task.stack;
297de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.removeTask(task) && !stack.isHomeStack()) {
298a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner            if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack);
299de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            mStacks.remove(stack);
3004cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner            final int stackId = stack.mStackId;
301ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            final int nextStackId = mWindowManager.removeStack(stackId);
302a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner            // TODO: Perhaps we need to let the ActivityManager determine the next focus...
30329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mFocusedStack.mStackId == stackId) {
30429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mFocusedStack = nextStackId == HOME_STACK_ID ? null : getStack(nextStackId);
305de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
306de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
307de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
308de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
309de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityRecord resumedAppLocked() {
310ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        ActivityStack stack = getFocusedStack();
311ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (stack == null) {
312ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return null;
313ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
314de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityRecord resumedActivity = stack.mResumedActivity;
315de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (resumedActivity == null || resumedActivity.app == null) {
316de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            resumedActivity = stack.mPausingActivity;
317de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (resumedActivity == null || resumedActivity.app == null) {
318de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resumedActivity = stack.topRunningActivityLocked(null);
319de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
320de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
321de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return resumedActivity;
322de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
323de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
32420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception {
32520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        boolean didSomething = false;
32620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
32720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
32820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
329858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (!isFrontStack(stack)) {
330858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                continue;
331858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
33220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            ActivityRecord hr = stack.topRunningActivityLocked(null);
33320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (hr != null) {
33420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                if (hr.app == null && app.uid == hr.info.applicationInfo.uid
33520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        && processName.equals(hr.processName)) {
33620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    try {
33720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        if (headless) {
33820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            Slog.e(TAG, "Starting activities not supported on headless device: "
33920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                                    + hr);
3402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } else if (realStartActivityLocked(hr, app, true, true)) {
34120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            didSomething = true;
34220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
34320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    } catch (Exception e) {
34420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        Slog.w(TAG, "Exception in new application when starting activity "
34520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                              + hr.intent.getComponent().flattenToShortString(), e);
34620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        throw e;
34720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
34820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                } else {
349580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                    stack.ensureActivitiesVisibleLocked(hr, null, processName, 0, false);
35020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
35120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
35220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
35320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
35420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
35520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
35620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
35720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
358dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            final ActivityRecord resumedActivity = mStacks.get(stackNdx).mResumedActivity;
359dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            if (resumedActivity == null || !resumedActivity.idle) {
36020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                return false;
36120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
36220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
36320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
36420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
36520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
366de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesComplete() {
367de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
368de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
369967212cb542e6eeb308678367b53381bff984c31Craig Mautner            if (isFrontStack(stack)) {
370de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                final ActivityRecord r = stack.mResumedActivity;
371de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (r != null && r.state != ActivityState.RESUMED) {
372de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    return false;
373de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
374de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
375de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
376de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        // TODO: Not sure if this should check if all Paused are complete too.
377de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
378de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
379de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStackState = STACK_STATE_HOME_IN_BACK;
380de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                break;
381de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
382de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStackState = STACK_STATE_HOME_IN_FRONT;
383de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                break;
384de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
385de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
386de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
387de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
388de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesVisible() {
389de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
390de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
391de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityRecord r = stack.mResumedActivity;
392de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r != null && (!r.nowVisible || r.waitingVisible)) {
393de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return false;
394de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
395de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
396de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
397de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
398de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
399cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    boolean pauseBackStacks(boolean userLeaving) {
400cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        boolean someActivityPaused = false;
401cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
402cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
403cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (!isFrontStack(stack) && stack.mResumedActivity != null) {
404cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                stack.startPausingLocked(userLeaving, false);
405cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                someActivityPaused = true;
406cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
407cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
408cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        return someActivityPaused;
409cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
410cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
411de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allPausedActivitiesComplete() {
412de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
413de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
41469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            final ActivityRecord r = stack.mPausingActivity;
41569ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            if (r != null && r.state != ActivityState.PAUSED
41669ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPED
41769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPING) {
41869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                return false;
419de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
420de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
421de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
422de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
423de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
424ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityVisibleLocked(ActivityRecord r) {
425858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
426ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            WaitResult w = mWaitingActivityVisible.get(i);
427ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = false;
428ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
429ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
430ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
431ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
432ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = w.totalTime;
433ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
434ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
435ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        dismissKeyguard();
436ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
437ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
438ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
439ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            long thisTime, long totalTime) {
440ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
441c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner            WaitResult w = mWaitingActivityLaunched.remove(i);
442ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = timeout;
443ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
444ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
445ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
446ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = thisTime;
447ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = totalTime;
448ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
449ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
450ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
451ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
45229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    ActivityRecord topRunningActivityLocked() {
45329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        ActivityRecord r = null;
45429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        if (mFocusedStack != null) {
45529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            r = mFocusedStack.topRunningActivityLocked(null);
45629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (r != null) {
45729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return r;
45829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
45929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
46029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
46129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
462858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (stack.mCurrentUser != mCurrentUser) {
463858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                continue;
464858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
46529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (stack != mFocusedStack && isFrontStack(stack)) {
46629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                r = stack.topRunningActivityLocked(null);
46729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                if (r != null) {
46829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    return r;
46929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                }
47029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
47129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
47229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        return null;
47329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
47429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
47520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
47620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
47720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        ActivityRecord r = null;
47820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final int numStacks = mStacks.size();
47920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
48020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
48120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityRecord ar =
48220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    stack.getTasksLocked(maxNum - list.size(), receiver, pending, list);
483de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (isFrontStack(stack)) {
48420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                r = ar;
48520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
48620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
48720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return r;
48820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
48920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
49023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
49123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String profileFile, ParcelFileDescriptor profileFd, int userId) {
49223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
49323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
49423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
49523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
49623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
49723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
49823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
49923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
50023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
50123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
50223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
50323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
50423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
50523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
50623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
50723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
50823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
50923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
51023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
51123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
51223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
51323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
51423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
51523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
51623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
51723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
51823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
51923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
52023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
52123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
52223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
52323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
52423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
52523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
52623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (profileFile != null) {
52723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
52823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
52923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            profileFile, profileFd,
53023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
53123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
53223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
53323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
53423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
53523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
53623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
5372219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
538de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        moveHomeStack(true);
5396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0,
5402219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner                null, false, null);
5418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
5428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
54323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
54423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String callingPackage, Intent intent, String resolvedType, IBinder resultTo,
54523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String resultWho, int requestCode, int startFlags, String profileFile,
54623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
54723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
54823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
54923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
55023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
55123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
55223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
55323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
55423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
55523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
55623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
55723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
55823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
55923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                profileFile, profileFd, userId);
56023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
56123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
56223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
56323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
56423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
56523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
56623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = Binder.getCallingPid();
56723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingUid = Binder.getCallingUid();
56823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
56923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
57023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
57123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
572ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            final ActivityStack stack = getFocusedStack();
573de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            stack.mConfigWillChange = config != null
57423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
57523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
576de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    "Starting activity when config will change = " + stack.mConfigWillChange);
57723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
57823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
57923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
58023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
58123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
58223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
58323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
58423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
58523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
58623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
58723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
58823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingPid = callingPid;
58923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingUid = callingUid;
59023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
59123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
59223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
59323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingPid = callerApp.pid;
59423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid = callerApp.info.uid;
59523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
59623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
59723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + " (pid=" + realCallingPid + ") when starting: "
59823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
59923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
60023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
60123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
60223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
60323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
60423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
60523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
60623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
60723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
60823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
60923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
61023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
61123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
61223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
61323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
61423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
61523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
61623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
61723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
61823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
61923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
62023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
62123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
62223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
62323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
62423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
62523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
62623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
62723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
62823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
62923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
63023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
63123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
63223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
63323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
63423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
63523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
63623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
63723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
63823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
63923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
64023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
64123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
64223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
64323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
64423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
64523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
64623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
64723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
64823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
64923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
6506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int res = startActivityLocked(caller, intent, resolvedType,
65123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
65223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    callingPackage, startFlags, options, componentSpecified, null);
65323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
654de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (stack.mConfigWillChange) {
65523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
65623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
65723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
65823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
65923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
66023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
661de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stack.mConfigWillChange = false;
66223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
66323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
66423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
66523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
66623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
66723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
66823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
66923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
67023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
67123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
672ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWaitingActivityLaunched.add(outResult);
67323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
67423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
67523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
67623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
67723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
67823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
67923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
680de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityRecord r = stack.topRunningActivityLocked(null);
68123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (r.nowVisible) {
68223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
68323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
68423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
68523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
68623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
68723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
688ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                        mWaitingActivityVisible.add(outResult);
68923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
69023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
69123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
69223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
69323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
69423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
69523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
69623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
69723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
69823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
69923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
70023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
70123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
70223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
70323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
70423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
70523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
70623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
70723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
70823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
70923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
71023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
71123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
71223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
71323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
71423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
71523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
71623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityRecord[] outActivity = new ActivityRecord[1];
71723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
71823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
71923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
72023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
72123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
72223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
72323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
72423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
72523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
72623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
72723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
72823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
72923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
73023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
73123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
73223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
73323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
73423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
73523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
73623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
73723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
73823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
73923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
74023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
74123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
74223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
74323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
74423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
74523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
74623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
74723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
74823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
74923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, null, null, userId);
75023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
75123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
75223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
75323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
75423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
75523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
75623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
75723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
75823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
75923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
76023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
76223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
76323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
76523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
7666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage,
76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, theseOptions, componentSpecified, outActivity);
76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
77123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
77623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
77923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
7832420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
7842420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ProcessRecord app, boolean andResume, boolean checkConfig)
7852420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
7862420ead0326bfd2587da6231be419e758dba1930Craig Mautner
7872420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
788ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager.setAppVisibility(r.appToken, true);
7892420ead0326bfd2587da6231be419e758dba1930Craig Mautner
7902420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
7912420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
7922420ead0326bfd2587da6231be419e758dba1930Craig Mautner
7932420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
7942420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
7952420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
7962420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
7972420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
7982420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
7992420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
800ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            Configuration config = mWindowManager.updateOrientationFromAppTokens(
8012420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
8022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
8032420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
8042420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
8052420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8062420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
8072420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
8082420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
8092420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
8102420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
8122420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8132420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
8142420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
8152420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
8162420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
8172420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mService.updateLruProcessLocked(app, true);
8182420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8192420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
8202420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
8212420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
8222420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
8232420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8242420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
8252420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<Intent> newIntents = null;
8262420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
8272420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
8282420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
8292420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8302420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
8312420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
8322420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
8332420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
8342420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
8352420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
8362420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
8372420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
8382420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8392420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.isHomeActivity) {
8402420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.mHomeProcess = app;
8412420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8422420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
8432420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
8442420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
8452420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
8462420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
8472420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
8482420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
8492420ead0326bfd2587da6231be419e758dba1930Craig Mautner            boolean profileAutoStop = false;
8502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
8512420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
8522420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
8532420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
8542420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
8552420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop = mService.mAutoStopProfiler;
8562420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
8572420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8582420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
8592420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
8602420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
8612420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
8622420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
8632420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
8642420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
8652420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
8662420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
8672420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
8682420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
8692420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
8702420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
8712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
8722420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8732420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
8742420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    System.identityHashCode(r), r.info,
8752420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    new Configuration(mService.mConfiguration),
8762420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.compat, r.icicle, results, newIntents, !andResume,
8772420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.isNextTransitionForward(), profileFile, profileFd,
8782420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop);
8792420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8802420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
8812420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
8822420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
8832420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
8842420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
8852420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
8862420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
8872420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
8882420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
8892420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
8902420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
8912420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
8922420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
8932420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
8942420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
8952420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
8962420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
8972420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
8982420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
8992420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9002420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
9012420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
9022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
9032420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
9042420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
9052420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
9062420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
9072420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.appDiedLocked(app, app.pid, app.thread);
9082420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
9092420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
9102420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
9112420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9122420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9132420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
9142420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
9152420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
9162420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
9172420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9182420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9192420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
9202420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
9212420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
9222420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
9232420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9242420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9252420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
9262420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
9272420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
9282420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
9292420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
9302420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
9312420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
9322420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
9332420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
9342420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
9352420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
9362420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
9372420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
9382420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9392420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9402420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
9412420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
9422420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
9432420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
944de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (isFrontStack(stack)) {
9452420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
9462420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
9472420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9482420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
9492420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
9502420ead0326bfd2587da6231be419e758dba1930Craig Mautner
951e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
952e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            boolean andResume, boolean checkConfig) {
953e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
954e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
955e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                r.info.applicationInfo.uid);
956e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
957e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
958e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
959e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
960e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
961e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                app.addPackage(r.info.packageName);
962e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                realStartActivityLocked(r, app, andResume, checkConfig);
963e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
964e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
965e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
966e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
967e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
968e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
969e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
970e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
971e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
972e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
973e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
974e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                "activity", r.intent.getComponent(), false, false);
975e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
976e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
9776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
9786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
9796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String resultWho, int requestCode,
9806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options,
9816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            boolean componentSpecified, ActivityRecord[] outActivity) {
9826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
9836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
9846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
9856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
9866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
9876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
9886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
9896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
9906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
9916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
9926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
9936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
9946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
9956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
9966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
9976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
9986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
9996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
10006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
10016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
10026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
10056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
10066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
10076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
10086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
10096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
10106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
10116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
10126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
10136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
10146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
10176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int launchFlags = intent.getFlags();
10196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
10216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                && sourceRecord != null) {
10226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
10236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
10246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
10256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
10266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
10276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
10296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
10306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
10316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
10326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
10336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord.removeResultsLocked(
10346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    sourceRecord, resultWho, requestCode);
10356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
10396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
10406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
10416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
10426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
10456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
10466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
10476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
10486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
10516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
10526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
10536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
10546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
10556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
10576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
10586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
10596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
10626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
10636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
10646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
10656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
10666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
10676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
10686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
10696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
10706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
10726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
10736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
10746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
10756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
10766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
10776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
10786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
10796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
10806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
10816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
10826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
10836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
10856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
10866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10886617c3c6d3d50559779fc7694a82f920b70ce4ffBen Gruver        boolean abort = !mService.mIntentFirewall.checkStartActivity(intent,
10897b879f4b93c43d943da8f946446b468912cb6ba1Ben Gruver                callerApp==null?null:callerApp.info, callingUid, callingPid, resolvedType, aInfo);
10905e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver
10916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
10926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
10936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
10946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
10956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
10965e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                abort |= !mService.mController.activityStarting(watchIntent,
10976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
10986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
10996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
11006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11015e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        }
11026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11035e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        if (abort) {
11045e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            if (resultRecord != null) {
11055e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
11066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
11076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11085e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // We pretend to the caller that it was really started, but
11095e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // they will just get a cancel result.
11105e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            setDismissKeyguard(false);
11115e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            ActivityOptions.abort(options);
11125e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            return ActivityManager.START_SUCCESS;
11136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
11166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                intent, resolvedType, aInfo, mService.mConfiguration,
1117de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resultRecord, resultWho, requestCode, componentSpecified, this);
11186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
11196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
11206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1122ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = getFocusedStack();
1123de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.mResumedActivity == null
1124de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                || stack.mResumedActivity.info.applicationInfo.uid != callingUid) {
11256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
11266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
1127de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, stack);
11286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mPendingActivityLaunches.add(pal);
11296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                setDismissKeyguard(false);
11306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
11316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
11326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
11366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
11376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
11386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
11396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
11406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
11416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
11426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
11436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
11446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        mService.doPendingActivityLaunchesLocked(false);
11476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options);
1149de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.mPausingActivity == null) {
11506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Someone asked to have the keyguard dismissed on the next
11516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
11526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
11536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
11546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            dismissKeyguard();
11556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
11576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
11586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1159de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getCorrectStack(ActivityRecord r) {
1160de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (!r.isHomeActivity) {
1161858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            int stackNdx;
1162858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            for (stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) {
1163858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                if (mStacks.get(stackNdx).mCurrentUser == mCurrentUser) {
1164858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                    break;
1165858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                }
1166858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1167858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (stackNdx == 0) {
1168858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                // Time to create the first app stack for this user.
11694cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner                int stackId = mService.createStack(-1, HOME_STACK_ID,
11704cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner                        StackBox.TASK_STACK_GOES_OVER, 1.0f);
117129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mFocusedStack = getStack(stackId);
1172de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
117329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return mFocusedStack;
1174de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1175de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return mHomeStack;
1176de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
1177de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
117829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    void setFocusedStack(ActivityRecord r) {
117929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        if (r == null) {
118029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return;
118129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
118229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        if (r.isHomeActivity) {
118329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_FRONT) {
118429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_FRONT;
118529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
118629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        } else {
118729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            mFocusedStack = r.task.stack;
118829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_BACK) {
118929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_BACK;
119029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
119129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
119229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
119329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
11948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    final int startActivityUncheckedLocked(ActivityRecord r,
11958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord sourceRecord, int startFlags, boolean doResume,
11968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Bundle options) {
11978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final Intent intent = r.intent;
11988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final int callingUid = r.launchedFromUid;
11998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        int launchFlags = intent.getFlags();
12018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // We'll invoke onUserLeaving before onPause only if the launching
12038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // activity did not explicitly state that this is an automated launch.
1204de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
1205de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving);
12068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the caller has asked not to resume at this point, we make note
12088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // of this in the record so that we can skip it when trying to find
12098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // the top running activity.
12108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (!doResume) {
12118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.delayedResume = true;
12128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
12158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the onlyIfNeeded flag is set, then we can do this if the activity
12178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // being launched is the same as the one making the call...  or, as
12188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // a special case, if we do not know the caller then we count the
12198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // current top activity as the caller.
12208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
12218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord checkedCaller = sourceRecord;
12228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (checkedCaller == null) {
1223ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop);
12248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
12258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!checkedCaller.realActivity.equals(r.realActivity)) {
12268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // Caller is not the same as launcher, so always needed.
12278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
12288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
12298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (sourceRecord == null) {
12328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This activity is not being started from another...  in this
12338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // case we -always- start a new task.
12348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
123529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
123629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
12378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
12388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
12398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
12408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The original activity who is starting us is running as a single
12418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // instance...  this new activity it is starting must go on its
12428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // own task.
12438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
12448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
12458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
12468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The activity being started is a single instance...  it always
12478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // gets launched into its own task.
12488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
12498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack sourceStack;
1252de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final TaskRecord sourceTask;
1253de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (sourceRecord != null) {
1254de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceTask = sourceRecord.task;
1255de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = sourceTask.stack;
1256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        } else {
1257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceTask = null;
1258de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = null;
1259de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1260de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
12618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
12628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // For whatever reason this activity is being launched into a new
12638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // task...  yet the caller has requested a result back.  Well, that
12648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // is pretty messed up, so instead immediately send back a cancel
12658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // and let the new task continue launched as normal without a
12668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // dependency on its originator.
12678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
12688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo.task.stack.sendActivityResultLocked(-1,
12698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    r.resultTo, r.resultWho, r.requestCode,
12708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                Activity.RESULT_CANCELED, null);
12718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo = null;
12728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
12738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
12748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean addingToTask = false;
12758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean movedHome = false;
12768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        TaskRecord reuseTask = null;
1277de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityStack targetStack;
12788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
12798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
12808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
12818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
12828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If bring to front is requested, and no result is requested, and
12838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // we can find a task that was started with this same
12848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // component, then instead of launching bring that one to the front.
12858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo == null) {
12868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // See if there is a task to bring to the front.  If this is
12878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // a SINGLE_INSTANCE activity, there can be one and only one
12888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // instance of it in the history, and it is always in its own
12898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // unique task, so we do a special search.
12908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
12918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ? findTaskLocked(intent, r.info)
12928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        : findActivityLocked(intent, r.info);
12938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (intentActivity != null) {
129429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null) {
129529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        r.task = intentActivity.task;
129629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    }
12978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack = intentActivity.task.stack;
1298de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    moveHomeStack(targetStack.isHomeStack());
12998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (intentActivity.task.intent == null) {
13008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // This task was started because of movement of
13018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the activity based on affinity...  now that we
13028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // are actually launching it, we can assign the
13038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // base intent.
13048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(intent, r.info);
13058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
13068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the target task is not in the front, then we need
13078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to bring it to the front...  except...  well, with
13088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
13098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to have the same behavior as if a new instance was
13108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // being started, which means not bringing it to the front
13118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // if the caller is not itself in the front.
1312165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    final ActivityStack lastStack = getLastStack();
1313165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    ActivityRecord curTop = lastStack == null?
1314165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                            null : lastStack.topRunningNonDelayedActivityLocked(notTop);
13158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (curTop != null && curTop.task != intentActivity.task) {
13168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
1317de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        if (sourceRecord == null || sourceStack.topActivity() == sourceRecord) {
13188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // We really do want to push this one into the
13198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // user's face, right now.
13208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            movedHome = true;
1321de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            if ((launchFlags &
132229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
132329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
1324de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                // Caller wants to appear on home activity, so before starting
1325de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                // their own activity we will bring home to the front.
1326de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                r.mLaunchHomeTaskNext = true;
1327de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            }
13288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            targetStack.moveTaskToFrontLocked(intentActivity.task, r, options);
13298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            options = null;
13308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
13318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
13328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the caller has requested that the target task be
13338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // reset, then do so.
13348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
13358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
13368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
13378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
13388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We don't need to start a new activity, and
13398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the client said not to do anything if that
13408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is the case, so this is it!  And for paranoia, make
13418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
13428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1343de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
13448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            targetStack.resumeTopActivityLocked(null, options);
13458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
13468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
13478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
134829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
134929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
135029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
13518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
13528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
13538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags &
13548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
13558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
13568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The caller has requested to completely replace any
13578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task with its new activity.  Well that should
13588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // not be too hard...
13598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask = intentActivity.task;
13608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.performClearTaskLocked();
13618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.setIntent(r.intent, r.info);
13628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
13638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
13648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
13658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this situation we want to remove all activities
13668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from the task up to the one being started.  In most
13678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // cases this means we are resetting the task to its
13688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // initial state.
13698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ActivityRecord top =
13708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.performClearTaskLocked(r, launchFlags);
13718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (top != null) {
13728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (top.frontOfTask) {
13738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // Activity aliases may mean we use different
13748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intents for the top activity, so make sure
13758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the task now has the identity of the new
13768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intent.
13778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                top.task.setIntent(r.intent, r.info);
13788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
13798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
13808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    r, top.task);
13818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
13828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
13838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // A special case: we need to
13848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // start the activity because it is not currently
13858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // running, and the caller has asked to clear the
13868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // current task to have this activity at the top.
13878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
13888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // Now pretend like this activity is being started
13898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // by the top of its task, so it is put in the
13908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // right place.
13918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
13928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
13938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (r.realActivity.equals(intentActivity.task.realActivity)) {
13948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case the top activity on the task is the
13958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // same as the one being launched, so we take that
13968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // as a request to bring the task to the foreground.
13978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // If the top activity in the task is the root
13988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // activity, deliver this new intent to it if it
13998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // desires.
14008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
14018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
14028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                && intentActivity.realActivity.equals(r.realActivity)) {
14038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r,
14048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    intentActivity.task);
14058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (intentActivity.frontOfTask) {
14068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.setIntent(r.intent, r.info);
14078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
14088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            intentActivity.deliverNewIntentLocked(callingUid, r.intent);
14098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else if (!r.intent.filterEquals(intentActivity.task.intent)) {
14108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // In this case we are launching the root activity
14118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // of the task, but with a different intent.  We
14128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // should start a new instance on top.
14138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
14148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
14158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
14168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
14178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case an activity is being launched in to an
14188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task, without resetting that task.  This
14198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is typically the situation of launching an activity
14208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from a notification or shortcut.  We want to place
14218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the new activity on top of the current task.
14228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        addingToTask = true;
14238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        sourceRecord = intentActivity;
14248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (!intentActivity.task.rootWasReset) {
14258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case we are launching in to an existing task
14268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // that has not yet been started from its front door.
14278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The current task has been brought to the front.
14288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // Ideally, we'd probably like to place this new task
14298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // at the bottom of its stack, but that's a little hard
14308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // to do with the current organization of the code so
14318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // for now we'll just drop it.
14328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(r.intent, r.info);
14338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (!addingToTask && reuseTask == null) {
14358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We didn't do anything...  but it was needed (a.k.a., client
14368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // don't use that intent!)  And for paranoia, make
14378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
14388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1439de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            setLaunchHomeTaskNextFlag(sourceRecord, intentActivity, targetStack);
1440de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            targetStack.resumeTopActivityLocked(null, options);
14418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
14428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
14438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
144429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
144529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            "startActivityUncheckedLocked: task left null",
144629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            new RuntimeException("here").fillInStackTrace());
14478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_TASK_TO_FRONT;
14488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
14508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
14518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
14528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //String uri = r.intent.toURI();
14548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Intent intent2 = new Intent(uri);
14558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "Given intent: " + r.intent);
14568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "URI is: " + uri);
14578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "To intent: " + intent2);
14588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.packageName != null) {
14608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If the activity being launched is the same as the one currently
14618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // at the top, then we need to check if it should only be launched
14628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // once.
1463ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ActivityStack topStack = getFocusedStack();
1464de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop);
14658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (top != null && r.resultTo == null) {
14668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
14678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (top.app != null && top.app.thread != null) {
14688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
14698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
14708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
14718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top,
14728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    top.task);
14738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // For paranoia, make sure we have correctly
14748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // resumed the top activity.
14758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (doResume) {
1476de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                setLaunchHomeTaskNextFlag(sourceRecord, null, topStack);
1477de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                                topStack.resumeTopActivityLocked(null);
14788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
14798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
14808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
14818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // We don't need to start a new activity, and
14828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the client said not to do anything if that
14838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // is the case, so this is it!
148429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                if (r.task == null)  Slog.v(TAG,
148529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    "startActivityUncheckedLocked: task left null",
148629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    new RuntimeException("here").fillInStackTrace());
14878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
14888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
14898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
149029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            if (r.task == null)  Slog.v(TAG,
149129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
149229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
14938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            return ActivityManager.START_DELIVERED_TO_TOP;
14948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
14958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
14978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
14988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
15008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo != null) {
1501de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho,
1502de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.requestCode, Activity.RESULT_CANCELED, null);
15038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityOptions.abort(options);
150529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (r.task == null)  Slog.v(TAG,
150629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                "startActivityUncheckedLocked: task left null",
150729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                new RuntimeException("here").fillInStackTrace());
15088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            return ActivityManager.START_CLASS_NOT_FOUND;
15098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
15108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean newTask = false;
15128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean keepCurTransition = false;
15138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // Should this be considered a new task?
15158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo == null && !addingToTask
15168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1517de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            targetStack = getCorrectStack(r);
1518de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
15198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (reuseTask == null) {
1520de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
1521de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        null, true);
1522de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
1523de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.task);
15248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else {
1525de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(reuseTask, reuseTask, true);
15268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            newTask = true;
15288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!movedHome) {
1529de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if ((launchFlags &
1530de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
1531de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
1532de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // Caller wants to appear on home activity, so before starting
1533de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // their own activity we will bring home to the front.
1534de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    r.mLaunchHomeTaskNext = true;
1535de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
15368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord != null) {
1538de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            targetStack = sourceRecord.task.stack;
1539de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
15408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!addingToTask &&
15418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
15428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are adding the activity to an existing
15438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // task, but the caller has asked to clear that task if the
15448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // activity is already running.
15458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord top = sourceRecord.task.performClearTaskLocked(r, launchFlags);
15468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                keepCurTransition = true;
15478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
15488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
15498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
15508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // For paranoia, make sure we have correctly
15518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // resumed the top activity.
15528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
1553de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
15548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
15558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityOptions.abort(options);
155729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null)  Slog.v(TAG,
155829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "startActivityUncheckedLocked: task left null",
155929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        new RuntimeException("here").fillInStackTrace());
15608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
15618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
15628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else if (!addingToTask &&
15638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
15648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are launching an activity in our own task
15658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // that may already be running somewhere in the history, and
15668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // we want to shuffle it to the front of the stack if so.
15678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                final ActivityRecord top =
15688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.findActivityInHistoryLocked(r, sourceRecord.task);
15698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
1570de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    final TaskRecord task = top.task;
1571de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    task.moveActivityToFrontLocked(top);
1572de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task);
15738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.updateOptionsLocked(options);
15748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
15758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
1576de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack);
15778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
157929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null)  Slog.v(TAG,
158029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "startActivityUncheckedLocked: task left null",
158129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        new RuntimeException("here").fillInStackTrace());
15828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
15838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
15848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
15858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // An existing activity is starting this new activity, so we want
15868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // to keep the new one in the same task as the one that is starting
15878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // it.
1588de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            r.setTask(sourceRecord.task, sourceRecord.thumbHolder, false);
15898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
15908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in existing task " + r.task);
15918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
15928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
15938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This not being started from an existing activity, and not part
15948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // of a new task...  just put it in the top task, though these days
15958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // this case should never happen.
1596f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            ActivityStack lastStack = getLastStack();
1597f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            targetStack = lastStack != null ? lastStack : mHomeStack;
1598de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
1599f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            ActivityRecord prev = lastStack == null ? null : targetStack.topActivity();
1600de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            r.setTask(prev != null ? prev.task
1601de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
1602de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    null, true);
16038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
16048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in new guessed " + r.task);
16058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
16088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                intent, r.getUriPermissionsLocked());
16098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (newTask) {
16118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
16128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
1614de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        setLaunchHomeTaskNextFlag(sourceRecord, r, targetStack);
16158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
16168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return ActivityManager.START_SUCCESS;
16178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
16188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
1619f333327782e14688e1c198c1192172d51308e90bCraig Mautner    // Checked.
1620f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
1621f333327782e14688e1c198c1192172d51308e90bCraig Mautner            Configuration config) {
1622f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
1623f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1624f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord res = null;
1625f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1626f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> stops = null;
1627f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> finishes = null;
1628f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<UserStartedState> startingUsers = null;
1629f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NS = 0;
1630f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NF = 0;
1631f333327782e14688e1c198c1192172d51308e90bCraig Mautner        IApplicationThread sendThumbnail = null;
1632f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean booting = false;
1633f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean enableScreen = false;
1634f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean activityRemoved = false;
1635f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1636f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord r = ActivityRecord.forToken(token);
1637f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (r != null) {
1638f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
1639f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r.finishLaunchTickingLocked();
1640f333327782e14688e1c198c1192172d51308e90bCraig Mautner            res = r.task.stack.activityIdleInternalLocked(token, fromTimeout, config);
1641f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (res != null) {
1642f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (fromTimeout) {
1643f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
1644f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1645f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1646f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // This is a hack to semi-deal with a race condition
1647f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // in the client where it can be constructed with a
1648f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // newer configuration from when we asked it to launch.
1649f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // We'll update with whatever configuration it now says
1650f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // it used to launch.
1651f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (config != null) {
1652f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    r.configuration = config;
1653f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1654f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1655f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // We are now idle.  If someone is waiting for a thumbnail from
1656f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // us, we can now deliver.
1657f333327782e14688e1c198c1192172d51308e90bCraig Mautner                r.idle = true;
1658f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (allResumedActivitiesIdle()) {
1659f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    mService.scheduleAppGcsLocked();
1660f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1661f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
1662f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    sendThumbnail = r.app.thread;
1663f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    r.thumbnailNeeded = false;
1664f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1665f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1666f333327782e14688e1c198c1192172d51308e90bCraig Mautner                //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
1667f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (!mService.mBooted && isFrontStack(r.task.stack)) {
1668f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    mService.mBooted = true;
1669f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    enableScreen = true;
1670f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1671f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else if (fromTimeout) {
1672f333327782e14688e1c198c1192172d51308e90bCraig Mautner                reportActivityLaunchedLocked(fromTimeout, null, -1, -1);
1673f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1674f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1675f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1676f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Atomically retrieve all of the other things to do.
1677f333327782e14688e1c198c1192172d51308e90bCraig Mautner        stops = processStoppingActivitiesLocked(true);
1678f333327782e14688e1c198c1192172d51308e90bCraig Mautner        NS = stops != null ? stops.size() : 0;
1679f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if ((NF=mFinishingActivities.size()) > 0) {
1680f333327782e14688e1c198c1192172d51308e90bCraig Mautner            finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
1681f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mFinishingActivities.clear();
1682f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1683f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1684f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final ArrayList<ActivityRecord> thumbnails;
1685f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final int NT = mCancelledThumbnails.size();
1686f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (NT > 0) {
1687f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = new ArrayList<ActivityRecord>(mCancelledThumbnails);
1688f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mCancelledThumbnails.clear();
1689f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else {
1690f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = null;
1691f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1692f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1693f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (isFrontStack(mHomeStack)) {
1694f333327782e14688e1c198c1192172d51308e90bCraig Mautner            booting = mService.mBooting;
1695f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.mBooting = false;
1696f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1697f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1698f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mStartingUsers.size() > 0) {
1699f333327782e14688e1c198c1192172d51308e90bCraig Mautner            startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
1700f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mStartingUsers.clear();
1701f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1702f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1703f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Perform the following actions from unsynchronized state.
1704f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final IApplicationThread thumbnailThread = sendThumbnail;
1705f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.post(new Runnable() {
1706f333327782e14688e1c198c1192172d51308e90bCraig Mautner            @Override
1707f333327782e14688e1c198c1192172d51308e90bCraig Mautner            public void run() {
1708f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (thumbnailThread != null) {
1709f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    try {
1710f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        thumbnailThread.requestThumbnail(token);
1711f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    } catch (Exception e) {
1712f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
1713f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.sendPendingThumbnail(null, token, null, null, true);
1714f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
1715f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1716f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1717f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // Report back to any thumbnail receivers.
1718f333327782e14688e1c198c1192172d51308e90bCraig Mautner                for (int i = 0; i < NT; i++) {
1719f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    ActivityRecord r = thumbnails.get(i);
1720f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    mService.sendPendingThumbnail(r, null, null, null, true);
1721f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1722f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1723f333327782e14688e1c198c1192172d51308e90bCraig Mautner        });
1724f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1725f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Stop any activities that are scheduled to do so but have been
1726f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1727f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NS; i++) {
1728f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = stops.get(i);
1729f333327782e14688e1c198c1192172d51308e90bCraig Mautner            final ActivityStack stack = r.task.stack;
1730f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (r.finishing) {
1731f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
1732f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else {
1733f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.stopActivityLocked(r);
1734f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1735f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1736f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1737f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Finish any activities that are scheduled to do so but have been
1738f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1739f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NF; i++) {
1740f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = finishes.get(i);
1741f333327782e14688e1c198c1192172d51308e90bCraig Mautner            activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle");
1742f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1743f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1744f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (booting) {
1745f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.finishBooting();
1746f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else if (startingUsers != null) {
1747f333327782e14688e1c198c1192172d51308e90bCraig Mautner            for (int i = 0; i < startingUsers.size(); i++) {
1748f333327782e14688e1c198c1192172d51308e90bCraig Mautner                mService.finishUserSwitch(startingUsers.get(i));
1749f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1750f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1751f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1752f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mService.trimApplications();
1753f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //dump();
1754f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //mWindowManager.dump();
1755f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1756f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (enableScreen) {
1757f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.enableScreenAfterBoot();
1758f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1759f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1760f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (activityRemoved) {
1761f333327782e14688e1c198c1192172d51308e90bCraig Mautner            getFocusedStack().resumeTopActivityLocked(null);
1762f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1763f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1764f333327782e14688e1c198c1192172d51308e90bCraig Mautner        return res;
1765f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
1766f333327782e14688e1c198c1192172d51308e90bCraig Mautner
17678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppDiedLocked(ProcessRecord app, boolean restarting) {
17688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        // Just in case.
17698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
17708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
1771e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            mStacks.get(stackNdx).handleAppDiedLocked(app, restarting);
17728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
17738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
17748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
17758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
17768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
17778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
17788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
17798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.closeSystemDialogsLocked();
17808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
17818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
17828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
17838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
17848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
17858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
17868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
17878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
17888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
17898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
17908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
17918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
17928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                didSomething = true;
17938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
17948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
17958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
17968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
17978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1798858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    void resumeTopActivitiesLocked() {
1799dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1800f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
1801f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            if (isFrontStack(stack)) {
1802f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner                stack.resumeTopActivityLocked(null);
1803f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            }
18048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
18078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
18088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
18098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
18108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
18118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.finishTopRunningActivityLocked(app);
18128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
18158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) {
18168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) {
18188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return;
18198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
18208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1823967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ActivityStack getStack(int stackId) {
18248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
18268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.getStackId() == stackId) {
18278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return stack;
18288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
18298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
18318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1833967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ArrayList<ActivityStack> getStacks() {
1834967212cb542e6eeb308678367b53381bff984c31Craig Mautner        return new ArrayList<ActivityStack>(mStacks);
1835967212cb542e6eeb308678367b53381bff984c31Craig Mautner    }
1836967212cb542e6eeb308678367b53381bff984c31Craig Mautner
1837967212cb542e6eeb308678367b53381bff984c31Craig Mautner    int createStack() {
1838858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        while (true) {
1839858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (++mLastStackId <= HOME_STACK_ID) {
1840858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                mLastStackId = HOME_STACK_ID + 1;
1841858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1842858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (getStack(mLastStackId) == null) {
1843858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                break;
18448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
18458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
1846858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId));
1847858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        return mLastStackId;
18488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
18508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
18518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
18528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
18538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
18548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
18558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        stack.moveTask(taskId, toTop);
1857967212cb542e6eeb308678367b53381bff984c31Craig Mautner        stack.resumeTopActivityLocked(null);
18588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
18608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findTaskLocked(Intent intent, ActivityInfo info) {
18618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            final ActivityRecord ar = mStacks.get(stackNdx).findTaskLocked(intent, info);
18638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
18648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
18658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
18668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
18678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
18688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
18698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
18708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
18718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            final ActivityRecord ar = mStacks.get(stackNdx).findActivityLocked(intent, info);
18738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
18748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
18758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
18768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
18778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
18788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
18798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
18808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
18818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
18828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mStacks.get(stackNdx).stopIfSleepingLocked();
18838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
18848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
18858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
18868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
18878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean timedout = false;
18888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
18898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
18908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
18918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mResumedActivity != null) {
18928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                stack.stopIfSleepingLocked();
18938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                final long endTime = System.currentTimeMillis() + timeout;
18948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                while (stack.mResumedActivity != null || stack.mPausingActivity != null) {
18958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    long delay = endTime - System.currentTimeMillis();
18968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (delay <= 0) {
18978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        Slog.w(TAG, "Activity manager shutdown timed out");
18988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        timedout = true;
18998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        break;
19008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
19018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
19028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        mService.wait();
19038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
19048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
19058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
19068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
19078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
19098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
1912ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
19138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
1914ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            stack.awakeFromSleepingLocked();
1915ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (isFrontStack(stack)) {
1916de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stack.resumeTopActivityLocked(null);
1917de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
19188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1921ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean reportResumedActivityLocked(ActivityRecord r) {
1922ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = r.task.stack;
1923ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (isFrontStack(stack)) {
1924ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mService.reportResumedActivityLocked(r);
1925ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mService.setFocusedActivityLocked(r);
1926ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
1927ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (allResumedActivitiesComplete()) {
1928ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
1929ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.executeAppTransition();
1930ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return true;
1931ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
1932ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return false;
1933ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
1934ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
19358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
19368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.handleAppCrashLocked(app);
19408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1943de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
1944580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // First the front stacks. In case any are not fullscreen and are in front of home.
1945580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        boolean showHomeBehindStack = false;
1946de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1947580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
1948580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (isFrontStack(stack)) {
1949580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                showHomeBehindStack =
1950580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                        stack.ensureActivitiesVisibleLocked(starting, configChanges);
1951580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
1952580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        }
1953580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // Now do back stacks.
1954580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
1955580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
1956580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (!isFrontStack(stack)) {
1957580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                stack.ensureActivitiesVisibleLocked(starting, configChanges, showHomeBehindStack);
1958580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
19598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
19638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.scheduleDestroyActivities(app, false, reason);
19678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
1971858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mUserStates.put(mCurrentUser, new UserState());
19722420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
1973858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        UserState userState = mUserStates.get(userId);
1974858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        if (userState != null) {
1975858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            userState.restore();
1976858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mUserStates.delete(userId);
1977858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        } else {
1978858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mFocusedStack = null;
1979858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mStackState = STACK_STATE_HOME_IN_FRONT;
19808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
1981858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
1982858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStartingUsers.add(uss);
1983858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        boolean haveActivities = mHomeStack.switchUserLocked(userId, uss);
1984858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
1985858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        resumeTopActivitiesLocked();
1986858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
19878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return haveActivities;
19882219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
19892219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
1990de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
1991de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        int N = mStoppingActivities.size();
1992de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (N <= 0) return null;
1993de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
1994de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ArrayList<ActivityRecord> stops = null;
1995de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
1996de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean nowVisible = allResumedActivitiesVisible();
1997de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int i=0; i<N; i++) {
1998de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord s = mStoppingActivities.get(i);
1999de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
2000de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + nowVisible + " waitingVisible=" + s.waitingVisible
2001de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + " finishing=" + s.finishing);
2002de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (s.waitingVisible && nowVisible) {
2003de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mWaitingVisibleActivities.remove(s);
2004de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                s.waitingVisible = false;
2005de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (s.finishing) {
2006de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // If this activity is finishing, it is sitting on top of
2007de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // everyone else but we now know it is no longer needed...
2008de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // so get rid of it.  Otherwise, we need to go through the
2009de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // normal flow and hide it once we determine that it is
2010de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // hidden by the activities in front of it.
2011de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
2012ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWindowManager.setAppVisibility(s.appToken, false);
2013de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2014de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2015de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) {
2016de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
2017de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (stops == null) {
2018de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    stops = new ArrayList<ActivityRecord>();
2019de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2020de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stops.add(s);
2021de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStoppingActivities.remove(i);
2022de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                N--;
2023de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                i--;
2024de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2025de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2026de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2027de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return stops;
2028de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
2029de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2030cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    void validateTopActivitiesLocked() {
2031cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2032cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2033cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityRecord r = stack.topRunningActivityLocked(null);
2034cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (isFrontStack(stack)) {
2035cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r == null) {
2036cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: null top activity, stack=" + stack);
2037cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                } else {
2038cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    if (stack.mPausingActivity != null) {
2039cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r +
2040cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                            " state=" + r.state);
2041cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2042cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    if (r.state != ActivityState.INITIALIZING &&
2043cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                            r.state != ActivityState.RESUMED) {
2044cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r +
2045cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                                " state=" + r.state);
2046cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2047cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2048cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            } else {
2049cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (stack.mResumedActivity != null) {
2050cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r +
2051cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        " state=" + r.state);
2052cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2053cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r != null && (r.state == ActivityState.INITIALIZING
2054cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        || r.state == ActivityState.RESUMED)) {
2055cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: activity in back resumed r=" + r +
2056cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                            " state=" + r.state);
2057cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2058cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
2059cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
2060cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
2061cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
2062270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
2063270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:");
2064270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner                pw.println(mDismissKeyguardOnNextActivity);
2065270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
20668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
206720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
2068ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack().getDumpActivitiesLocked(name);
206920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
207020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
20718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
20728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
20738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
20748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
20758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
20768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.print(mStacks.indexOf(stack)); pw.println(":");
20778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage);
20788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
20798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  Running activities (most recent first):");
20808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            dumpHistoryList(fd, pw, stack.mLRUActivities, "  ", "Run", false, !dumpAll, false,
20818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    dumpPackage);
20828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mGoingToSleepActivities.size() > 0) {
20838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
20848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  Activities waiting to sleep:");
20858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                dumpHistoryList(fd, pw, stack.mGoingToSleepActivities, "  ", "Sleep", false,
20868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        !dumpAll, false, dumpPackage);
20878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print("  Stack #"); pw.println(mStacks.indexOf(stack));
20908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.mPausingActivity != null) {
20918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mPausingActivity: " + stack.mPausingActivity);
20928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mResumedActivity: " + stack.mResumedActivity);
20948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpAll) {
20958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mLastPausedActivity: " + stack.mLastPausedActivity);
20968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println("  mSleepTimeout: " + stack.mSleepTimeout);
20978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2100f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mFinishingActivities.size() > 0) {
2101f333327782e14688e1c198c1192172d51308e90bCraig Mautner            pw.println(" ");
2102f333327782e14688e1c198c1192172d51308e90bCraig Mautner            pw.println("  Activities waiting to finish:");
2103f333327782e14688e1c198c1192172d51308e90bCraig Mautner            dumpHistoryList(fd, pw, mFinishingActivities, "  ", "Fin", false, !dumpAll, false,
2104f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    dumpPackage);
2105f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2106f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2107de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (mStoppingActivities.size() > 0) {
2108de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            pw.println(" ");
2109de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            pw.println("  Activities waiting to stop:");
2110de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            dumpHistoryList(fd, pw, mStoppingActivities, "  ", "Stop", false, !dumpAll, false,
2111de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    dumpPackage);
2112de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2113de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2114de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (mWaitingVisibleActivities.size() > 0) {
2115de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            pw.println(" ");
2116de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            pw.println("  Activities waiting for another to become visible:");
2117de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            dumpHistoryList(fd, pw, mWaitingVisibleActivities, "  ", "Wait", false, !dumpAll,
2118de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    false, dumpPackage);
2119de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2120de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
21218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (dumpAll) {
21228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(" ");
21238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println("  mCurTaskId: " + mCurTaskId);
21248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return true;
21268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
21288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    static final void dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
21298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
21308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String dumpPackage) {
21318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
21328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean needNL = false;
21338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String innerPrefix = prefix + "      ";
21348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final String[] args = new String[0];
21358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
21368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
21378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
21388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
21398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
21418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
21428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(" ");
21438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
21448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
21468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
21478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
21488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
21498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
21508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
21518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
21528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
21538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
21548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
21558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
21568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
21578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
21588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
21598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
21618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
21628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
21638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
21648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
21658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
21668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
21678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
21688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
21698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
21708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
21718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
21738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
21748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
21758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
21768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
21778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
21788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
21798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
21808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
21818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
21828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
21838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
21848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
21858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
21868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
21878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
21888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
21898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
21908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
21918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
21928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
21938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2196ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2197f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void scheduleIdleTimeoutLocked(ActivityRecord next) {
2198c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
2199c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
2200f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2201f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2202f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final void scheduleIdleLocked() {
2203f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.obtainMessage(IDLE_NOW_MSG).sendToTarget();
2204f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2205f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2206f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void removeTimeoutsForActivityLocked(ActivityRecord r) {
2207f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
2208f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2209f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2210ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    private final class ActivityStackSupervisorHandler extends Handler {
2211f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2212ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public ActivityStackSupervisorHandler(Looper looper) {
2213ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            super(looper);
2214ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2215ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2216f333327782e14688e1c198c1192172d51308e90bCraig Mautner        void activityIdleInternal(ActivityRecord r) {
2217f333327782e14688e1c198c1192172d51308e90bCraig Mautner            synchronized (mService) {
2218f333327782e14688e1c198c1192172d51308e90bCraig Mautner                activityIdleInternalLocked(r != null ? r.appToken : null, true, null);
2219f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
2220f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
2221f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2222ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        @Override
2223ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public void handleMessage(Message msg) {
2224ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            switch (msg.what) {
2225f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_TIMEOUT_MSG: {
2226f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    if (mService.mDidDexOpt) {
2227f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.mDidDexOpt = false;
2228f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
2229f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        nmsg.obj = msg.obj;
2230f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
2231f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        return;
2232f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
2233f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // We don't at this point know if the activity is fullscreen,
2234f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // so we need to be conservative and assume it isn't.
2235f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2236f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
2237f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_NOW_MSG: {
2238f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2239f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
2240ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
2241ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2242ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2243858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2244858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    private final class UserState {
2245858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        final ActivityStack mSavedFocusedStack;
2246858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        final int mSavedStackState;
2247858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2248858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        public UserState() {
2249858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            ActivityStackSupervisor supervisor = ActivityStackSupervisor.this;
2250858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mSavedFocusedStack = supervisor.mFocusedStack;
2251858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            mSavedStackState = supervisor.mStackState;
2252858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        }
2253858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
2254858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        void restore() {
2255858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            ActivityStackSupervisor supervisor = ActivityStackSupervisor.this;
2256858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            supervisor.mFocusedStack = mSavedFocusedStack;
2257858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            supervisor.mStackState = mSavedStackState;
2258858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        }
2259858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner    }
2260270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
2261