1270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner/*
2270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Copyright (C) 2013 The Android Open Source Project
3270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner *
4270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License");
5270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * you may not use this file except in compliance with the License.
6270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * You may obtain a copy of the License at
7270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner *
8270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner *      http://www.apache.org/licenses/LICENSE-2.0
9270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner *
10270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Unless required by applicable law or agreed to in writing, software
11270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS,
12270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * See the License for the specific language governing permissions and
14270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * limitations under the License.
15270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner */
16270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
17270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpackage com.android.server.am;
18270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
196170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.Manifest.permission.START_ANY_ACTIVITY;
2029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautnerimport static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
2129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautnerimport static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME;
226170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.content.pm.PackageManager.PERMISSION_GRANTED;
232420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.localLOGV;
2423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_CONFIGURATION;
25e7c58b6d7d761b93e785b0a399e5b00fdb82f4ceCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_FOCUS;
260eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_PAUSE;
276170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_RESULTS;
280eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_STACK;
292420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_SWITCH;
308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_TASKS;
318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING;
3205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautnerimport static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG;
338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG;
348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
352420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity;
3623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager;
3723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions;
3823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals;
39ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager;
4023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread;
4120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.IThumbnailReceiver;
4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent;
4320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo;
4423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult;
452420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo;
4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName;
472219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context;
4823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender;
492219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent;
5023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender;
512219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo;
5223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo;
5323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager;
5423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo;
5523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration;
5623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder;
578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle;
58b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug;
59ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler;
6023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder;
612219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper;
622420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message;
6323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor;
640eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport android.os.PowerManager;
657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautnerimport android.os.Process;
668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException;
6723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock;
686170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle;
692420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog;
708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog;
714f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautnerimport android.util.SparseIntArray;
722219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
7323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity;
74cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe;
756170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport com.android.server.am.ActivityManagerService.PendingActivityLaunch;
762420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState;
77de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautnerimport com.android.server.wm.StackBox;
78ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService;
7923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor;
818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException;
82270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter;
832219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList;
848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List;
85270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
86be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornpublic final class ActivityStackSupervisor {
87de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG = ActivityManagerService.DEBUG || false;
88de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_ADD_REMOVE = DEBUG || false;
89de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_APP = DEBUG || false;
90de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    static final boolean DEBUG_SAVED_STATE = DEBUG || false;
91a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner    static final boolean DEBUG_STATES = DEBUG || false;
92b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner    static final boolean DEBUG_IDLE = DEBUG || false;
932420ead0326bfd2587da6231be419e758dba1930Craig Mautner
942219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public static final int HOME_STACK_ID = 0;
95270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
96f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** How long we wait until giving up on the last activity telling us it is idle. */
97f333327782e14688e1c198c1192172d51308e90bCraig Mautner    static final int IDLE_TIMEOUT = 10*1000;
98f333327782e14688e1c198c1192172d51308e90bCraig Mautner
990eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** How long we can hold the sleep wake lock before giving up. */
1000eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT = 5*1000;
1010eea92c67b292b005c152641a12b920fe145826cCraig Mautner
1027ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // How long we can hold the launch wake lock before giving up.
1037ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT = 10*1000;
1047ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
10505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG;
10605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1;
10705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2;
1080eea92c67b292b005c152641a12b920fe145826cCraig Mautner    static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3;
1097ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4;
1107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // For debugging to make sure the caller when acquiring/releasing our
1127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    // wake lock is the system process.
1137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    static final boolean VALIDATE_WAKE_LOCK_CALLER = false;
114f333327782e14688e1c198c1192172d51308e90bCraig Mautner
115270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    final ActivityManagerService mService;
1162219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Context mContext;
1172219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    final Looper mLooper;
118270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
119ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ActivityStackSupervisorHandler mHandler;
120ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
121ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** Short cut */
122ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    WindowManagerService mWindowManager;
123ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
124270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    /** Dismiss the keyguard after the next activity is displayed? */
1255314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner    boolean mDismissKeyguardOnNextActivity = false;
126270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
1278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Identifier counter for all ActivityStacks */
128d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner    private int mLastStackId = HOME_STACK_ID;
1298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** Task identifier that activities are currently being started in.  Incremented each time a
1318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * new task is created. */
1328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    private int mCurTaskId = 0;
1338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1342420ead0326bfd2587da6231be419e758dba1930Craig Mautner    /** The current user */
1352420ead0326bfd2587da6231be419e758dba1930Craig Mautner    private int mCurrentUser;
1362420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** The stack containing the launcher app */
1382219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ActivityStack mHomeStack;
13920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
140de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** The non-home stack currently receiving input or launching the next activity. If home is
14141c0f353c6209bf02708483b6f712fafde759925Craig Mautner     * in front then mHomeStack overrides mFocusedStack.
14241c0f353c6209bf02708483b6f712fafde759925Craig Mautner     * DO NOT ACCESS DIRECTLY - It may be null, use getFocusedStack() */
14329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    private ActivityStack mFocusedStack;
1448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /** All the non-launcher stacks */
1462219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
1472219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
148de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_FRONT = 0;
149de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_BACK = 1;
150de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_IN_BACK = 2;
151de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private static final int STACK_STATE_HOME_TO_FRONT = 3;
152de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    private int mStackState = STACK_STATE_HOME_IN_FRONT;
153de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
154de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are waiting for a new activity to become visible before completing
155de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * whatever operation they are supposed to do. */
156de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>();
157de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
158ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next visible activity. */
159ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible =
160ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
161ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
162ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    /** List of processes waiting to find out about the next launched activity. */
163ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched =
164ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            new ArrayList<IActivityManager.WaitResult>();
165ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
166de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** List of activities that are ready to be stopped, but waiting for the next activity to
167de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * settle down before doing so. */
168de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>();
169de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
170f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of activities that are ready to be finished, but waiting for the previous activity to
171f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * settle down before doing so.  It contains ActivityRecord objects. */
172f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>();
173f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1740eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** List of activities that are in the process of going to sleep. */
1750eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>();
1760eea92c67b292b005c152641a12b920fe145826cCraig Mautner
177f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** List of ActivityRecord objects that have been finished and must still report back to a
178f333327782e14688e1c198c1192172d51308e90bCraig Mautner     * pending thumbnail receiver. */
179f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<ActivityRecord> mCancelledThumbnails = new ArrayList<ActivityRecord>();
180f333327782e14688e1c198c1192172d51308e90bCraig Mautner
181f333327782e14688e1c198c1192172d51308e90bCraig Mautner    /** Used on user changes */
182f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>();
183f333327782e14688e1c198c1192172d51308e90bCraig Mautner
184de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity
185de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner     * is being brought in front of us. */
186de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean mUserLeaving = false;
187de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
1880eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /** Set when we have taken too long waiting to go to sleep. */
1890eea92c67b292b005c152641a12b920fe145826cCraig Mautner    boolean mSleepTimeout = false;
1900eea92c67b292b005c152641a12b920fe145826cCraig Mautner
1910eea92c67b292b005c152641a12b920fe145826cCraig Mautner    /**
1927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * We don't want to allow the device to go to sleep while in the process
1937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * of launching an activity.  This is primarily to allow alarm intent
1947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * receivers to launch an activity and get that to run before the device
1957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     * goes back to sleep.
1967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner     */
1977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    final PowerManager.WakeLock mLaunchingActivity;
1987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    /**
2000eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * Set when the system is going to sleep, until we have
2010eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * successfully paused the current activity and released our wake lock.
2020eea92c67b292b005c152641a12b920fe145826cCraig Mautner     * At that point the system is allowed to actually sleep.
2030eea92c67b292b005c152641a12b920fe145826cCraig Mautner     */
2040eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final PowerManager.WakeLock mGoingToSleep;
2050eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2064f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner    /** Stack id of the front stack when user switched, indexed by userId. */
2074f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner    SparseIntArray mUserStackInFront = new SparseIntArray(2);
20893529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
2092219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    public ActivityStackSupervisor(ActivityManagerService service, Context context,
2102219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner            Looper looper) {
211270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mService = service;
2122219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mContext = context;
2132219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner        mLooper = looper;
2140eea92c67b292b005c152641a12b920fe145826cCraig Mautner        PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
2150eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep");
216ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHandler = new ActivityStackSupervisorHandler(looper);
2177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
2187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
2197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
2207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity =
2217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch");
2227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.setReferenceCounted(false);
2232219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2242219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
225ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void setWindowManager(WindowManagerService wm) {
226ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager = wm;
227ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID);
2288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        mStacks.add(mHomeStack);
229270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
230270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
231270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void dismissKeyguard() {
2325314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner        if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen("");
233270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        if (mDismissKeyguardOnNextActivity) {
234270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner            mDismissKeyguardOnNextActivity = false;
235ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.dismissKeyguard();
236270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        }
237270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
238270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
239ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    ActivityStack getFocusedStack() {
240f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        if (mFocusedStack == null) {
241f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            return mHomeStack;
242f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner        }
243de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
244de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
245de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
246de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
247de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
248de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
249de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
25029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
25220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
25320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
254de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityStack getLastStack() {
255de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_FRONT:
257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
258de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return mHomeStack;
259de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
260de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_IN_BACK:
261de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            default:
26229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                return mFocusedStack;
263de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2642219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
2652219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
266de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean isFrontStack(ActivityStack stack) {
267ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack());
26820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
26920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
270de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void moveHomeStack(boolean toFront) {
271de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean homeInFront = isFrontStack(mHomeStack);
272de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (homeInFront ^ toFront) {
27376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: mStackState old=" +
27476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                    stackStateToString(mStackState) + " new=" + stackStateToString(homeInFront ?
27576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                    STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT));
276de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            mStackState = homeInFront ? STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT;
277de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
278de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
279de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2808e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    void moveHomeToTop() {
28169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        moveHomeStack(true);
2828e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner        mHomeStack.moveHomeTaskToTop();
2838e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    }
2848e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner
2858e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    boolean resumeHomeActivity(ActivityRecord prev) {
2868e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner        moveHomeToTop();
28769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        if (prev != null) {
288ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner            prev.task.mOnTopOfHome = false;
28969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
290a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner        ActivityRecord r = mHomeStack.topRunningActivityLocked(null);
291760b2314d90bfe8afc4aafb7039b1de617897e10Craig Mautner        if (r != null && r.isHomeActivity()) {
292a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner            mService.setFocusedActivityLocked(r);
29305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            return resumeTopActivitiesLocked(mHomeStack, prev, null);
29469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        }
29569ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner        return mService.startHomeActivityLocked(mCurrentUser);
29669ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner    }
29769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner
298270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    void setDismissKeyguard(boolean dismiss) {
2995314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner        if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(" dismiss=" + dismiss);
300270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner        mDismissKeyguardOnNextActivity = dismiss;
301270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
302270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner
3038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    TaskRecord anyTaskForIdLocked(int id) {
3048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
3058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            ActivityStack stack = mStacks.get(stackNdx);
3068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            TaskRecord task = stack.taskForIdLocked(id);
3078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (task != null) {
3088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return task;
3098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
3108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
3118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
3128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
3138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
3146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    ActivityRecord isInAnyStackLocked(IBinder token) {
3156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
3166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final ActivityRecord r = mStacks.get(stackNdx).isInStackLocked(token);
3176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (r != null) {
3186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return r;
3196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
3206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
3216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return null;
3226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
3236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
3248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    int getNextTaskId() {
3258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        do {
3268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            mCurTaskId++;
3278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mCurTaskId <= 0) {
3288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                mCurTaskId = 1;
3298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
3308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        } while (anyTaskForIdLocked(mCurTaskId) != null);
3318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return mCurTaskId;
3328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
3338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
334de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void removeTask(TaskRecord task) {
335b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        mWindowManager.removeTask(task.taskId);
336de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack stack = task.stack;
337b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        final ActivityRecord r = stack.mResumedActivity;
338b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        if (r != null && r.task == task) {
339b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner            stack.mResumedActivity = null;
340b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        }
341de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.removeTask(task) && !stack.isHomeStack()) {
342a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner            if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack);
343de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            mStacks.remove(stack);
3444cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner            final int stackId = stack.mStackId;
345ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            final int nextStackId = mWindowManager.removeStack(stackId);
346a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner            // TODO: Perhaps we need to let the ActivityManager determine the next focus...
347ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (mFocusedStack == null || mFocusedStack.mStackId == stackId) {
3481602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner                // If this is the last app stack, set mFocusedStack to null.
34929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mFocusedStack = nextStackId == HOME_STACK_ID ? null : getStack(nextStackId);
350de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
351de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
352de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
353de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
354de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    ActivityRecord resumedAppLocked() {
355ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        ActivityStack stack = getFocusedStack();
356ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (stack == null) {
357ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return null;
358ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
359de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityRecord resumedActivity = stack.mResumedActivity;
360de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (resumedActivity == null || resumedActivity.app == null) {
361de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            resumedActivity = stack.mPausingActivity;
362de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (resumedActivity == null || resumedActivity.app == null) {
363de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resumedActivity = stack.topRunningActivityLocked(null);
364de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
365de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
366de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return resumedActivity;
367de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
368de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
36920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception {
37020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        boolean didSomething = false;
37120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        final String processName = app.processName;
37220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
37320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
374858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (!isFrontStack(stack)) {
375858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                continue;
376858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
37720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            ActivityRecord hr = stack.topRunningActivityLocked(null);
37820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            if (hr != null) {
37920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                if (hr.app == null && app.uid == hr.info.applicationInfo.uid
38020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        && processName.equals(hr.processName)) {
38120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    try {
38220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        if (headless) {
38320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            Slog.e(TAG, "Starting activities not supported on headless device: "
38420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                                    + hr);
3852420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } else if (realStartActivityLocked(hr, app, true, true)) {
38620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                            didSomething = true;
38720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        }
38820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    } catch (Exception e) {
38920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        Slog.w(TAG, "Exception in new application when starting activity "
39020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                              + hr.intent.getComponent().flattenToShortString(), e);
39120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                        throw e;
39220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                    }
39320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                }
39420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
39520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
396b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (!didSomething) {
397b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
398b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        }
39920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return didSomething;
40020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
40120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
40220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    boolean allResumedActivitiesIdle() {
40320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
4047ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
4057ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (!isFrontStack(stack)) {
4067ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                continue;
4077ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
4087ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            final ActivityRecord resumedActivity = stack.mResumedActivity;
409dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner            if (resumedActivity == null || !resumedActivity.idle) {
41020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                return false;
41120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
41220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
41320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return true;
41420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
41520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
416de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesComplete() {
417de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
418de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
419967212cb542e6eeb308678367b53381bff984c31Craig Mautner            if (isFrontStack(stack)) {
420de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                final ActivityRecord r = stack.mResumedActivity;
421de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (r != null && r.state != ActivityState.RESUMED) {
422de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    return false;
423de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
424de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
425de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
426de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        // TODO: Not sure if this should check if all Paused are complete too.
427de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        switch (mStackState) {
428de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_BACK:
42976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" +
43076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_BACK) + " new=" +
43176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_IN_BACK));
432de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStackState = STACK_STATE_HOME_IN_BACK;
433de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                break;
434de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            case STACK_STATE_HOME_TO_FRONT:
43576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" +
43676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_FRONT) + " new=" +
43776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_IN_FRONT));
438de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStackState = STACK_STATE_HOME_IN_FRONT;
439de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                break;
440de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
441de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
442de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
443de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
444de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allResumedActivitiesVisible() {
445de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
446de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
447de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityRecord r = stack.mResumedActivity;
448de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (r != null && (!r.nowVisible || r.waitingVisible)) {
449de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                return false;
450de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
451de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
452de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return true;
453de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
454de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
4552acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner    /**
4562acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * Pause all activities in either all of the stacks or just the back stacks.
4572acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving().
4582acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     * @return true if any activity was paused as a result of this call.
4592acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner     */
4605314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner    boolean pauseBackStacks(boolean userLeaving) {
461cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        boolean someActivityPaused = false;
462cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
463cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
4645314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner            if (!isFrontStack(stack) && stack.mResumedActivity != null) {
4655314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner                if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack +
466ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        " mResumedActivity=" + stack.mResumedActivity);
467cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                stack.startPausingLocked(userLeaving, false);
468cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                someActivityPaused = true;
469cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
470cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
471cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        return someActivityPaused;
472cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
473cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
474de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    boolean allPausedActivitiesComplete() {
475ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        boolean pausing = true;
476de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
477de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
47869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            final ActivityRecord r = stack.mPausingActivity;
47969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner            if (r != null && r.state != ActivityState.PAUSED
48069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPED
48169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner                    && r.state != ActivityState.STOPPING) {
482ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_STATES) {
483ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state);
484ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    pausing = false;
485ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                } else {
486ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    return false;
487ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
488de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
489de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
490ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        return pausing;
491de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
492de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
493ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityVisibleLocked(ActivityRecord r) {
494858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) {
495ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            WaitResult w = mWaitingActivityVisible.get(i);
496ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = false;
497ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
498ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
499ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
500ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = SystemClock.uptimeMillis() - w.thisTime;
501ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = w.totalTime;
502ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
503ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
504ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        dismissKeyguard();
505ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
506ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
507ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r,
508ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            long thisTime, long totalTime) {
509ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) {
510c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner            WaitResult w = mWaitingActivityLaunched.remove(i);
511ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.timeout = timeout;
512ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            if (r != null) {
513ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                w.who = new ComponentName(r.info.packageName, r.info.name);
514ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
515ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.thisTime = thisTime;
516ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            w.totalTime = totalTime;
517ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
518ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mService.notifyAll();
519ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
520ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
52129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    ActivityRecord topRunningActivityLocked() {
5221602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        final ActivityStack focusedStack = getFocusedStack();
5231602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        ActivityRecord r = focusedStack.topRunningActivityLocked(null);
5241602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner        if (r != null) {
5251602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            return r;
52629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
5271602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner
52829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
52929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
530ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (stack != focusedStack && isFrontStack(stack)) {
53129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                r = stack.topRunningActivityLocked(null);
53229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                if (r != null) {
53329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    return r;
53429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                }
53529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
53629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
53729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        return null;
53829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
53929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
54020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver,
54120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            PendingThumbnailsRecord pending, List<RunningTaskInfo> list) {
54220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        ActivityRecord r = null;
543c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner
544c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // Gather all of the running tasks for each stack into runningTaskLists.
545c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        final int numStacks = mStacks.size();
546c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        ArrayList<RunningTaskInfo>[] runningTaskLists = new ArrayList[numStacks];
547c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        for (int stackNdx = numStacks - 1; stackNdx >= 0; --stackNdx) {
54820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
549c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>();
550c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            runningTaskLists[stackNdx] = stackTaskList;
551c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            final ActivityRecord ar = stack.getTasksLocked(receiver, pending, stackTaskList);
552de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (isFrontStack(stack)) {
55320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner                r = ar;
55420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner            }
55520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        }
556c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner
557c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // The lists are already sorted from most recent to oldest. Just pull the most recent off
558c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        // each list and add it to list. Stop when all lists are empty or maxNum reached.
559c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        while (maxNum > 0) {
560c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            long mostRecentActiveTime = Long.MIN_VALUE;
561c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            ArrayList<RunningTaskInfo> selectedStackList = null;
562c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
563c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists[stackNdx];
564c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                if (!stackTaskList.isEmpty()) {
565c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    final long lastActiveTime = stackTaskList.get(0).lastActiveTime;
566c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    if (lastActiveTime > mostRecentActiveTime) {
567c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        mostRecentActiveTime = lastActiveTime;
568c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                        selectedStackList = stackTaskList;
569c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                    }
570c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                }
571c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
572c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            if (selectedStackList != null) {
573c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                list.add(selectedStackList.remove(0));
574c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                --maxNum;
575c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            } else {
576c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner                break;
577c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner            }
578c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner        }
579c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner
58020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner        return r;
58120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
58220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
58323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags,
58423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String profileFile, ParcelFileDescriptor profileFd, int userId) {
58523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
58623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo;
58723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
58823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ResolveInfo rInfo =
58923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                AppGlobals.getPackageManager().resolveIntent(
59023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent, resolvedType,
59123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        PackageManager.MATCH_DEFAULT_ONLY
59223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    | ActivityManagerService.STOCK_PM_FLAGS, userId);
59323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = rInfo != null ? rInfo.activityInfo : null;
59423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } catch (RemoteException e) {
59523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            aInfo = null;
59623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
59723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
59823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (aInfo != null) {
59923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Store the found target back into the intent, because now that
60023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // we have it we never want to do this again.  For example, if the
60123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // user navigates back to this point in the history, we should
60223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // always restart the exact same activity.
60323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            intent.setComponent(new ComponentName(
60423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo.applicationInfo.packageName, aInfo.name));
60523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
60623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            // Don't debug things in the system process
60723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) {
60823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
60923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setDebugApp(aInfo.processName, true, false);
61023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
61123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
61223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
61323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) {
61423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
61523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName);
61623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
61723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
61823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
61923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (profileFile != null) {
62023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (!aInfo.processName.equals("system")) {
62123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    mService.setProfileApp(aInfo.applicationInfo, aInfo.processName,
62223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            profileFile, profileFd,
62323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0);
62423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
62523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
62623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
62723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return aInfo;
62823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
62923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
6302219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    void startHomeActivity(Intent intent, ActivityInfo aInfo) {
6318e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner        moveHomeToTop();
6326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0,
6332219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner                null, false, null);
6348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
6358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
63623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivityMayWait(IApplicationThread caller, int callingUid,
63723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String callingPackage, Intent intent, String resolvedType, IBinder resultTo,
63823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            String resultWho, int requestCode, int startFlags, String profileFile,
63923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config,
64023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
64123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Refuse possible leaked file descriptors
64223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intent != null && intent.hasFileDescriptors()) {
64323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("File descriptors passed in Intent");
64423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
64523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        boolean componentSpecified = intent.getComponent() != null;
64623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
64723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Don't modify the client's object!
64823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        intent = new Intent(intent);
64923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
65023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        // Collect information about the target of the Intent.
65123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags,
65223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                profileFile, profileFd, userId);
65323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
65423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        synchronized (mService) {
65523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            int callingPid;
65623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (callingUid >= 0) {
65723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = -1;
65823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else if (caller == null) {
65923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = Binder.getCallingPid();
66023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingUid = Binder.getCallingUid();
66123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            } else {
66223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                callingPid = callingUid = -1;
66323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
66423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
665ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            final ActivityStack stack = getFocusedStack();
666de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            stack.mConfigWillChange = config != null
66723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    && mService.mConfiguration.diff(config) != 0;
66823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (DEBUG_CONFIGURATION) Slog.v(TAG,
669de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    "Starting activity when config will change = " + stack.mConfigWillChange);
67023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
67123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            final long origId = Binder.clearCallingIdentity();
67223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
67323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (aInfo != null &&
67423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
67523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // This may be a heavy-weight process!  Check to see if we already
67623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // have another, different heavy-weight process running.
67723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) {
67823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (mService.mHeavyWeightProcess != null &&
67923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid ||
68023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) {
68123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        int realCallingUid = callingUid;
68223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (caller != null) {
68323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ProcessRecord callerApp = mService.getRecordForAppLocked(caller);
68423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            if (callerApp != null) {
68523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid = callerApp.info.uid;
68623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } else {
68723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                Slog.w(TAG, "Unable to find app for caller " + caller
68876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                                      + " (pid=" + callingPid + ") when starting: "
68923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                      + intent.toString());
69023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityOptions.abort(options);
69123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                return ActivityManager.START_PERMISSION_DENIED;
69223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
69323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
69423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
69523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        IIntentSender target = mService.getIntentSenderLocked(
69623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                ActivityManager.INTENT_SENDER_ACTIVITY, "android",
69723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                realCallingUid, userId, null, null, 0, new Intent[] { intent },
69823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT
69923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                | PendingIntent.FLAG_ONE_SHOT, null);
70023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
70123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        Intent newIntent = new Intent();
70223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (requestCode >= 0) {
70323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            // Caller is requesting a result.
70423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true);
70523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
70623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT,
70723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                new IntentSender(target));
70823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        if (mService.mHeavyWeightProcess.activities.size() > 0) {
70923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0);
71023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP,
71123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.packageName);
71223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK,
71323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    hist.task.taskId);
71423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
71523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP,
71623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                aInfo.packageName);
71723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setFlags(intent.getFlags());
71823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        newIntent.setClassName("android",
71923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                HeavyWeightSwitcherActivity.class.getName());
72023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        intent = newIntent;
72123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        resolvedType = null;
72223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        caller = null;
72323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingUid = Binder.getCallingUid();
72423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        callingPid = Binder.getCallingPid();
72523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        componentSpecified = true;
72623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
72723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            ResolveInfo rInfo =
72823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                AppGlobals.getPackageManager().resolveIntent(
72923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        intent, null,
73023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        PackageManager.MATCH_DEFAULT_ONLY
73123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                        | ActivityManagerService.STOCK_PM_FLAGS, userId);
73223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = rInfo != null ? rInfo.activityInfo : null;
73323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = mService.getActivityInfoForUser(aInfo, userId);
73423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (RemoteException e) {
73523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo = null;
73623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
73723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
73823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
73923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
74023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
7416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int res = startActivityLocked(caller, intent, resolvedType,
74223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo, resultTo, resultWho, requestCode, callingPid, callingUid,
74323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    callingPackage, startFlags, options, componentSpecified, null);
74423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
745de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (stack.mConfigWillChange) {
74623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // If the caller also wants to switch to a new configuration,
74723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // do so now.  This allows a clean switch, as we are waiting
74823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // for the current activity to pause (so we will not destroy
74923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                // it), and have not yet started the next activity.
75023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION,
75123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "updateConfiguration()");
752de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stack.mConfigWillChange = false;
75323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (DEBUG_CONFIGURATION) Slog.v(TAG,
75423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        "Updating to new configuration after starting activity.");
75523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                mService.updateConfigurationLocked(config, null, false, false);
75623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
75723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
75823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
75923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
76023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            if (outResult != null) {
76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                outResult.result = res;
76223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                if (res == ActivityManager.START_SUCCESS) {
763ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWaitingActivityLaunched.add(outResult);
76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    do {
76523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        try {
76623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            mService.wait();
76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } catch (InterruptedException e) {
76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        }
76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } while (!outResult.timeout && outResult.who == null);
77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                } else if (res == ActivityManager.START_TASK_TO_FRONT) {
771de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityRecord r = stack.topRunningActivityLocked(null);
77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (r.nowVisible) {
77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.timeout = false;
77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.who = new ComponentName(r.info.packageName, r.info.name);
77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.totalTime = 0;
77623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = 0;
77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        outResult.thisTime = SystemClock.uptimeMillis();
779ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                        mWaitingActivityVisible.add(outResult);
78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        do {
78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            try {
78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                mService.wait();
78323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            } catch (InterruptedException e) {
78423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            }
78523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        } while (!outResult.timeout && outResult.who == null);
78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
78723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            return res;
79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
79223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    final int startActivities(IApplicationThread caller, int callingUid, String callingPackage,
79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Intent[] intents, String[] resolvedTypes, IBinder resultTo,
79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Bundle options, int userId) {
79723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents == null) {
79823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("intents is null");
79923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (resolvedTypes == null) {
80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new NullPointerException("resolvedTypes is null");
80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (intents.length != resolvedTypes.length) {
80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            throw new IllegalArgumentException("intents are length different than resolvedTypes");
80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
80623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
80723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
80823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        int callingPid;
80923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        if (callingUid >= 0) {
81023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = -1;
81123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else if (caller == null) {
81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = Binder.getCallingPid();
81323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingUid = Binder.getCallingUid();
81423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } else {
81523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            callingPid = callingUid = -1;
81623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
81723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        final long origId = Binder.clearCallingIdentity();
81823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        try {
81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            synchronized (mService) {
82076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                ActivityRecord[] outActivity = new ActivityRecord[1];
82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                for (int i=0; i<intents.length; i++) {
82223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Intent intent = intents[i];
82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent == null) {
82423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        continue;
82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
82723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Refuse possible leaked file descriptors
82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (intent != null && intent.hasFileDescriptors()) {
82923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException("File descriptors passed in Intent");
83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
83123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
83223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    boolean componentSpecified = intent.getComponent() != null;
83323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
83423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Don't modify the client's object!
83523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    intent = new Intent(intent);
83623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // Collect information about the target of the Intent.
83823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i],
83923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, null, null, userId);
84023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    // TODO: New, check if this is correct
84123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    aInfo = mService.getActivityInfoForUser(aInfo, userId);
84223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (aInfo != null &&
84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE)
84523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                    != 0) {
84623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        throw new IllegalArgumentException(
84723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                                "FLAG_CANT_SAVE_STATE not supported here");
84823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
84923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
85023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    Bundle theseOptions;
85123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (options != null && i == intents.length-1) {
85223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = options;
85323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    } else {
85423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        theseOptions = null;
85523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
8566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    int res = startActivityLocked(caller, intent, resolvedTypes[i],
85723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage,
85823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                            0, theseOptions, componentSpecified, outActivity);
85923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    if (res < 0) {
86023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                        return res;
86123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    }
86223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
86323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                    resultTo = outActivity[0] != null ? outActivity[0].appToken : null;
86423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner                }
86523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            }
86623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        } finally {
86723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner            Binder.restoreCallingIdentity(origId);
86823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        }
86923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
87023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner        return ActivityManager.START_SUCCESS;
87123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner    }
87223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner
8732420ead0326bfd2587da6231be419e758dba1930Craig Mautner    final boolean realStartActivityLocked(ActivityRecord r,
8742420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ProcessRecord app, boolean andResume, boolean checkConfig)
8752420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throws RemoteException {
8762420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8772420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startFreezingScreenLocked(app, 0);
878a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner        if (false) Slog.d(TAG, "realStartActivity: setting app visibility true");
879ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        mWindowManager.setAppVisibility(r.appToken, true);
8802420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8812420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // schedule launch ticks to collect information about slow apps.
8822420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.startLaunchTickingLocked();
8832420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8842420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Have the window manager re-evaluate the orientation of
8852420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // the screen based on the new activity order.  Note that
8862420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // as a result of this, it can call back into the activity
8872420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // manager with a new orientation.  We don't care about that,
8882420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // because the activity is not currently running so we are
8892420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // just restarting it anyway.
8902420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (checkConfig) {
891ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            Configuration config = mWindowManager.updateOrientationFromAppTokens(
8922420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mConfiguration,
8932420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    r.mayFreezeScreenLocked(app) ? r.appToken : null);
8942420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.updateConfigurationLocked(config, r, false, false);
8952420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
8962420ead0326bfd2587da6231be419e758dba1930Craig Mautner
8972420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.app = app;
8982420ead0326bfd2587da6231be419e758dba1930Craig Mautner        app.waitingToKill = null;
8992420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchCount++;
9002420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.lastLaunchTime = SystemClock.uptimeMillis();
9012420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9022420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (localLOGV) Slog.v(TAG, "Launching: " + r);
9032420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9042420ead0326bfd2587da6231be419e758dba1930Craig Mautner        int idx = app.activities.indexOf(r);
9052420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (idx < 0) {
9062420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.add(r);
9072420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
908db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateLruProcessLocked(app, true, null);
909db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn        mService.updateOomAdjLocked();
9102420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        final ActivityStack stack = r.task.stack;
9122420ead0326bfd2587da6231be419e758dba1930Craig Mautner        try {
9132420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (app.thread == null) {
9142420ead0326bfd2587da6231be419e758dba1930Craig Mautner                throw new RemoteException();
9152420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9162420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<ResultInfo> results = null;
9172420ead0326bfd2587da6231be419e758dba1930Craig Mautner            List<Intent> newIntents = null;
9182420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
9192420ead0326bfd2587da6231be419e758dba1930Craig Mautner                results = r.results;
9202420ead0326bfd2587da6231be419e758dba1930Craig Mautner                newIntents = r.newIntents;
9212420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9222420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r
9232420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " icicle=" + r.icicle
9242420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " with results=" + results + " newIntents=" + newIntents
9252420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " andResume=" + andResume);
9262420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (andResume) {
9272420ead0326bfd2587da6231be419e758dba1930Craig Mautner                EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
9282420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.userId, System.identityHashCode(r),
9292420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        r.task.taskId, r.shortComponentName);
9302420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
931ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (r.isHomeActivity() && r.isNotResolverActivity()) {
9324ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                // Home process is the root process of the task.
9334ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                mService.mHomeProcess = r.task.mActivities.get(0).app;
9342420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9352420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
9362420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.sleeping = false;
9372420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.forceNewConfig = false;
9382420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.showAskCompatModeDialogLocked(r);
9392420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
9402420ead0326bfd2587da6231be419e758dba1930Craig Mautner            String profileFile = null;
9412420ead0326bfd2587da6231be419e758dba1930Craig Mautner            ParcelFileDescriptor profileFd = null;
9422420ead0326bfd2587da6231be419e758dba1930Craig Mautner            boolean profileAutoStop = false;
9432420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
9442420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (mService.mProfileProc == null || mService.mProfileProc == app) {
9452420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mProfileProc = app;
9462420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFile = mService.mProfileFile;
9472420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = mService.mProfileFd;
9482420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop = mService.mAutoStopProfiler;
9492420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
9502420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9512420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.hasShownUi = true;
9522420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.pendingUiClean = true;
9532420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (profileFd != null) {
9542420ead0326bfd2587da6231be419e758dba1930Craig Mautner                try {
9552420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileFd = profileFd.dup();
9562420ead0326bfd2587da6231be419e758dba1930Craig Mautner                } catch (IOException e) {
9572420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (profileFd != null) {
9582420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        try {
9592420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            profileFd.close();
9602420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        } catch (IOException o) {
9612420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        }
9622420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        profileFd = null;
9632420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
9642420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
9652420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
966a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP);
9672420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
9682420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    System.identityHashCode(r), r.info,
969a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    new Configuration(mService.mConfiguration), r.compat,
970a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    app.repProcState, r.icicle, results, newIntents, !andResume,
9712420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.isNextTransitionForward(), profileFile, profileFd,
9722420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    profileAutoStop);
9732420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9742420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) {
9752420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This may be a heavy-weight process!  Note that the package
9762420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // manager will ensure that only activity can run in the main
9772420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // process of the .apk, which is the only thing that will be
9782420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // considered heavy-weight.
9792420ead0326bfd2587da6231be419e758dba1930Craig Mautner                if (app.processName.equals(app.info.packageName)) {
9802420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    if (mService.mHeavyWeightProcess != null
9812420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            && mService.mHeavyWeightProcess != app) {
9822420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        Slog.w(TAG, "Starting new heavy weight process " + app
9832420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + " when already running "
9842420ead0326bfd2587da6231be419e758dba1930Craig Mautner                                + mService.mHeavyWeightProcess);
9852420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    }
9862420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHeavyWeightProcess = app;
9872420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    Message msg = mService.mHandler.obtainMessage(
9882420ead0326bfd2587da6231be419e758dba1930Craig Mautner                            ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
9892420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    msg.obj = r;
9902420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    mService.mHandler.sendMessage(msg);
9912420ead0326bfd2587da6231be419e758dba1930Craig Mautner                }
9922420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
9932420ead0326bfd2587da6231be419e758dba1930Craig Mautner
9942420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } catch (RemoteException e) {
9952420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (r.launchFailed) {
9962420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // This is the second time we failed -- finish activity
9972420ead0326bfd2587da6231be419e758dba1930Craig Mautner                // and give up.
9982420ead0326bfd2587da6231be419e758dba1930Craig Mautner                Slog.e(TAG, "Second failure launching "
9992420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + r.intent.getComponent().flattenToShortString()
10002420ead0326bfd2587da6231be419e758dba1930Craig Mautner                      + ", giving up", e);
10012420ead0326bfd2587da6231be419e758dba1930Craig Mautner                mService.appDiedLocked(app, app.pid, app.thread);
10022420ead0326bfd2587da6231be419e758dba1930Craig Mautner                stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
10032420ead0326bfd2587da6231be419e758dba1930Craig Mautner                        "2nd-crash", false);
10042420ead0326bfd2587da6231be419e758dba1930Craig Mautner                return false;
10052420ead0326bfd2587da6231be419e758dba1930Craig Mautner            }
10062420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10072420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This is the first time we failed -- restart process and
10082420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // retry.
10092420ead0326bfd2587da6231be419e758dba1930Craig Mautner            app.activities.remove(r);
10102420ead0326bfd2587da6231be419e758dba1930Craig Mautner            throw e;
10112420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10122420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10132420ead0326bfd2587da6231be419e758dba1930Craig Mautner        r.launchFailed = false;
10142420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (stack.updateLRUListLocked(r)) {
10152420ead0326bfd2587da6231be419e758dba1930Craig Mautner            Slog.w(TAG, "Activity " + r
10162420ead0326bfd2587da6231be419e758dba1930Craig Mautner                  + " being launched, but already in LRU list");
10172420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10182420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10192420ead0326bfd2587da6231be419e758dba1930Craig Mautner        if (andResume) {
10202420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // As part of the process of launching, ActivityThread also performs
10212420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // a resume.
10222420ead0326bfd2587da6231be419e758dba1930Craig Mautner            stack.minimalResumeActivityLocked(r);
10232420ead0326bfd2587da6231be419e758dba1930Craig Mautner        } else {
10242420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // This activity is not starting in the resumed state... which
10252420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // should look like we asked it to pause+stop (but remain visible),
10262420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // and it has done so and reported back the current icicle and
10272420ead0326bfd2587da6231be419e758dba1930Craig Mautner            // other state.
10282420ead0326bfd2587da6231be419e758dba1930Craig Mautner            if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r
10292420ead0326bfd2587da6231be419e758dba1930Craig Mautner                    + " (starting in stopped state)");
10302420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.state = ActivityState.STOPPED;
10312420ead0326bfd2587da6231be419e758dba1930Craig Mautner            r.stopped = true;
10322420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10332420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10342420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // Launch the new version setup screen if needed.  We do this -after-
10352420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // launching the initial activity (that is, home), so that it can have
10362420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // a chance to initialize itself while in the background, making the
10372420ead0326bfd2587da6231be419e758dba1930Craig Mautner        // switch back to it faster and look better.
1038de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (isFrontStack(stack)) {
10392420ead0326bfd2587da6231be419e758dba1930Craig Mautner            mService.startSetupActivityLocked();
10402420ead0326bfd2587da6231be419e758dba1930Craig Mautner        }
10412420ead0326bfd2587da6231be419e758dba1930Craig Mautner
10422420ead0326bfd2587da6231be419e758dba1930Craig Mautner        return true;
10432420ead0326bfd2587da6231be419e758dba1930Craig Mautner    }
10442420ead0326bfd2587da6231be419e758dba1930Craig Mautner
1045e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    void startSpecificActivityLocked(ActivityRecord r,
1046e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            boolean andResume, boolean checkConfig) {
1047e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        // Is this activity's application already running?
1048e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
10493bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                r.info.applicationInfo.uid, true);
1050e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1051e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        r.task.stack.setLaunchTime(r);
1052e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1053e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        if (app != null && app.thread != null) {
1054e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            try {
1055237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
1056237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                        || !"android".equals(r.info.packageName)) {
1057237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // Don't add this if it is a platform component that is marked
1058237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // to run in multiple processes, because this is actually
1059237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // part of the framework so doesn't make sense to track as a
1060237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    // separate apk in the process.
1061237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                    app.addPackage(r.info.packageName, mService.mProcessStats);
1062237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn                }
1063e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                realStartActivityLocked(r, app, andResume, checkConfig);
1064e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                return;
1065e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            } catch (RemoteException e) {
1066e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                Slog.w(TAG, "Exception when starting activity "
1067e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner                        + r.intent.getComponent().flattenToShortString(), e);
1068e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            }
1069e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1070e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // If a dead object exception was thrown -- fall through to
1071e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner            // restart the application.
1072e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        }
1073e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
1074e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
10753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                "activity", r.intent.getComponent(), false, false, true);
1076e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner    }
1077e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner
10786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    final int startActivityLocked(IApplicationThread caller,
10796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo,
10806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String resultWho, int requestCode,
10816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options,
10826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            boolean componentSpecified, ActivityRecord[] outActivity) {
10836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int err = ActivityManager.START_SUCCESS;
10846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ProcessRecord callerApp = null;
10866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (caller != null) {
10876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            callerApp = mService.getRecordForAppLocked(caller);
10886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (callerApp != null) {
10896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingPid = callerApp.pid;
10906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid = callerApp.info.uid;
10916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
10926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Slog.w(TAG, "Unable to find app for caller " + caller
10936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + " (pid=" + callingPid + ") when starting: "
10946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                      + intent.toString());
10956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                err = ActivityManager.START_PERMISSION_DENIED;
10966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
10976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
10986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
10996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS) {
11006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
11016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false)
11026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    + "} from pid " + (callerApp != null ? callerApp.pid : callingPid));
11036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord sourceRecord = null;
11066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord resultRecord = null;
11076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (resultTo != null) {
11086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord = isInAnyStackLocked(resultTo);
11096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (DEBUG_RESULTS) Slog.v(
11106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                TAG, "Will send result to " + resultTo + " " + sourceRecord);
11116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (sourceRecord != null) {
11126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                if (requestCode >= 0 && !sourceRecord.finishing) {
11136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord = sourceRecord;
11146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                }
11156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack;
11186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        int launchFlags = intent.getFlags();
11206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0
11226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                && sourceRecord != null) {
11236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Transfer the result target from the source activity to the new
11246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // one being started, including any failures.
11256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (requestCode >= 0) {
11266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
11276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT;
11286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultRecord = sourceRecord.resultTo;
11306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            resultWho = sourceRecord.resultWho;
11316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            requestCode = sourceRecord.requestCode;
11326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            sourceRecord.resultTo = null;
11336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
11346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultRecord.removeResultsLocked(
11356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    sourceRecord, resultWho, requestCode);
11366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11373026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn            if (sourceRecord.launchedFromUid == callingUid) {
11383026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // The new activity is being launched from the same uid as the previous
11393026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // activity in the flow, and asking to forward its result back to the
11403026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // previous.  In this case the activity is serving as a trampoline between
11413026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // the two, so we also want to update its launchedFromPackage to be the
11423026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // same as the previous activity.  Note that this is safe, since we know
11433026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // these two packages come from the same uid; the caller could just as
11443026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // well have supplied that same package name itself.  This specifially
11453026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // deals with the case of an intent picker/chooser being launched in the app
11463026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // flow to redirect to an activity picked by the user, where we want the final
11473026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                // activity to consider it to have been launched by the previous app activity.
11483026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn                callingPackage = sourceRecord.launchedFromPackage;
11493026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn            }
11506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) {
11536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find a class that can handle the given Intent.
11546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // That's the end of that!
11556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_INTENT_NOT_RESOLVED;
11566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err == ActivityManager.START_SUCCESS && aInfo == null) {
11596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // We couldn't find the specific class specified in the Intent.
11606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // Also the end of the line.
11616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            err = ActivityManager.START_CLASS_NOT_FOUND;
11626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (err != ActivityManager.START_SUCCESS) {
11656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
11666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
11676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
11686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
11696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
11716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            ActivityOptions.abort(options);
11726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            return err;
11736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
11746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
11756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int startAnyPerm = mService.checkPermission(
11766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                START_ANY_ACTIVITY, callingPid, callingUid);
11776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid,
11786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                callingUid, aInfo.applicationInfo.uid, aInfo.exported);
11796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) {
11806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (resultRecord != null) {
11816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                resultStack.sendActivityResultLocked(-1,
11826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    resultRecord, resultWho, requestCode,
11836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                    Activity.RESULT_CANCELED, null);
11846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            setDismissKeyguard(false);
11866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            String msg;
11876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!aInfo.exported) {
11886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
11896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
11906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
11916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " not exported from uid " + aInfo.applicationInfo.uid;
11926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } else {
11936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                msg = "Permission Denial: starting " + intent.toString()
11946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " from " + callerApp + " (pid=" + callingPid
11956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + ", uid=" + callingUid + ")"
11966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        + " requires " + aInfo.permission;
11976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
11986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            Slog.w(TAG, msg);
11996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            throw new SecurityException(msg);
12006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1202dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid,
1203b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver                callingPid, resolvedType, aInfo.applicationInfo);
12045e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver
12056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mController != null) {
12066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            try {
12076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // The Intent we give to the watcher has the extra data
12086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                // stripped off, since it can contain private information.
12096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                Intent watchIntent = intent.cloneFilter();
12105e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                abort |= !mService.mController.activityStarting(watchIntent,
12116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        aInfo.applicationInfo.packageName);
12126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            } catch (RemoteException e) {
12136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mController = null;
12146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12155e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        }
12166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12175e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver        if (abort) {
12185e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            if (resultRecord != null) {
12195e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver                resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode,
12206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                        Activity.RESULT_CANCELED, null);
12216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12225e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // We pretend to the caller that it was really started, but
12235e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            // they will just get a cancel result.
12245e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            setDismissKeyguard(false);
12255e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            ActivityOptions.abort(options);
12265e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver            return ActivityManager.START_SUCCESS;
12276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage,
12306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                intent, resolvedType, aInfo, mService.mConfiguration,
1231de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                resultRecord, resultWho, requestCode, componentSpecified, this);
12326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (outActivity != null) {
12336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            outActivity[0] = r;
12346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1236ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = getFocusedStack();
1237de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (stack.mResumedActivity == null
1238de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                || stack.mResumedActivity.info.applicationInfo.uid != callingUid) {
12396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) {
12406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                PendingActivityLaunch pal =
1241de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        new PendingActivityLaunch(r, sourceRecord, startFlags, stack);
12426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                mService.mPendingActivityLaunches.add(pal);
12436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                setDismissKeyguard(false);
12446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                ActivityOptions.abort(options);
12456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner                return ActivityManager.START_SWITCHES_CANCELED;
12466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            }
12476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        if (mService.mDidAppSwitch) {
12506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // This is the second allowed switch since we stopped switches,
12516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // so now just generally allow switches.  Use case: user presses
12526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // home (switches disabled, switch to home, mDidAppSwitch now true);
12536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // user taps a home icon (coming from home so allowed, we hit here
12546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // and now allow anyone to switch again).
12556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mAppSwitchesAllowedTime = 0;
12566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        } else {
12576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            mService.mDidAppSwitch = true;
12586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        mService.doPendingActivityLaunchesLocked(false);
12616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
12628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options);
126310385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner
126410385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner        if (allPausedActivitiesComplete()) {
126510385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner            // If someone asked to have the keyguard dismissed on the next
12666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // activity start, but we are not actually doing an activity
12676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // switch...  just dismiss the keyguard now, because we
12686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            // probably want to see whatever is behind it.
12696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner            dismissKeyguard();
12706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        }
12716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner        return err;
12726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner    }
12736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner
1274ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityStack adjustStackFocus(ActivityRecord r) {
12751d001b670e34fe887488047f525a5430154626e1Craig Mautner        final TaskRecord task = r.task;
12761d001b670e34fe887488047f525a5430154626e1Craig Mautner        if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) {
1277ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (task != null) {
1278d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                final ActivityStack taskStack = task.stack;
1279d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                if (mFocusedStack != taskStack) {
1280ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1281ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                            "adjustStackFocus: Setting focused stack to r=" + r + " task=" + task);
1282d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                    mFocusedStack = taskStack.isHomeStack() ? null : taskStack;
1283ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                } else {
1284ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1285ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        "adjustStackFocus: Focused stack already=" + mFocusedStack);
1286858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                }
1287d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                return taskStack;
1288858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
1289ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1290ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (mFocusedStack != null) {
1291ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1292ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        "adjustStackFocus: Have a focused stack=" + mFocusedStack);
1293ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                return mFocusedStack;
1294de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
1295ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1296ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            for (int stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) {
1297ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                ActivityStack stack = mStacks.get(stackNdx);
1298ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                if (!stack.isHomeStack()) {
1299ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1300ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                            "adjustStackFocus: Setting focused stack=" + stack);
1301ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    mFocusedStack = stack;
1302ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    return mFocusedStack;
1303ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                }
13041d001b670e34fe887488047f525a5430154626e1Craig Mautner            }
1305ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
1306ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            // Time to create the first app stack for this user.
1307d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner            int stackId =
1308d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                    mService.createStack(-1, HOME_STACK_ID, StackBox.TASK_STACK_GOES_OVER, 1.0f);
1309ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r +
1310ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    " stackId=" + stackId);
1311ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            mFocusedStack = getStack(stackId);
131229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return mFocusedStack;
1313de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1314de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return mHomeStack;
1315de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
1316de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
131729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    void setFocusedStack(ActivityRecord r) {
131829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        if (r == null) {
131929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            return;
132029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
132186d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner        if (!r.isApplicationActivity() || (r.task != null && !r.task.isApplicationTask())) {
132229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_FRONT) {
1323e7c58b6d7d761b93e785b0a399e5b00fdb82f4ceCraig Mautner                if (DEBUG_STACK || DEBUG_FOCUS) Slog.d(TAG, "setFocusedStack: mStackState old=" +
132476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(mStackState) + " new=" +
132576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_FRONT) +
132676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        " Callers=" + Debug.getCallers(3));
132729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_FRONT;
132829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
132929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        } else {
1330ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG,
1331ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    "setFocusedStack: Setting focused stack to r=" + r + " task=" + r.task +
1332ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                    " Callers=" + Debug.getCallers(3));
1333d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner            final ActivityStack taskStack = r.task.stack;
1334d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner            mFocusedStack = taskStack.isHomeStack() ? null : taskStack;
133529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (mStackState != STACK_STATE_HOME_IN_BACK) {
133676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" +
133776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(mStackState) + " new=" +
133876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        stackStateToString(STACK_STATE_HOME_TO_BACK) +
133976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner                        " Callers=" + Debug.getCallers(3));
134029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                mStackState = STACK_STATE_HOME_TO_BACK;
134129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            }
134229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner        }
134329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner    }
134429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner
13458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    final int startActivityUncheckedLocked(ActivityRecord r,
13468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord sourceRecord, int startFlags, boolean doResume,
13478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Bundle options) {
13488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final Intent intent = r.intent;
13498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        final int callingUid = r.launchedFromUid;
13508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        int launchFlags = intent.getFlags();
13528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // We'll invoke onUserLeaving before onPause only if the launching
13548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // activity did not explicitly state that this is an automated launch.
1355de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0;
1356de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving);
13578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the caller has asked not to resume at this point, we make note
13598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // of this in the record so that we can skip it when trying to find
13608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // the top running activity.
13618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (!doResume) {
13628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.delayedResume = true;
13638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
13668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // If the onlyIfNeeded flag is set, then we can do this if the activity
13688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // being launched is the same as the one making the call...  or, as
13698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // a special case, if we do not know the caller then we count the
13708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // current top activity as the caller.
13718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
13728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityRecord checkedCaller = sourceRecord;
13738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (checkedCaller == null) {
1374ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop);
13758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!checkedCaller.realActivity.equals(r.realActivity)) {
13778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // Caller is not the same as launcher, so always needed.
13788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED;
13798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
13818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
13828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (sourceRecord == null) {
13838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This activity is not being started from another...  in this
13848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // case we -always- start a new task.
13858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
138629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                Slog.w(TAG, "startActivity called from non-Activity context; forcing " +
138729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
13888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
13898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
13908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
13918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The original activity who is starting us is running as a single
13928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // instance...  this new activity it is starting must go on its
13938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // own task.
13948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
13958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE
13968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
13978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // The activity being started is a single instance...  it always
13988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // gets launched into its own task.
13998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
14008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
14018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14028862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner        ActivityInfo newTaskInfo = null;
14038862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner        Intent newTaskIntent = null;
1404de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final ActivityStack sourceStack;
1405de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (sourceRecord != null) {
14062a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn            if (sourceRecord.finishing) {
14072a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                // If the source is finishing, we can't further count it as our source.  This
14082a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                // is because the task it is associated with may now be empty and on its way out,
14092a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                // so we don't want to blindly throw it in to that task.  Instead we will take
14108862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                // the NEW_TASK flow and try to find a task for it. But save the task information
14118862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                // so it can be used when creating the new task.
14122a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) {
14132a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    Slog.w(TAG, "startActivity called from finishing " + sourceRecord
14142a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                            + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent);
14152a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK;
14168862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                    newTaskInfo = sourceRecord.info;
14178862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                    newTaskIntent = sourceRecord.task.intent;
14182a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                }
14192a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                sourceRecord = null;
14202a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                sourceStack = null;
14212a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn            } else {
14222a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                sourceStack = sourceRecord.task.stack;
14232a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn            }
1424de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        } else {
1425de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            sourceStack = null;
1426de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
1427de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
14288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
14298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // For whatever reason this activity is being launched into a new
14308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // task...  yet the caller has requested a result back.  Well, that
14318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // is pretty messed up, so instead immediately send back a cancel
14328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // and let the new task continue launched as normal without a
14338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // dependency on its originator.
14348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result.");
14358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo.task.stack.sendActivityResultLocked(-1,
14368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    r.resultTo, r.resultWho, r.requestCode,
14378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                Activity.RESULT_CANCELED, null);
14388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            r.resultTo = null;
14398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
14408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
14418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean addingToTask = false;
14428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean movedHome = false;
14438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        TaskRecord reuseTask = null;
1444de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ActivityStack targetStack;
14458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 &&
14468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0)
14478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
14488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
14498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If bring to front is requested, and no result is requested, and
14508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // we can find a task that was started with this same
14518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // component, then instead of launching bring that one to the front.
14528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo == null) {
14538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // See if there is a task to bring to the front.  If this is
14548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // a SINGLE_INSTANCE activity, there can be one and only one
14558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // instance of it in the history, and it is always in its own
14568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // unique task, so we do a special search.
14578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE
1458ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                        ? findTaskLocked(r)
14598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        : findActivityLocked(intent, r.info);
14608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (intentActivity != null) {
146129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    if (r.task == null) {
146229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        r.task = intentActivity.task;
146329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                    }
14648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    targetStack = intentActivity.task.stack;
14650f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
14662a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack
14672a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                            + " from " + intentActivity);
1468de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    moveHomeStack(targetStack.isHomeStack());
14698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (intentActivity.task.intent == null) {
14708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // This task was started because of movement of
14718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the activity based on affinity...  now that we
14728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // are actually launching it, we can assign the
14738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // base intent.
14748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(intent, r.info);
14758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
14768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the target task is not in the front, then we need
14778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to bring it to the front...  except...  well, with
14788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // SINGLE_TASK_LAUNCH it's not entirely clear.  We'd like
14798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // to have the same behavior as if a new instance was
14808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // being started, which means not bringing it to the front
14818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // if the caller is not itself in the front.
1482165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    final ActivityStack lastStack = getLastStack();
1483165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                    ActivityRecord curTop = lastStack == null?
1484165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner                            null : lastStack.topRunningNonDelayedActivityLocked(notTop);
14857504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                    if (curTop != null && (curTop.task != intentActivity.task ||
14867504d7b24a07fef05b3447d843f212796e22302fCraig Mautner                            curTop.task != lastStack.topTask())) {
14878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);
1488d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                        if (sourceRecord == null || (sourceStack.topActivity() != null &&
1489d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner                                sourceStack.topActivity().task == sourceRecord.task)) {
14908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // We really do want to push this one into the
14918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // user's face, right now.
14928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            movedHome = true;
1493b53d97c4571f8ed09e92eee64301969b96ff1e4dCraig Mautner                            targetStack.moveTaskToFrontLocked(intentActivity.task, r, options);
1494de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            if ((launchFlags &
149529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME))
149629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) {
1497e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner                                // Caller wants to appear on home activity.
1498ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                                intentActivity.task.mOnTopOfHome = true;
1499de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            }
15008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            options = null;
15018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
15028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // If the caller has requested that the target task be
15048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // reset, then do so.
15058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) {
15068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r);
15078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
15098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We don't need to start a new activity, and
15108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the client said not to do anything if that
15118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is the case, so this is it!  And for paranoia, make
15128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
15138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
151405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                            resumeTopActivitiesLocked(targetStack, null, options);
15158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
15168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
15178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
151829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
151929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
152029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
15218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_RETURN_INTENT_TO_CALLER;
15228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
15238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if ((launchFlags &
15248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK))
15258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) {
15268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The caller has requested to completely replace any
15278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task with its new activity.  Well that should
15288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // not be too hard...
15298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask = intentActivity.task;
15308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.performClearTaskLocked();
15318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        reuseTask.setIntent(r.intent, r.info);
15328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0
15338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK
15348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
15358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this situation we want to remove all activities
15368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from the task up to the one being started.  In most
15378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // cases this means we are resetting the task to its
15388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // initial state.
15398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        ActivityRecord top =
15408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.performClearTaskLocked(r, launchFlags);
15418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (top != null) {
15428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (top.frontOfTask) {
15438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // Activity aliases may mean we use different
15448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intents for the top activity, so make sure
15458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the task now has the identity of the new
15468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // intent.
15478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                top.task.setIntent(r.intent, r.info);
15488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
15498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT,
15508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    r, top.task);
15518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
15528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
15538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // A special case: we need to
15548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // start the activity because it is not currently
15558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // running, and the caller has asked to clear the
15568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // current task to have this activity at the top.
15578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
15588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // Now pretend like this activity is being started
15598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // by the top of its task, so it is put in the
15608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // right place.
15618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
15628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
15638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (r.realActivity.equals(intentActivity.task.realActivity)) {
15648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case the top activity on the task is the
15658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // same as the one being launched, so we take that
15668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // as a request to bring the task to the foreground.
15678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // If the top activity in the task is the root
15688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // activity, deliver this new intent to it if it
15698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // desires.
15708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
15718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
15728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                && intentActivity.realActivity.equals(r.realActivity)) {
15738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r,
15748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    intentActivity.task);
15758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (intentActivity.frontOfTask) {
15768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                intentActivity.task.setIntent(r.intent, r.info);
15778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            intentActivity.deliverNewIntentLocked(callingUid, r.intent);
15798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else if (!r.intent.filterEquals(intentActivity.task.intent)) {
15808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // In this case we are launching the root activity
15818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // of the task, but with a different intent.  We
15828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // should start a new instance on top.
15838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            addingToTask = true;
15848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            sourceRecord = intentActivity;
15858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
15868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) {
15878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case an activity is being launched in to an
15888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // existing task, without resetting that task.  This
15898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // is typically the situation of launching an activity
15908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // from a notification or shortcut.  We want to place
15918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // the new activity on top of the current task.
15928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        addingToTask = true;
15938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        sourceRecord = intentActivity;
15948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    } else if (!intentActivity.task.rootWasReset) {
15958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // In this case we are launching in to an existing task
15968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // that has not yet been started from its front door.
15978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // The current task has been brought to the front.
15988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // Ideally, we'd probably like to place this new task
15998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // at the bottom of its stack, but that's a little hard
16008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // to do with the current organization of the code so
16018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // for now we'll just drop it.
16028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        intentActivity.task.setIntent(r.intent, r.info);
16038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (!addingToTask && reuseTask == null) {
16058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // We didn't do anything...  but it was needed (a.k.a., client
16068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // don't use that intent!)  And for paranoia, make
16078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        // sure we have correctly resumed the top activity.
16088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if (doResume) {
1609de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                            targetStack.resumeTopActivityLocked(null, options);
16108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        } else {
16118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
16128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
161329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        if (r.task == null)  Slog.v(TAG,
161429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            "startActivityUncheckedLocked: task left null",
161529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            new RuntimeException("here").fillInStackTrace());
16168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        return ActivityManager.START_TASK_TO_FRONT;
16178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
16198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //String uri = r.intent.toURI();
16238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Intent intent2 = new Intent(uri);
16248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "Given intent: " + r.intent);
16258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "URI is: " + uri);
16268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        //Slog.i(TAG, "To intent: " + intent2);
16278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.packageName != null) {
16298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // If the activity being launched is the same as the one currently
16308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // at the top, then we need to check if it should only be launched
16318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // once.
1632ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ActivityStack topStack = getFocusedStack();
1633de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop);
16348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (top != null && r.resultTo == null) {
16358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) {
16368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (top.app != null && top.app.thread != null) {
16378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
16388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP
16398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) {
16408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top,
16418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                    top.task);
16428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // For paranoia, make sure we have correctly
16438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            // resumed the top activity.
16440f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                            topStack.mLastPausedActivity = null;
16458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if (doResume) {
164605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                                resumeTopActivitiesLocked();
16478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
16488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            ActivityOptions.abort(options);
16498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) {
16508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // We don't need to start a new activity, and
16518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // the client said not to do anything if that
16528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                // is the case, so this is it!
165329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                if (r.task == null)  Slog.v(TAG,
165429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    "startActivityUncheckedLocked: task left null",
165529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                    new RuntimeException("here").fillInStackTrace());
16568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                                return ActivityManager.START_RETURN_INTENT_TO_CALLER;
16578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            }
16588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            top.deliverNewIntentLocked(callingUid, r.intent);
165929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                            if (r.task == null)  Slog.v(TAG,
166029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                "startActivityUncheckedLocked: task left null",
166129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                                new RuntimeException("here").fillInStackTrace());
16628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                            return ActivityManager.START_DELIVERED_TO_TOP;
16638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        }
16648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
16658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
16668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
16698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (r.resultTo != null) {
1670de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho,
1671de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.requestCode, Activity.RESULT_CANCELED, null);
16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            ActivityOptions.abort(options);
167429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner            if (r.task == null)  Slog.v(TAG,
167529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                "startActivityUncheckedLocked: task left null",
167629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                new RuntimeException("here").fillInStackTrace());
16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            return ActivityManager.START_CLASS_NOT_FOUND;
16788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
16798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean newTask = false;
16818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        boolean keepCurTransition = false;
16828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
16838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        // Should this be considered a new task?
16848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (r.resultTo == null && !addingToTask
16858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
1686ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            targetStack = adjustStackFocus(r);
1687de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
16888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (reuseTask == null) {
16898862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                r.setTask(targetStack.createTaskRecord(getNextTaskId(),
16908862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                        newTaskInfo != null ? newTaskInfo : r.info,
16918862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                        newTaskIntent != null ? newTaskIntent : intent,
16928862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner                        true), null, true);
1693de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " +
1694de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        r.task);
16958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else {
1696de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                r.setTask(reuseTask, reuseTask, true);
16978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
16988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            newTask = true;
16998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!movedHome) {
1700de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if ((launchFlags &
1701de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME))
1702de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                        == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) {
1703de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // Caller wants to appear on home activity, so before starting
1704de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // their own activity we will bring home to the front.
1705ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner                    r.task.mOnTopOfHome = true;
1706de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
17078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
17088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else if (sourceRecord != null) {
17092a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn            TaskRecord sourceTask = sourceRecord.task;
1710525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            targetStack = sourceTask.stack;
1711de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
171297024321fcff3427e4e1cc6ced9b6abc7525fdb0Craig Mautner            mWindowManager.moveTaskToTop(sourceTask.taskId);
17138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (!addingToTask &&
17148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) {
17158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are adding the activity to an existing
17168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // task, but the caller has asked to clear that task if the
17178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // activity is already running.
1718525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags);
17198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                keepCurTransition = true;
17208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
17218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task);
17228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
17238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // For paranoia, make sure we have correctly
17248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    // resumed the top activity.
17250f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
17268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
17278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
17288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
17298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    ActivityOptions.abort(options);
17302a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    if (r.task == null)  Slog.w(TAG,
173129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        "startActivityUncheckedLocked: task left null",
173229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner                        new RuntimeException("here").fillInStackTrace());
17338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
17348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
17358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            } else if (!addingToTask &&
17368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) {
17378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // In this case, we are launching an activity in our own task
17388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // that may already be running somewhere in the history, and
17398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                // we want to shuffle it to the front of the stack if so.
1740525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner                final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r);
17418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                if (top != null) {
1742de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    final TaskRecord task = top.task;
1743de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    task.moveActivityToFrontLocked(top);
1744de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task);
17458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.updateOptionsLocked(options);
17468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    top.deliverNewIntentLocked(callingUid, r.intent);
17470f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    targetStack.mLastPausedActivity = null;
17488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    if (doResume) {
17498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                        targetStack.resumeTopActivityLocked(null);
17508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    }
17518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    return ActivityManager.START_DELIVERED_TO_TOP;
17528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                }
17538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
17548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // An existing activity is starting this new activity, so we want
17558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // to keep the new one in the same task as the one that is starting
17568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // it.
1757525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner            r.setTask(sourceTask, sourceRecord.thumbHolder, false);
17588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
17592a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                    + " in existing task " + r.task + " from source " + sourceRecord);
17608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        } else {
17628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // This not being started from an existing activity, and not part
17638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // of a new task...  just put it in the top task, though these days
17648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            // this case should never happen.
1765ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            targetStack = adjustStackFocus(r);
1766de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            moveHomeStack(targetStack.isHomeStack());
17671602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner            ActivityRecord prev = targetStack.topActivity();
1768de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            r.setTask(prev != null ? prev.task
1769de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true),
1770de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    null, true);
177197024321fcff3427e4e1cc6ced9b6abc7525fdb0Craig Mautner            mWindowManager.moveTaskToTop(r.task.taskId);
17728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
17738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                    + " in new guessed " + r.task);
17748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
17758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName,
17778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                intent, r.getUriPermissionsLocked());
17788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        if (newTask) {
17808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId);
17818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
17828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task);
17830f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner        targetStack.mLastPausedActivity = null;
17848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options);
17851d001b670e34fe887488047f525a5430154626e1Craig Mautner        mService.setFocusedActivityLocked(r);
17868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return ActivityManager.START_SUCCESS;
17878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
17888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
17897ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    void acquireLaunchWakelock() {
17907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
17917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            throw new IllegalStateException("Calling must be system uid");
17927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
17937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        mLaunchingActivity.acquire();
17947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) {
17957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // To be safe, don't allow the wake lock to be held for too long.
17967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
17977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
17987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner    }
17997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
1800f333327782e14688e1c198c1192172d51308e90bCraig Mautner    // Checked.
1801f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout,
1802f333327782e14688e1c198c1192172d51308e90bCraig Mautner            Configuration config) {
1803f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (localLOGV) Slog.v(TAG, "Activity idle: " + token);
1804f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1805f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> stops = null;
1806f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<ActivityRecord> finishes = null;
1807f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ArrayList<UserStartedState> startingUsers = null;
1808f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NS = 0;
1809f333327782e14688e1c198c1192172d51308e90bCraig Mautner        int NF = 0;
1810f333327782e14688e1c198c1192172d51308e90bCraig Mautner        IApplicationThread sendThumbnail = null;
1811f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean booting = false;
1812f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean enableScreen = false;
1813f333327782e14688e1c198c1192172d51308e90bCraig Mautner        boolean activityRemoved = false;
1814f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1815f333327782e14688e1c198c1192172d51308e90bCraig Mautner        ActivityRecord r = ActivityRecord.forToken(token);
1816f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (r != null) {
1817b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner            if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" +
1818b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner                    Debug.getCallers(4));
1819f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
1820f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r.finishLaunchTickingLocked();
18217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (fromTimeout) {
18227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                reportActivityLaunchedLocked(fromTimeout, r, -1, -1);
18237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
1824f333327782e14688e1c198c1192172d51308e90bCraig Mautner
18257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // This is a hack to semi-deal with a race condition
18267ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // in the client where it can be constructed with a
18277ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // newer configuration from when we asked it to launch.
18287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We'll update with whatever configuration it now says
18297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // it used to launch.
18307ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (config != null) {
18317ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                r.configuration = config;
18327ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
1833f333327782e14688e1c198c1192172d51308e90bCraig Mautner
18347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // We are now idle.  If someone is waiting for a thumbnail from
18357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            // us, we can now deliver.
18367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            r.idle = true;
18377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
18387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (r.thumbnailNeeded && r.app != null && r.app.thread != null) {
18397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                sendThumbnail = r.app.thread;
18407ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                r.thumbnailNeeded = false;
18417ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
18427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
18437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout);
18447ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (!mService.mBooted && isFrontStack(r.task.stack)) {
18457ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mBooted = true;
18467ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                enableScreen = true;
18477ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
18487ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
18497ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
18507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        if (allResumedActivitiesIdle()) {
18517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (r != null) {
18527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.scheduleAppGcsLocked();
18537ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            }
18547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
18557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
18567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
18577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER &&
18587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        Binder.getCallingUid() != Process.myUid()) {
18597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
1860f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
18617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
1862f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
18637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
1864f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1865f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1866f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Atomically retrieve all of the other things to do.
1867f333327782e14688e1c198c1192172d51308e90bCraig Mautner        stops = processStoppingActivitiesLocked(true);
1868f333327782e14688e1c198c1192172d51308e90bCraig Mautner        NS = stops != null ? stops.size() : 0;
1869f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if ((NF=mFinishingActivities.size()) > 0) {
1870f333327782e14688e1c198c1192172d51308e90bCraig Mautner            finishes = new ArrayList<ActivityRecord>(mFinishingActivities);
1871f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mFinishingActivities.clear();
1872f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1873f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1874f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final ArrayList<ActivityRecord> thumbnails;
1875f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final int NT = mCancelledThumbnails.size();
1876f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (NT > 0) {
1877f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = new ArrayList<ActivityRecord>(mCancelledThumbnails);
1878f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mCancelledThumbnails.clear();
1879f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else {
1880f333327782e14688e1c198c1192172d51308e90bCraig Mautner            thumbnails = null;
1881f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1882f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1883f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (isFrontStack(mHomeStack)) {
1884f333327782e14688e1c198c1192172d51308e90bCraig Mautner            booting = mService.mBooting;
1885f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.mBooting = false;
1886f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1887f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1888f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (mStartingUsers.size() > 0) {
1889f333327782e14688e1c198c1192172d51308e90bCraig Mautner            startingUsers = new ArrayList<UserStartedState>(mStartingUsers);
1890f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mStartingUsers.clear();
1891f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1892f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1893f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Perform the following actions from unsynchronized state.
1894f333327782e14688e1c198c1192172d51308e90bCraig Mautner        final IApplicationThread thumbnailThread = sendThumbnail;
1895f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.post(new Runnable() {
1896f333327782e14688e1c198c1192172d51308e90bCraig Mautner            @Override
1897f333327782e14688e1c198c1192172d51308e90bCraig Mautner            public void run() {
1898f333327782e14688e1c198c1192172d51308e90bCraig Mautner                if (thumbnailThread != null) {
1899f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    try {
1900f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        thumbnailThread.requestThumbnail(token);
1901f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    } catch (Exception e) {
1902f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Slog.w(TAG, "Exception thrown when requesting thumbnail", e);
1903f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.sendPendingThumbnail(null, token, null, null, true);
1904f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
1905f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1906f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1907f333327782e14688e1c198c1192172d51308e90bCraig Mautner                // Report back to any thumbnail receivers.
1908f333327782e14688e1c198c1192172d51308e90bCraig Mautner                for (int i = 0; i < NT; i++) {
1909f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    ActivityRecord r = thumbnails.get(i);
1910f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    mService.sendPendingThumbnail(r, null, null, null, true);
1911f333327782e14688e1c198c1192172d51308e90bCraig Mautner                }
1912f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1913f333327782e14688e1c198c1192172d51308e90bCraig Mautner        });
1914f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1915f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Stop any activities that are scheduled to do so but have been
1916f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1917f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NS; i++) {
1918f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = stops.get(i);
1919f333327782e14688e1c198c1192172d51308e90bCraig Mautner            final ActivityStack stack = r.task.stack;
1920f333327782e14688e1c198c1192172d51308e90bCraig Mautner            if (r.finishing) {
1921f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false);
1922f333327782e14688e1c198c1192172d51308e90bCraig Mautner            } else {
1923f333327782e14688e1c198c1192172d51308e90bCraig Mautner                stack.stopActivityLocked(r);
1924f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1925f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1926f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1927f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // Finish any activities that are scheduled to do so but have been
1928f333327782e14688e1c198c1192172d51308e90bCraig Mautner        // waiting for the next one to start.
1929f333327782e14688e1c198c1192172d51308e90bCraig Mautner        for (int i = 0; i < NF; i++) {
1930f333327782e14688e1c198c1192172d51308e90bCraig Mautner            r = finishes.get(i);
1931f333327782e14688e1c198c1192172d51308e90bCraig Mautner            activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle");
1932f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1933f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1934f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (booting) {
1935f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.finishBooting();
1936f333327782e14688e1c198c1192172d51308e90bCraig Mautner        } else if (startingUsers != null) {
1937f333327782e14688e1c198c1192172d51308e90bCraig Mautner            for (int i = 0; i < startingUsers.size(); i++) {
1938f333327782e14688e1c198c1192172d51308e90bCraig Mautner                mService.finishUserSwitch(startingUsers.get(i));
1939f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
1940f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1941f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1942f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mService.trimApplications();
1943f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //dump();
1944f333327782e14688e1c198c1192172d51308e90bCraig Mautner        //mWindowManager.dump();
1945f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1946f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (enableScreen) {
1947f333327782e14688e1c198c1192172d51308e90bCraig Mautner            mService.enableScreenAfterBoot();
1948f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1949f333327782e14688e1c198c1192172d51308e90bCraig Mautner
1950f333327782e14688e1c198c1192172d51308e90bCraig Mautner        if (activityRemoved) {
195105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            resumeTopActivitiesLocked();
1952f333327782e14688e1c198c1192172d51308e90bCraig Mautner        }
1953f333327782e14688e1c198c1192172d51308e90bCraig Mautner
19547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        return r;
1955f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
1956f333327782e14688e1c198c1192172d51308e90bCraig Mautner
19578e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner    boolean handleAppDiedLocked(ProcessRecord app) {
19581909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner        boolean hasVisibleActivities = false;
19591909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
19601909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner            hasVisibleActivities |= mStacks.get(stackNdx).handleAppDiedLocked(app);
19618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19621909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner        return hasVisibleActivities;
19638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
19658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void closeSystemDialogsLocked() {
19668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.closeSystemDialogsLocked();
19708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
197393529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    void removeUserLocked(int userId) {
19744f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        mUserStackInFront.delete(userId);
197593529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner    }
197693529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner
19778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    /**
19788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     * @return true if some activity was finished (or would have finished if doit were true).
19798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner     */
19808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) {
19818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean didSomething = false;
19828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
19838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
19848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
19858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) {
19868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                didSomething = true;
19878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
19888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
19898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return didSomething;
19908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
19918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
1992a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    void updatePreviousProcessLocked(ActivityRecord r) {
1993a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now that this process has stopped, we may want to consider
1994a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // it to be the previous app to try to keep around in case
1995a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // the user wants to return to it.
1996a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
1997a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // First, found out what is currently the foreground app, so that
1998a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // we don't blow away the previous app if this activity is being
1999a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // hosted by the process that is actually still the foreground.
2000a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        ProcessRecord fgApp = null;
2001a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2002a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            final ActivityStack stack = mStacks.get(stackNdx);
2003a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            if (isFrontStack(stack)) {
2004a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                if (stack.mResumedActivity != null) {
2005a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    fgApp = stack.mResumedActivity.app;
2006a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                } else if (stack.mPausingActivity != null) {
2007a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                    fgApp = stack.mPausingActivity.app;
2008a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                }
2009a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                break;
2010a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            }
2011a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2012a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
2013a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // Now set this one as the previous process, only if that really
2014a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        // makes sense to.
2015a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        if (r.app != null && fgApp != null && r.app != fgApp
2016a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn                && r.lastVisibleTime > mService.mPreviousProcessVisibleTime
20174ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner                && r.app != mService.mHomeProcess) {
2018a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcess = r.app;
2019a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn            mService.mPreviousProcessVisibleTime = r.lastVisibleTime;
2020a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn        }
2021a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn    }
2022a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn
202305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked() {
202405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return resumeTopActivitiesLocked(null, null, null);
202505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
202605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
202705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target,
202805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            Bundle targetOptions) {
202905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        if (targetStack == null) {
203005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner            targetStack = getFocusedStack();
203105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        }
203205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        boolean result = false;
2033dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2034f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2035f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            if (isFrontStack(stack)) {
203605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                if (stack == targetStack) {
203705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    result = stack.resumeTopActivityLocked(target, targetOptions);
203805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } else {
203905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    stack.resumeTopActivityLocked(null);
204005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                }
2041f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner            }
20428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
204305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        return result;
20448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void finishTopRunningActivityLocked(ProcessRecord app) {
20478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
20488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
20498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
20508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.finishTopRunningActivityLocked(app);
20518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) {
20558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
20568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) {
20577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" +
20581d001b670e34fe887488047f525a5430154626e1Craig Mautner                        mStacks.get(stackNdx));
20598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return;
20608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2064967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ActivityStack getStack(int stackId) {
20658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
20668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
20678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (stack.getStackId() == stackId) {
20688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                return stack;
20698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
20718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return null;
20728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2074967212cb542e6eeb308678367b53381bff984c31Craig Mautner    ArrayList<ActivityStack> getStacks() {
2075967212cb542e6eeb308678367b53381bff984c31Craig Mautner        return new ArrayList<ActivityStack>(mStacks);
2076967212cb542e6eeb308678367b53381bff984c31Craig Mautner    }
2077967212cb542e6eeb308678367b53381bff984c31Craig Mautner
2078967212cb542e6eeb308678367b53381bff984c31Craig Mautner    int createStack() {
2079858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        while (true) {
2080858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (++mLastStackId <= HOME_STACK_ID) {
2081858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                mLastStackId = HOME_STACK_ID + 1;
2082858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            }
2083858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner            if (getStack(mLastStackId) == null) {
2084858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner                break;
20858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
20868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2087858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId));
2088858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        return mLastStackId;
20898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
20908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
20918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void moveTaskToStack(int taskId, int stackId, boolean toTop) {
2092b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        final TaskRecord task = anyTaskForIdLocked(taskId);
2093b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        if (task == null) {
2094b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner            return;
2095b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        }
20968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final ActivityStack stack = getStack(stackId);
20978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        if (stack == null) {
20988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
20998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            return;
21008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2101b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        removeTask(task);
2102b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        stack.addTask(task, toTop);
2103b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner        mWindowManager.addTask(taskId, stackId, toTop);
210405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        resumeTopActivitiesLocked();
21058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2107ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner    ActivityRecord findTaskLocked(ActivityRecord r) {
21082a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn        if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r);
21098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2110ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2111ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            if (!r.isApplicationActivity() && !stack.isHomeStack()) {
21122a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn                if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: " + stack);
2113ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner                continue;
2114ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            }
2115ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner            final ActivityRecord ar = stack.findTaskLocked(r);
21168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
21178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
21188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
21198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
21202a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn        if (DEBUG_TASKS) Slog.d(TAG, "No task found");
21218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
21228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
21238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
21248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) {
21258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            final ActivityRecord ar = mStacks.get(stackNdx).findActivityLocked(intent, info);
21278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            if (ar != null) {
21288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner                return ar;
21298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner            }
21308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        }
21318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner        return null;
21328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner    }
21338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner
21348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void goingToSleepLocked() {
21350eea92c67b292b005c152641a12b920fe145826cCraig Mautner        scheduleSleepTimeout();
21360eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mGoingToSleep.isHeld()) {
21370eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.acquire();
21387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner            if (mLaunchingActivity.isHeld()) {
21397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) {
21407ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    throw new IllegalStateException("Calling must be system uid");
21410eea92c67b292b005c152641a12b920fe145826cCraig Mautner                }
21427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mLaunchingActivity.release();
21437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG);
21440eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
21458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2146ce15e157a6cf56fc73961ccb8c5ab18b1bf70280Amith Yamasani        checkReadyForSleepLocked();
21478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
21498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean shutdownLocked(int timeout) {
21508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        boolean timedout = false;
21510eea92c67b292b005c152641a12b920fe145826cCraig Mautner        goingToSleepLocked();
21520eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21530eea92c67b292b005c152641a12b920fe145826cCraig Mautner        final long endTime = System.currentTimeMillis() + timeout;
21540eea92c67b292b005c152641a12b920fe145826cCraig Mautner        while (true) {
21550eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean cantShutdown = false;
21560eea92c67b292b005c152641a12b920fe145826cCraig Mautner            for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21570eea92c67b292b005c152641a12b920fe145826cCraig Mautner                cantShutdown |= mStacks.get(stackNdx).checkReadyForSleepLocked();
21580eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
21590eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (cantShutdown) {
21600eea92c67b292b005c152641a12b920fe145826cCraig Mautner                long timeRemaining = endTime - System.currentTimeMillis();
21610eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (timeRemaining > 0) {
21628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
21630eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        mService.wait(timeRemaining);
21648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } catch (InterruptedException e) {
21658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
21660eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } else {
21670eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    Slog.w(TAG, "Activity manager shutdown timed out");
21680eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    timedout = true;
21690eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    break;
21708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
21710eea92c67b292b005c152641a12b920fe145826cCraig Mautner            } else {
21720eea92c67b292b005c152641a12b920fe145826cCraig Mautner                break;
21738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
21748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21750eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21760eea92c67b292b005c152641a12b920fe145826cCraig Mautner        // Force checkReadyForSleep to complete.
21770eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = true;
21780eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
21790eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        return timedout;
21818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
21828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
21838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void comeOutOfSleepIfNeededLocked() {
21840eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
21850eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
21860eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
21870eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
2188ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
21898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2190ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            stack.awakeFromSleepingLocked();
21915314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner            if (isFrontStack(stack)) {
21925314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner                resumeTopActivitiesLocked();
21935314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner            }
21948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
21950eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.clear();
21960eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
21970eea92c67b292b005c152641a12b920fe145826cCraig Mautner
21980eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void activitySleptLocked(ActivityRecord r) {
21990eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mGoingToSleepActivities.remove(r);
22000eea92c67b292b005c152641a12b920fe145826cCraig Mautner        checkReadyForSleepLocked();
22010eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
22020eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22030eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void checkReadyForSleepLocked() {
22040eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mService.isSleepingOrShuttingDown()) {
22050eea92c67b292b005c152641a12b920fe145826cCraig Mautner            // Do not care.
22060eea92c67b292b005c152641a12b920fe145826cCraig Mautner            return;
22070eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
22080eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22090eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (!mSleepTimeout) {
22100eea92c67b292b005c152641a12b920fe145826cCraig Mautner            boolean dontSleep = false;
22110eea92c67b292b005c152641a12b920fe145826cCraig Mautner            for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
22120eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep |= mStacks.get(stackNdx).checkReadyForSleepLocked();
22130eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
22140eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22150eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mStoppingActivities.size() > 0) {
22160eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to stop; can't sleep yet.
22170eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop "
22180eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mStoppingActivities.size() + " activities");
22190eea92c67b292b005c152641a12b920fe145826cCraig Mautner                scheduleIdleLocked();
22200eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
22210eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
22220eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22230eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (mGoingToSleepActivities.size() > 0) {
22240eea92c67b292b005c152641a12b920fe145826cCraig Mautner                // Still need to tell some activities to sleep; can't sleep yet.
22250eea92c67b292b005c152641a12b920fe145826cCraig Mautner                if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep "
22260eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        + mGoingToSleepActivities.size() + " activities");
22270eea92c67b292b005c152641a12b920fe145826cCraig Mautner                dontSleep = true;
22280eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
22290eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22300eea92c67b292b005c152641a12b920fe145826cCraig Mautner            if (dontSleep) {
22310eea92c67b292b005c152641a12b920fe145826cCraig Mautner                return;
22320eea92c67b292b005c152641a12b920fe145826cCraig Mautner            }
22330eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
22340eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22350eea92c67b292b005c152641a12b920fe145826cCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
22360eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mStacks.get(stackNdx).goToSleep();
22370eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
22380eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22390eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
22400eea92c67b292b005c152641a12b920fe145826cCraig Mautner
22410eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mGoingToSleep.isHeld()) {
22420eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mGoingToSleep.release();
22430eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
22440eea92c67b292b005c152641a12b920fe145826cCraig Mautner        if (mService.mShuttingDown) {
22450eea92c67b292b005c152641a12b920fe145826cCraig Mautner            mService.notifyAll();
22460eea92c67b292b005c152641a12b920fe145826cCraig Mautner        }
22478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2249ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    boolean reportResumedActivityLocked(ActivityRecord r) {
2250ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        final ActivityStack stack = r.task.stack;
2251ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (isFrontStack(stack)) {
22525782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey            mService.updateUsageStats(r, true);
2253ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2254ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        if (allResumedActivitiesComplete()) {
2255ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            ensureActivitiesVisibleLocked(null, 0);
2256ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            mWindowManager.executeAppTransition();
2257ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            return true;
2258ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2259ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return false;
2260ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2261ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
22628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void handleAppCrashLocked(ProcessRecord app) {
22638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
22648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
22658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
22668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.handleAppCrashLocked(app);
22678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2270de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) {
2271580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // First the front stacks. In case any are not fullscreen and are in front of home.
2272580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        boolean showHomeBehindStack = false;
2273de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2274580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2275580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (isFrontStack(stack)) {
2276580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                showHomeBehindStack =
2277580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                        stack.ensureActivitiesVisibleLocked(starting, configChanges);
2278580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
2279580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        }
2280580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        // Now do back stacks.
2281580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2282580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2283580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            if (!isFrontStack(stack)) {
2284580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner                stack.ensureActivitiesVisibleLocked(starting, configChanges, showHomeBehindStack);
2285580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner            }
22868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
22898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    void scheduleDestroyAllActivities(ProcessRecord app, String reason) {
22908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
22918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
22928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
22938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            stack.scheduleDestroyActivities(app, false, reason);
22948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
22958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
22968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
22978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean switchUserLocked(int userId, UserStartedState uss) {
22984f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId());
22994f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID);
23002420ead0326bfd2587da6231be419e758dba1930Craig Mautner        mCurrentUser = userId;
2301ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner
2302858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner        mStartingUsers.add(uss);
2303ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
230493529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner            mStacks.get(stackNdx).switchUserLocked(userId);
2305ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner        }
2306858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner
23074f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        ActivityStack stack = getStack(restoreStackId);
23084f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        if (stack == null) {
23094f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner            stack = mHomeStack;
23104f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        }
23114f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        final boolean homeInFront = stack.isHomeStack();
231293529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        moveHomeStack(homeInFront);
23134f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner        mWindowManager.moveTaskToTop(stack.topTask().taskId);
231493529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner        return homeInFront;
23152219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner    }
23162219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner
2317de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) {
2318de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        int N = mStoppingActivities.size();
2319de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        if (N <= 0) return null;
2320de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2321de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        ArrayList<ActivityRecord> stops = null;
2322de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2323de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        final boolean nowVisible = allResumedActivitiesVisible();
2324de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        for (int i=0; i<N; i++) {
2325de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            ActivityRecord s = mStoppingActivities.get(i);
2326a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner            if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible="
2327de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + nowVisible + " waitingVisible=" + s.waitingVisible
2328de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    + " finishing=" + s.finishing);
2329de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if (s.waitingVisible && nowVisible) {
2330de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mWaitingVisibleActivities.remove(s);
2331de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                s.waitingVisible = false;
2332de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (s.finishing) {
2333de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // If this activity is finishing, it is sitting on top of
2334de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // everyone else but we now know it is no longer needed...
2335de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // so get rid of it.  Otherwise, we need to go through the
2336de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // normal flow and hide it once we determine that it is
2337de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    // hidden by the activities in front of it.
2338de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s);
2339ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner                    mWindowManager.setAppVisibility(s.appToken, false);
2340de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2341de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2342de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) {
2343de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (localLOGV) Slog.v(TAG, "Ready to stop: " + s);
2344de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                if (stops == null) {
2345de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                    stops = new ArrayList<ActivityRecord>();
2346de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                }
2347de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                stops.add(s);
2348de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                mStoppingActivities.remove(i);
2349de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                N--;
2350de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner                i--;
2351de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner            }
2352de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        }
2353de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2354de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner        return stops;
2355de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner    }
2356de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
2357cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    void validateTopActivitiesLocked() {
2358cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) {
2359cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
2360cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            final ActivityRecord r = stack.topRunningActivityLocked(null);
2361f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner            final ActivityState state = r == null ? ActivityState.DESTROYED : r.state;
2362cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            if (isFrontStack(stack)) {
2363cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                if (r == null) {
2364cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: null top activity, stack=" + stack);
2365cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                } else {
2366f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    final ActivityRecord pausing = stack.mPausingActivity;
2367f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (pausing != null && pausing == r) {
2368cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r +
2369f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
2370cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2371f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                    if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) {
2372cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                        Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r +
2373f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                                " state=" + state);
2374cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    }
2375cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2376cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            } else {
2377f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                final ActivityRecord resumed = stack.mResumedActivity;
2378f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (resumed != null && resumed == r) {
2379cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r +
2380f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        " state=" + state);
2381cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2382f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                if (r != null && (state == ActivityState.INITIALIZING
2383f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                        || state == ActivityState.RESUMED)) {
2384cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                    Slog.e(TAG, "validateTop...: activity in back resumed r=" + r +
2385f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner                            " state=" + state);
2386cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner                }
2387cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner            }
2388cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner        }
2389cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner    }
2390cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner
239176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner    private static String stackStateToString(int stackState) {
239276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner        switch (stackState) {
239376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_IN_FRONT: return "STACK_STATE_HOME_IN_FRONT";
239476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_TO_BACK: return "STACK_STATE_HOME_TO_BACK";
239576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_IN_BACK: return "STACK_STATE_HOME_IN_BACK";
239676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            case STACK_STATE_HOME_TO_FRONT: return "STACK_STATE_HOME_TO_FRONT";
239776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner            default: return "Unknown stackState=" + stackState;
239876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner        }
239976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner    }
240076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner
2401270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    public void dump(PrintWriter pw, String prefix) {
2402d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity=");
2403270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner                pw.println(mDismissKeyguardOnNextActivity);
2404d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack);
2405d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner                pw.print(" mStackState="); pw.println(stackStateToString(mStackState));
2406d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout);
2407d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId);
2408d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner        pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront);
2409270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner    }
24108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
241120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
2412ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        return getFocusedStack().getDumpActivitiesLocked(name);
241320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner    }
241420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner
2415390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage,
2416390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            boolean needSep, String prefix) {
2417390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        if (activity != null) {
2418390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (dumpPackage == null || dumpPackage.equals(activity.packageName)) {
2419390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                if (needSep) {
2420390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    pw.println();
2421390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                }
2422390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.print(prefix);
2423390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println(activity);
24247ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                return true;
2425390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
2426390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        }
24277ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return false;
2428390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    }
2429390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn
24308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
24318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            boolean dumpClient, String dumpPackage) {
24327ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean printed = false;
24337ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        boolean needSep = false;
24348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        final int numStacks = mStacks.size();
24358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) {
24368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityStack stack = mStacks.get(stackNdx);
24377ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            StringBuilder stackHeader = new StringBuilder(128);
24387ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            stackHeader.append("  Stack #");
24397ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            stackHeader.append(mStacks.indexOf(stack));
24407ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            stackHeader.append(":");
24417ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, needSep,
24427ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    stackHeader.toString());
24437ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, "    ", "Run", false, !dumpAll,
24447ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    false, dumpPackage, true, "    Running activities (most recent first):", null);
24457ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn
24467ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            needSep = printed;
24477ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep,
2448390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    "    mPausingActivity: ");
24497ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (pr) {
24507ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                printed = true;
24517ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                needSep = false;
24527ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
24537ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep,
2454390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                    "    mResumedActivity: ");
24557ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (pr) {
24567ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                printed = true;
24577ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                needSep = false;
24587ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
24598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpAll) {
24607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep,
2461390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                        "    mLastPausedActivity: ");
24627ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                if (pr) {
24637ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                    printed = true;
24640f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                    needSep = true;
24657ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                }
24660f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage,
24670f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner                        needSep, "    mLastNoHistoryActivity: ");
24688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
24697ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            needSep = printed;
24708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
24718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
24727ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mFinishingActivities, "  ", "Fin", false, !dumpAll,
24737ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to finish:", null);
24747ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mStoppingActivities, "  ", "Stop", false, !dumpAll,
24757ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to stop:", null);
24767ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, "  ", "Wait", false, !dumpAll,
24777ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting for another to become visible:",
24787ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                null);
24797ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
24807ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
24817ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, "  ", "Sleep", false, !dumpAll,
24827ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                false, dumpPackage, true, "  Activities waiting to sleep:", null);
2483de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner
24847ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn        return printed;
24858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
24868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner
2487390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn    static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
24888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            String prefix, String label, boolean complete, boolean brief, boolean client,
24897ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            String dumpPackage, boolean needNL, String header1, String header2) {
24908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        TaskRecord lastTask = null;
2491390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String innerPrefix = null;
2492390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        String[] args = null;
2493390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        boolean printed = false;
24948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        for (int i=list.size()-1; i>=0; i--) {
24958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final ActivityRecord r = list.get(i);
24968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (dumpPackage != null && !dumpPackage.equals(r.packageName)) {
24978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                continue;
24988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
2499390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            if (innerPrefix == null) {
2500390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                innerPrefix = prefix + "      ";
2501390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                args = new String[0];
2502390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
2503390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            printed = true;
25048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            final boolean full = !brief && (complete || !r.isInHistory());
25058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (needNL) {
2506390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn                pw.println("");
25078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = false;
25088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
25097ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header1 != null) {
25107ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header1);
25117ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header1 = null;
25127ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            }
25137ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn            if (header2 != null) {
25147ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                pw.println(header2);
25157ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn                header2 = null;
2516390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn            }
25178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (lastTask != r.task) {
25188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                lastTask = r.task;
25198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(prefix);
25208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(full ? "* " : "  ");
25218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.println(lastTask);
25228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (full) {
25238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    lastTask.dump(pw, prefix + "  ");
25248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } else if (complete) {
25258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    // Complete + brief == give a summary.  Isn't that obvious?!?
25268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    if (lastTask.intent != null) {
25278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        pw.print(prefix); pw.print("  ");
25288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                pw.println(lastTask.intent.toInsecureStringWithClip());
25298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
25308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
25318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
25328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(prefix); pw.print(full ? "  * " : "    "); pw.print(label);
25338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.print(" #"); pw.print(i); pw.print(": ");
25348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            pw.println(r);
25358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (full) {
25368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                r.dump(pw, innerPrefix);
25378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            } else if (complete) {
25388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // Complete + brief == give a summary.  Isn't that obvious?!?
25398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.print(innerPrefix); pw.println(r.intent.toInsecureString());
25408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                if (r.app != null) {
25418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.print(innerPrefix); pw.println(r.app);
25428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
25438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
25448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            if (client && r.app != null && r.app.thread != null) {
25458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // flush anything that is already in the PrintWriter since the thread is going
25468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                // to write to the file descriptor directly
25478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                pw.flush();
25488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                try {
25498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    TransferPipe tp = new TransferPipe();
25508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    try {
25518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
25528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                                r.appToken, innerPrefix, args);
25538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // Short timeout, since blocking here can
25548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        // deadlock with the application.
25558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.go(fd, 2000);
25568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    } finally {
25578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                        tp.kill();
25588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    }
25598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (IOException e) {
25608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Failure while dumping the activity: " + e);
25618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                } catch (RemoteException e) {
25628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                    pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
25638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                }
25648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner                needNL = true;
25658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner            }
25668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner        }
2567390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn        return printed;
25688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner    }
2569ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2570f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void scheduleIdleTimeoutLocked(ActivityRecord next) {
2571b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4));
2572c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next);
2573c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner        mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT);
2574f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2575f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2576f333327782e14688e1c198c1192172d51308e90bCraig Mautner    final void scheduleIdleLocked() {
257705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(IDLE_NOW_MSG);
2578f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2579f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2580f333327782e14688e1c198c1192172d51308e90bCraig Mautner    void removeTimeoutsForActivityLocked(ActivityRecord r) {
2581b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner        if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4));
2582f333327782e14688e1c198c1192172d51308e90bCraig Mautner        mHandler.removeMessages(IDLE_TIMEOUT_MSG, r);
2583f333327782e14688e1c198c1192172d51308e90bCraig Mautner    }
2584f333327782e14688e1c198c1192172d51308e90bCraig Mautner
258505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    final void scheduleResumeTopActivities() {
258605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner        mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG);
258705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner    }
258805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner
25890eea92c67b292b005c152641a12b920fe145826cCraig Mautner    void removeSleepTimeouts() {
25900eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mSleepTimeout = false;
25910eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.removeMessages(SLEEP_TIMEOUT_MSG);
25920eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
25930eea92c67b292b005c152641a12b920fe145826cCraig Mautner
25940eea92c67b292b005c152641a12b920fe145826cCraig Mautner    final void scheduleSleepTimeout() {
25950eea92c67b292b005c152641a12b920fe145826cCraig Mautner        removeSleepTimeouts();
25960eea92c67b292b005c152641a12b920fe145826cCraig Mautner        mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT);
25970eea92c67b292b005c152641a12b920fe145826cCraig Mautner    }
25980eea92c67b292b005c152641a12b920fe145826cCraig Mautner
2599ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    private final class ActivityStackSupervisorHandler extends Handler {
2600f333327782e14688e1c198c1192172d51308e90bCraig Mautner
2601ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public ActivityStackSupervisorHandler(Looper looper) {
2602ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            super(looper);
2603ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2604ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner
2605f333327782e14688e1c198c1192172d51308e90bCraig Mautner        void activityIdleInternal(ActivityRecord r) {
2606f333327782e14688e1c198c1192172d51308e90bCraig Mautner            synchronized (mService) {
2607f333327782e14688e1c198c1192172d51308e90bCraig Mautner                activityIdleInternalLocked(r != null ? r.appToken : null, true, null);
2608f333327782e14688e1c198c1192172d51308e90bCraig Mautner            }
26097ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner        }
26107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner
2611ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        @Override
2612ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        public void handleMessage(Message msg) {
2613ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            switch (msg.what) {
2614f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_TIMEOUT_MSG: {
26155eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj);
2616f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    if (mService.mDidDexOpt) {
2617f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mService.mDidDexOpt = false;
2618f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG);
2619f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        nmsg.obj = msg.obj;
2620f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT);
2621f333327782e14688e1c198c1192172d51308e90bCraig Mautner                        return;
2622f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    }
2623f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // We don't at this point know if the activity is fullscreen,
2624f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    // so we need to be conservative and assume it isn't.
2625f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2626f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
2627f333327782e14688e1c198c1192172d51308e90bCraig Mautner                case IDLE_NOW_MSG: {
26285eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner                    if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj);
2629f333327782e14688e1c198c1192172d51308e90bCraig Mautner                    activityIdleInternal((ActivityRecord)msg.obj);
2630f333327782e14688e1c198c1192172d51308e90bCraig Mautner                } break;
263105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                case RESUME_TOP_ACTIVITY_MSG: {
263205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    synchronized (mService) {
263305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                        resumeTopActivitiesLocked();
263405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                    }
263505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner                } break;
26360eea92c67b292b005c152641a12b920fe145826cCraig Mautner                case SLEEP_TIMEOUT_MSG: {
26370eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    synchronized (mService) {
26380eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        if (mService.isSleepingOrShuttingDown()) {
26390eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            Slog.w(TAG, "Sleep timeout!  Sleeping now.");
26400eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            mSleepTimeout = true;
26410eea92c67b292b005c152641a12b920fe145826cCraig Mautner                            checkReadyForSleepLocked();
26420eea92c67b292b005c152641a12b920fe145826cCraig Mautner                        }
26430eea92c67b292b005c152641a12b920fe145826cCraig Mautner                    }
26440eea92c67b292b005c152641a12b920fe145826cCraig Mautner                } break;
26457ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                case LAUNCH_TIMEOUT_MSG: {
26467ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    if (mService.mDidDexOpt) {
26477ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mService.mDidDexOpt = false;
26487ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT);
26497ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        return;
26507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
26517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    synchronized (mService) {
26527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        if (mLaunchingActivity.isHeld()) {
26537ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            Slog.w(TAG, "Launch timeout has expired, giving up wake lock!");
26547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            if (VALIDATE_WAKE_LOCK_CALLER
26557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                    && Binder.getCallingUid() != Process.myUid()) {
26567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                                throw new IllegalStateException("Calling must be system uid");
26577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            }
26587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                            mLaunchingActivity.release();
26597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                        }
26607ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                    }
26617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner                } break;
2662ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner            }
2663ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner        }
2664ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner    }
2665270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner}
2666