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 } 9083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mService.updateLruProcessLocked(app, true, true); 9092420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9102420ead0326bfd2587da6231be419e758dba1930Craig Mautner final ActivityStack stack = r.task.stack; 9112420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 9122420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.thread == null) { 9132420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw new RemoteException(); 9142420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9152420ead0326bfd2587da6231be419e758dba1930Craig Mautner List<ResultInfo> results = null; 9162420ead0326bfd2587da6231be419e758dba1930Craig Mautner List<Intent> newIntents = null; 9172420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 9182420ead0326bfd2587da6231be419e758dba1930Craig Mautner results = r.results; 9192420ead0326bfd2587da6231be419e758dba1930Craig Mautner newIntents = r.newIntents; 9202420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9212420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 9222420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " icicle=" + r.icicle 9232420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " with results=" + results + " newIntents=" + newIntents 9242420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " andResume=" + andResume); 9252420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 9262420ead0326bfd2587da6231be419e758dba1930Craig Mautner EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 9272420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.userId, System.identityHashCode(r), 9282420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.task.taskId, r.shortComponentName); 9292420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 930ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (r.isHomeActivity() && r.isNotResolverActivity()) { 9314ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner // Home process is the root process of the task. 9324ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner mService.mHomeProcess = r.task.mActivities.get(0).app; 9332420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9342420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 9352420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.sleeping = false; 9362420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.forceNewConfig = false; 9372420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.showAskCompatModeDialogLocked(r); 9382420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 9392420ead0326bfd2587da6231be419e758dba1930Craig Mautner String profileFile = null; 9402420ead0326bfd2587da6231be419e758dba1930Craig Mautner ParcelFileDescriptor profileFd = null; 9412420ead0326bfd2587da6231be419e758dba1930Craig Mautner boolean profileAutoStop = false; 9422420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 9432420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileProc == null || mService.mProfileProc == app) { 9442420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mProfileProc = app; 9452420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFile = mService.mProfileFile; 9462420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = mService.mProfileFd; 9472420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileAutoStop = mService.mAutoStopProfiler; 9482420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9492420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9502420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.hasShownUi = true; 9512420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.pendingUiClean = true; 9522420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 9532420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 9542420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = profileFd.dup(); 9552420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException e) { 9562420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 9572420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 9582420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd.close(); 9592420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException o) { 9602420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9612420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = null; 9622420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9632420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9642420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 965a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP); 9662420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 9672420ead0326bfd2587da6231be419e758dba1930Craig Mautner System.identityHashCode(r), r.info, 968a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn new Configuration(mService.mConfiguration), r.compat, 969a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn app.repProcState, r.icicle, results, newIntents, !andResume, 9702420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.isNextTransitionForward(), profileFile, profileFd, 9712420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileAutoStop); 9722420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9732420ead0326bfd2587da6231be419e758dba1930Craig Mautner if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 9742420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This may be a heavy-weight process! Note that the package 9752420ead0326bfd2587da6231be419e758dba1930Craig Mautner // manager will ensure that only activity can run in the main 9762420ead0326bfd2587da6231be419e758dba1930Craig Mautner // process of the .apk, which is the only thing that will be 9772420ead0326bfd2587da6231be419e758dba1930Craig Mautner // considered heavy-weight. 9782420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.processName.equals(app.info.packageName)) { 9792420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mHeavyWeightProcess != null 9802420ead0326bfd2587da6231be419e758dba1930Craig Mautner && mService.mHeavyWeightProcess != app) { 9812420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Starting new heavy weight process " + app 9822420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " when already running " 9832420ead0326bfd2587da6231be419e758dba1930Craig Mautner + mService.mHeavyWeightProcess); 9842420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9852420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHeavyWeightProcess = app; 9862420ead0326bfd2587da6231be419e758dba1930Craig Mautner Message msg = mService.mHandler.obtainMessage( 9872420ead0326bfd2587da6231be419e758dba1930Craig Mautner ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 9882420ead0326bfd2587da6231be419e758dba1930Craig Mautner msg.obj = r; 9892420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHandler.sendMessage(msg); 9902420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9912420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9922420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9932420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (RemoteException e) { 9942420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (r.launchFailed) { 9952420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the second time we failed -- finish activity 9962420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and give up. 9972420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.e(TAG, "Second failure launching " 9982420ead0326bfd2587da6231be419e758dba1930Craig Mautner + r.intent.getComponent().flattenToShortString() 9992420ead0326bfd2587da6231be419e758dba1930Craig Mautner + ", giving up", e); 10002420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.appDiedLocked(app, app.pid, app.thread); 10012420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 10022420ead0326bfd2587da6231be419e758dba1930Craig Mautner "2nd-crash", false); 10032420ead0326bfd2587da6231be419e758dba1930Craig Mautner return false; 10042420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10052420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10062420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the first time we failed -- restart process and 10072420ead0326bfd2587da6231be419e758dba1930Craig Mautner // retry. 10082420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.activities.remove(r); 10092420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw e; 10102420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10112420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10122420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.launchFailed = false; 10132420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (stack.updateLRUListLocked(r)) { 10142420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Activity " + r 10152420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " being launched, but already in LRU list"); 10162420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10172420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10182420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 10192420ead0326bfd2587da6231be419e758dba1930Craig Mautner // As part of the process of launching, ActivityThread also performs 10202420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a resume. 10212420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.minimalResumeActivityLocked(r); 10222420ead0326bfd2587da6231be419e758dba1930Craig Mautner } else { 10232420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This activity is not starting in the resumed state... which 10242420ead0326bfd2587da6231be419e758dba1930Craig Mautner // should look like we asked it to pause+stop (but remain visible), 10252420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and it has done so and reported back the current icicle and 10262420ead0326bfd2587da6231be419e758dba1930Craig Mautner // other state. 10272420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 10282420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " (starting in stopped state)"); 10292420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.state = ActivityState.STOPPED; 10302420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.stopped = true; 10312420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10322420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10332420ead0326bfd2587da6231be419e758dba1930Craig Mautner // Launch the new version setup screen if needed. We do this -after- 10342420ead0326bfd2587da6231be419e758dba1930Craig Mautner // launching the initial activity (that is, home), so that it can have 10352420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a chance to initialize itself while in the background, making the 10362420ead0326bfd2587da6231be419e758dba1930Craig Mautner // switch back to it faster and look better. 1037de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (isFrontStack(stack)) { 10382420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.startSetupActivityLocked(); 10392420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10402420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10412420ead0326bfd2587da6231be419e758dba1930Craig Mautner return true; 10422420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10432420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1044e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner void startSpecificActivityLocked(ActivityRecord r, 1045e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner boolean andResume, boolean checkConfig) { 1046e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // Is this activity's application already running? 1047e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner ProcessRecord app = mService.getProcessRecordLocked(r.processName, 10483bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn r.info.applicationInfo.uid, true); 1049e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1050e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner r.task.stack.setLaunchTime(r); 1051e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1052e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner if (app != null && app.thread != null) { 1053e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner try { 1054d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn app.addPackage(r.info.packageName, mService.mProcessStats); 1055e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner realStartActivityLocked(r, app, andResume, checkConfig); 1056e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner return; 1057e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } catch (RemoteException e) { 1058e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner Slog.w(TAG, "Exception when starting activity " 1059e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner + r.intent.getComponent().flattenToShortString(), e); 1060e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1061e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1062e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // If a dead object exception was thrown -- fall through to 1063e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // restart the application. 1064e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1065e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1066e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 10673bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn "activity", r.intent.getComponent(), false, false, true); 1068e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1069e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 10706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startActivityLocked(IApplicationThread caller, 10716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo, 10726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner String resultWho, int requestCode, 10736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options, 10746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner boolean componentSpecified, ActivityRecord[] outActivity) { 10756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int err = ActivityManager.START_SUCCESS; 10766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 10776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ProcessRecord callerApp = null; 10786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (caller != null) { 10796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callerApp = mService.getRecordForAppLocked(caller); 10806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (callerApp != null) { 10816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingPid = callerApp.pid; 10826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid = callerApp.info.uid; 10836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 10846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, "Unable to find app for caller " + caller 10856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " (pid=" + callingPid + ") when starting: " 10866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + intent.toString()); 10876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_PERMISSION_DENIED; 10886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 10916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS) { 10926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; 10936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false) 10946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + "} from pid " + (callerApp != null ? callerApp.pid : callingPid)); 10956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 10976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord sourceRecord = null; 10986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord resultRecord = null; 10996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultTo != null) { 11006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord = isInAnyStackLocked(resultTo); 11016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (DEBUG_RESULTS) Slog.v( 11026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner TAG, "Will send result to " + resultTo + " " + sourceRecord); 11036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (sourceRecord != null) { 11046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0 && !sourceRecord.finishing) { 11056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord; 11066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack; 11106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int launchFlags = intent.getFlags(); 11126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 11146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner && sourceRecord != null) { 11156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Transfer the result target from the source activity to the new 11166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // one being started, including any failures. 11176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0) { 11186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 11196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 11206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord.resultTo; 11226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultWho = sourceRecord.resultWho; 11236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner requestCode = sourceRecord.requestCode; 11246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord.resultTo = null; 11256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 11266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord.removeResultsLocked( 11276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord, resultWho, requestCode); 11286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { 11326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find a class that can handle the given Intent. 11336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // That's the end of that! 11346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_INTENT_NOT_RESOLVED; 11356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && aInfo == null) { 11386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find the specific class specified in the Intent. 11396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Also the end of the line. 11406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_CLASS_NOT_FOUND; 11416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err != ActivityManager.START_SUCCESS) { 11446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 11456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 11466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 11476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 11486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner setDismissKeyguard(false); 11506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 11516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 11526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startAnyPerm = mService.checkPermission( 11556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner START_ANY_ACTIVITY, callingPid, callingUid); 11566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid, 11576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid, aInfo.applicationInfo.uid, aInfo.exported); 11586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) { 11596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 11606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 11616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 11626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 11636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner setDismissKeyguard(false); 11656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner String msg; 11666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (!aInfo.exported) { 11676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 11686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 11696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 11706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " not exported from uid " + aInfo.applicationInfo.uid; 11716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 11726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 11736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 11746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 11756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " requires " + aInfo.permission; 11766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, msg); 11786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner throw new SecurityException(msg); 11796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1181dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid, 1182b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver callingPid, resolvedType, aInfo.applicationInfo); 11835e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver 11846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mController != null) { 11856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner try { 11866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // The Intent we give to the watcher has the extra data 11876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // stripped off, since it can contain private information. 11886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Intent watchIntent = intent.cloneFilter(); 11895e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver abort |= !mService.mController.activityStarting(watchIntent, 11906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner aInfo.applicationInfo.packageName); 11916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } catch (RemoteException e) { 11926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mController = null; 11936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11945e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver } 11956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11965e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (abort) { 11975e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (resultRecord != null) { 11985e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, 11996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 12006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12015e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // We pretend to the caller that it was really started, but 12025e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // they will just get a cancel result. 12035e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver setDismissKeyguard(false); 12045e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver ActivityOptions.abort(options); 12055e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver return ActivityManager.START_SUCCESS; 12066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage, 12096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner intent, resolvedType, aInfo, mService.mConfiguration, 1210de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resultRecord, resultWho, requestCode, componentSpecified, this); 12116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (outActivity != null) { 12126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner outActivity[0] = r; 12136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1215ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = getFocusedStack(); 1216de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stack.mResumedActivity == null 1217de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner || stack.mResumedActivity.info.applicationInfo.uid != callingUid) { 12186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 12196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner PendingActivityLaunch pal = 1220de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner new PendingActivityLaunch(r, sourceRecord, startFlags, stack); 12216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mPendingActivityLaunches.add(pal); 12226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner setDismissKeyguard(false); 12236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 12246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_SWITCHES_CANCELED; 12256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mDidAppSwitch) { 12296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // This is the second allowed switch since we stopped switches, 12306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // so now just generally allow switches. Use case: user presses 12316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // home (switches disabled, switch to home, mDidAppSwitch now true); 12326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // user taps a home icon (coming from home so allowed, we hit here 12336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // and now allow anyone to switch again). 12346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mAppSwitchesAllowedTime = 0; 12356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 12366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mDidAppSwitch = true; 12376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.doPendingActivityLaunchesLocked(false); 12406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options); 124210385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner 124310385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner if (allPausedActivitiesComplete()) { 124410385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner // If someone asked to have the keyguard dismissed on the next 12456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // activity start, but we are not actually doing an activity 12466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // switch... just dismiss the keyguard now, because we 12476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // probably want to see whatever is behind it. 12486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner dismissKeyguard(); 12496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 12516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1253ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityStack adjustStackFocus(ActivityRecord r) { 12541d001b670e34fe887488047f525a5430154626e1Craig Mautner final TaskRecord task = r.task; 12551d001b670e34fe887488047f525a5430154626e1Craig Mautner if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) { 1256ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (task != null) { 1257ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (mFocusedStack != task.stack) { 1258ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1259ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Setting focused stack to r=" + r + " task=" + task); 1260ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mFocusedStack = task.stack; 1261ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } else { 1262ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1263ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Focused stack already=" + mFocusedStack); 1264858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1265ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mFocusedStack; 1266858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1267ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1268ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (mFocusedStack != null) { 1269ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1270ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Have a focused stack=" + mFocusedStack); 1271ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mFocusedStack; 1272de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1273ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1274ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) { 1275ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityStack stack = mStacks.get(stackNdx); 1276ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (!stack.isHomeStack()) { 1277ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1278ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Setting focused stack=" + stack); 1279ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mFocusedStack = stack; 1280ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mFocusedStack; 1281ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 12821d001b670e34fe887488047f525a5430154626e1Craig Mautner } 1283ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1284ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner // Time to create the first app stack for this user. 1285ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner int stackId = mService.createStack(-1, HOME_STACK_ID, 1286ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner StackBox.TASK_STACK_GOES_OVER, 1.0f); 1287ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r + 1288ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner " stackId=" + stackId); 1289ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mFocusedStack = getStack(stackId); 129029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return mFocusedStack; 1291de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1292de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mHomeStack; 1293de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1294de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 129529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner void setFocusedStack(ActivityRecord r) { 129629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r == null) { 129729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return; 129829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 129986d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner if (!r.isApplicationActivity() || (r.task != null && !r.task.isApplicationTask())) { 130029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (mStackState != STACK_STATE_HOME_IN_FRONT) { 1301e7c58b6d7d761b93e785b0a399e5b00fdb82f4ceCraig Mautner if (DEBUG_STACK || DEBUG_FOCUS) Slog.d(TAG, "setFocusedStack: mStackState old=" + 130276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(mStackState) + " new=" + 130376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(STACK_STATE_HOME_TO_FRONT) + 130476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner " Callers=" + Debug.getCallers(3)); 130529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner mStackState = STACK_STATE_HOME_TO_FRONT; 130629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 130729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } else { 1308ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1309ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "setFocusedStack: Setting focused stack to r=" + r + " task=" + r.task + 1310ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner " Callers=" + Debug.getCallers(3)); 131129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner mFocusedStack = r.task.stack; 131229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (mStackState != STACK_STATE_HOME_IN_BACK) { 131376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" + 131476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(mStackState) + " new=" + 131576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(STACK_STATE_HOME_TO_BACK) + 131676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner " Callers=" + Debug.getCallers(3)); 131729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner mStackState = STACK_STATE_HOME_TO_BACK; 131829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 131929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 132029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 132129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner 13228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final int startActivityUncheckedLocked(ActivityRecord r, 13238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord sourceRecord, int startFlags, boolean doResume, 13248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner Bundle options) { 13258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final Intent intent = r.intent; 13268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final int callingUid = r.launchedFromUid; 13278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner int launchFlags = intent.getFlags(); 13298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We'll invoke onUserLeaving before onPause only if the launching 13318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity did not explicitly state that this is an automated launch. 1332de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 1333de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving); 13348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has asked not to resume at this point, we make note 13368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of this in the record so that we can skip it when trying to find 13378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the top running activity. 13388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!doResume) { 13398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.delayedResume = true; 13408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null; 13438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the onlyIfNeeded flag is set, then we can do this if the activity 13458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being launched is the same as the one making the call... or, as 13468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a special case, if we do not know the caller then we count the 13478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current top activity as the caller. 13488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 13498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord checkedCaller = sourceRecord; 13508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (checkedCaller == null) { 1351ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop); 13528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!checkedCaller.realActivity.equals(r.realActivity)) { 13548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Caller is not the same as launcher, so always needed. 13558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED; 13568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (sourceRecord == null) { 13608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This activity is not being started from another... in this 13618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // case we -always- start a new task. 13628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 136329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner Slog.w(TAG, "startActivity called from non-Activity context; forcing " + 136429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 13658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 13668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 13688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The original activity who is starting us is running as a single 13698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // instance... this new activity it is starting must go on its 13708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // own task. 13718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 13728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 13738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 13748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The activity being started is a single instance... it always 13758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // gets launched into its own task. 13768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 13778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 1379de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ActivityStack sourceStack; 1380de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (sourceRecord != null) { 13812a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (sourceRecord.finishing) { 13822a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn // If the source is finishing, we can't further count it as our source. This 13832a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn // is because the task it is associated with may now be empty and on its way out, 13842a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn // so we don't want to blindly throw it in to that task. Instead we will take 13852a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn // the NEW_TASK flow and try to find a task for it. 13862a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 13872a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn Slog.w(TAG, "startActivity called from finishing " + sourceRecord 13882a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 13892a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 13902a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn } 13912a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn sourceRecord = null; 13922a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn sourceStack = null; 13932a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn } else { 13942a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn sourceStack = sourceRecord.task.stack; 13952a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn } 1396de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } else { 1397de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner sourceStack = null; 1398de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1399de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 14008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 14018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For whatever reason this activity is being launched into a new 14028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // task... yet the caller has requested a result back. Well, that 14038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is pretty messed up, so instead immediately send back a cancel 14048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // and let the new task continue launched as normal without a 14058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // dependency on its originator. 14068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 14078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, 14088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.resultTo, r.resultWho, r.requestCode, 14098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner Activity.RESULT_CANCELED, null); 14108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.resultTo = null; 14118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 14138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean addingToTask = false; 14148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean movedHome = false; 14158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner TaskRecord reuseTask = null; 1416de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack targetStack; 14178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 14188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 14198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 14208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 14218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If bring to front is requested, and no result is requested, and 14228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we can find a task that was started with this same 14238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // component, then instead of launching bring that one to the front. 14248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo == null) { 14258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // See if there is a task to bring to the front. If this is 14268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a SINGLE_INSTANCE activity, there can be one and only one 14278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // instance of it in the history, and it is always in its own 14288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // unique task, so we do a special search. 14298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 1430ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ? findTaskLocked(r) 14318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner : findActivityLocked(intent, r.info); 14328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity != null) { 143329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) { 143429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner r.task = intentActivity.task; 143529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 14368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack = intentActivity.task.stack; 14370f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 14382a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack 14392a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + " from " + intentActivity); 1440de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner moveHomeStack(targetStack.isHomeStack()); 14418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.task.intent == null) { 14428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This task was started because of movement of 14438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the activity based on affinity... now that we 14448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // are actually launching it, we can assign the 14458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // base intent. 14468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.setIntent(intent, r.info); 14478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the target task is not in the front, then we need 14498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to bring it to the front... except... well, with 14508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 14518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to have the same behavior as if a new instance was 14528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being started, which means not bringing it to the front 14538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // if the caller is not itself in the front. 1454165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner final ActivityStack lastStack = getLastStack(); 1455165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner ActivityRecord curTop = lastStack == null? 1456165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner null : lastStack.topRunningNonDelayedActivityLocked(notTop); 14577504d7b24a07fef05b3447d843f212796e22302fCraig Mautner if (curTop != null && (curTop.task != intentActivity.task || 14587504d7b24a07fef05b3447d843f212796e22302fCraig Mautner curTop.task != lastStack.topTask())) { 14598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 1460d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner if (sourceRecord == null || (sourceStack.topActivity() != null && 1461d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner sourceStack.topActivity().task == sourceRecord.task)) { 14628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We really do want to push this one into the 14638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // user's face, right now. 14648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner movedHome = true; 1465de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 146629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) 146729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { 1468e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner // Caller wants to appear on home activity. 1469ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner intentActivity.task.mOnTopOfHome = true; 1470de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 14718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.moveTaskToFrontLocked(intentActivity.task, r, options); 14728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner options = null; 14738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has requested that the target task be 14768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // reset, then do so. 14778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 14788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r); 14798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 14818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 14828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 14838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! And for paranoia, make 14848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 14858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 148605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(targetStack, null, options); 14878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 14888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 14898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 149029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 149129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 149229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 14938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 14948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags & 14968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 14978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 14988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The caller has requested to completely replace any 14998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task with its new activity. Well that should 15008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // not be too hard... 15018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask = intentActivity.task; 15028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask.performClearTaskLocked(); 15038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask.setIntent(r.intent, r.info); 15048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 15058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 15068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 15078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this situation we want to remove all activities 15088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from the task up to the one being started. In most 15098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // cases this means we are resetting the task to its 15108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // initial state. 15118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord top = 15128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.performClearTaskLocked(r, launchFlags); 15138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 15148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.frontOfTask) { 15158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Activity aliases may mean we use different 15168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intents for the top activity, so make sure 15178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the task now has the identity of the new 15188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intent. 15198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.task.setIntent(r.intent, r.info); 15208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, 15228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r, top.task); 15238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 15248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 15258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // A special case: we need to 15268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // start the activity because it is not currently 15278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // running, and the caller has asked to clear the 15288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current task to have this activity at the top. 15298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 15308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Now pretend like this activity is being started 15318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // by the top of its task, so it is put in the 15328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // right place. 15338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 15348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (r.realActivity.equals(intentActivity.task.realActivity)) { 15368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case the top activity on the task is the 15378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // same as the one being launched, so we take that 15388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // as a request to bring the task to the foreground. 15398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the top activity in the task is the root 15408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity, deliver this new intent to it if it 15418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // desires. 15428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 15438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) 15448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner && intentActivity.realActivity.equals(r.realActivity)) { 15458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, 15468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task); 15478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.frontOfTask) { 15488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.setIntent(r.intent, r.info); 15498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.deliverNewIntentLocked(callingUid, r.intent); 15518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!r.intent.filterEquals(intentActivity.task.intent)) { 15528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching the root activity 15538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of the task, but with a different intent. We 15548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // should start a new instance on top. 15558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 15568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 15578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 15598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case an activity is being launched in to an 15608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task, without resetting that task. This 15618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is typically the situation of launching an activity 15628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from a notification or shortcut. We want to place 15638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the new activity on top of the current task. 15648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 15658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 15668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!intentActivity.task.rootWasReset) { 15678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching in to an existing task 15688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that has not yet been started from its front door. 15698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The current task has been brought to the front. 15708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Ideally, we'd probably like to place this new task 15718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the bottom of its stack, but that's a little hard 15728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to do with the current organization of the code so 15738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // for now we'll just drop it. 15748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.setIntent(r.intent, r.info); 15758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!addingToTask && reuseTask == null) { 15778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We didn't do anything... but it was needed (a.k.a., client 15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // don't use that intent!) And for paranoia, make 15798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 15808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 1581de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner targetStack.resumeTopActivityLocked(null, options); 15828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 15838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 15848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 158529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 158629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 158729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 15888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_TASK_TO_FRONT; 15898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 15948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //String uri = r.intent.toURI(); 15958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Intent intent2 = new Intent(uri); 15968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "Given intent: " + r.intent); 15978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "URI is: " + uri); 15988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "To intent: " + intent2); 15998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.packageName != null) { 16018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the activity being launched is the same as the one currently 16028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the top, then we need to check if it should only be launched 16038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // once. 1604ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack topStack = getFocusedStack(); 1605de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop); 16068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null && r.resultTo == null) { 16078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 16088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.app != null && top.app.thread != null) { 16098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 16108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 16118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 16128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, 16138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.task); 16148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 16158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 16160f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner topStack.mLastPausedActivity = null; 16178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 161805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 16198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 16218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 16228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 16238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 16248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! 162529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 162629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 162729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 16288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 16298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 163129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 163229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 163329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 16348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 16358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 16418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo != null) { 1642de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, 1643de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.requestCode, Activity.RESULT_CANCELED, null); 16448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 164629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 164729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 164829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 16498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_CLASS_NOT_FOUND; 16508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean newTask = false; 16538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean keepCurTransition = false; 16548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Should this be considered a new task? 16568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo == null && !addingToTask 16578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1658ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner targetStack = adjustStackFocus(r); 1659de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner moveHomeStack(targetStack.isHomeStack()); 16608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (reuseTask == null) { 1661de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.setTask(targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true), 1662de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner null, true); 1663de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " + 1664de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.task); 16658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 1666de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.setTask(reuseTask, reuseTask, true); 16678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner newTask = true; 16698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!movedHome) { 1670de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 1671de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 1672de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 1673de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // Caller wants to appear on home activity, so before starting 1674de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // their own activity we will bring home to the front. 1675ae7ecab400374f083718995454ec03e5e57b7203Craig Mautner r.task.mOnTopOfHome = true; 1676de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (sourceRecord != null) { 16792a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn TaskRecord sourceTask = sourceRecord.task; 1680525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner targetStack = sourceTask.stack; 1681de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner moveHomeStack(targetStack.isHomeStack()); 16828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!addingToTask && 16838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 16848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are adding the activity to an existing 16858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // task, but the caller has asked to clear that task if the 16868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity is already running. 1687525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags); 16888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner keepCurTransition = true; 16898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 16908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 16918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 16928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 16938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 16940f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 16958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 16968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 16978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 16992a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (r.task == null) Slog.w(TAG, 170029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 170129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 17028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 17038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!addingToTask && 17058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 17068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are launching an activity in our own task 17078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that may already be running somewhere in the history, and 17088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we want to shuffle it to the front of the stack if so. 1709525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r); 17108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 1711de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final TaskRecord task = top.task; 1712de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner task.moveActivityToFrontLocked(top); 1713de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task); 17148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.updateOptionsLocked(options); 17158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 17160f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 17178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 17188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 17198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 17218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // An existing activity is starting this new activity, so we want 17248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to keep the new one in the same task as the one that is starting 17258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // it. 1726525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner r.setTask(sourceTask, sourceRecord.thumbHolder, false); 17278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 17282a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + " in existing task " + r.task + " from source " + sourceRecord); 17298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 17318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This not being started from an existing activity, and not part 17328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of a new task... just put it in the top task, though these days 17338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // this case should never happen. 1734ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner targetStack = adjustStackFocus(r); 1735de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner moveHomeStack(targetStack.isHomeStack()); 17361602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner ActivityRecord prev = targetStack.topActivity(); 1737de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.setTask(prev != null ? prev.task 1738de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true), 1739de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner null, true); 17408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 17418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner + " in new guessed " + r.task); 17428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 17458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intent, r.getUriPermissionsLocked()); 17468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (newTask) { 17488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId); 17498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 17510f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 17528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options); 17531d001b670e34fe887488047f525a5430154626e1Craig Mautner mService.setFocusedActivityLocked(r); 17548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_SUCCESS; 17558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner void acquireLaunchWakelock() { 17587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 17597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 17607ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.acquire(); 17627ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 17637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // To be safe, don't allow the wake lock to be held for too long. 17647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 17657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17667ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17677ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 1768f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Checked. 1769f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, 1770f333327782e14688e1c198c1192172d51308e90bCraig Mautner Configuration config) { 1771f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 1772f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1773f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> stops = null; 1774f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> finishes = null; 1775f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<UserStartedState> startingUsers = null; 1776f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NS = 0; 1777f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NF = 0; 1778f333327782e14688e1c198c1192172d51308e90bCraig Mautner IApplicationThread sendThumbnail = null; 1779f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean booting = false; 1780f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean enableScreen = false; 1781f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean activityRemoved = false; 1782f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1783f333327782e14688e1c198c1192172d51308e90bCraig Mautner ActivityRecord r = ActivityRecord.forToken(token); 1784f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r != null) { 1785b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" + 1786b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner Debug.getCallers(4)); 1787f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 1788f333327782e14688e1c198c1192172d51308e90bCraig Mautner r.finishLaunchTickingLocked(); 17897ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (fromTimeout) { 17907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 17917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 1792f333327782e14688e1c198c1192172d51308e90bCraig Mautner 17937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // This is a hack to semi-deal with a race condition 17947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // in the client where it can be constructed with a 17957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // newer configuration from when we asked it to launch. 17967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We'll update with whatever configuration it now says 17977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // it used to launch. 17987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (config != null) { 17997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.configuration = config; 18007ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 1801f333327782e14688e1c198c1192172d51308e90bCraig Mautner 18027ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We are now idle. If someone is waiting for a thumbnail from 18037ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // us, we can now deliver. 18047ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.idle = true; 18057ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 18067ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 18077ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner sendThumbnail = r.app.thread; 18087ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.thumbnailNeeded = false; 18097ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 18107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 18117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 18127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (!mService.mBooted && isFrontStack(r.task.stack)) { 18137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mBooted = true; 18147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner enableScreen = true; 18157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 18167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 18177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 18187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (allResumedActivitiesIdle()) { 18197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (r != null) { 18207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.scheduleAppGcsLocked(); 18217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 18227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 18237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 18247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 18257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && 18267ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Binder.getCallingUid() != Process.myUid()) { 18277ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 1828f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 18297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 1830f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 18317ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner ensureActivitiesVisibleLocked(null, 0); 1832f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1833f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1834f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Atomically retrieve all of the other things to do. 1835f333327782e14688e1c198c1192172d51308e90bCraig Mautner stops = processStoppingActivitiesLocked(true); 1836f333327782e14688e1c198c1192172d51308e90bCraig Mautner NS = stops != null ? stops.size() : 0; 1837f333327782e14688e1c198c1192172d51308e90bCraig Mautner if ((NF=mFinishingActivities.size()) > 0) { 1838f333327782e14688e1c198c1192172d51308e90bCraig Mautner finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 1839f333327782e14688e1c198c1192172d51308e90bCraig Mautner mFinishingActivities.clear(); 1840f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1841f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1842f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ArrayList<ActivityRecord> thumbnails; 1843f333327782e14688e1c198c1192172d51308e90bCraig Mautner final int NT = mCancelledThumbnails.size(); 1844f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (NT > 0) { 1845f333327782e14688e1c198c1192172d51308e90bCraig Mautner thumbnails = new ArrayList<ActivityRecord>(mCancelledThumbnails); 1846f333327782e14688e1c198c1192172d51308e90bCraig Mautner mCancelledThumbnails.clear(); 1847f333327782e14688e1c198c1192172d51308e90bCraig Mautner } else { 1848f333327782e14688e1c198c1192172d51308e90bCraig Mautner thumbnails = null; 1849f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1850f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1851f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (isFrontStack(mHomeStack)) { 1852f333327782e14688e1c198c1192172d51308e90bCraig Mautner booting = mService.mBooting; 1853f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.mBooting = false; 1854f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1855f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1856f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mStartingUsers.size() > 0) { 1857f333327782e14688e1c198c1192172d51308e90bCraig Mautner startingUsers = new ArrayList<UserStartedState>(mStartingUsers); 1858f333327782e14688e1c198c1192172d51308e90bCraig Mautner mStartingUsers.clear(); 1859f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1860f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1861f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Perform the following actions from unsynchronized state. 1862f333327782e14688e1c198c1192172d51308e90bCraig Mautner final IApplicationThread thumbnailThread = sendThumbnail; 1863f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.post(new Runnable() { 1864f333327782e14688e1c198c1192172d51308e90bCraig Mautner @Override 1865f333327782e14688e1c198c1192172d51308e90bCraig Mautner public void run() { 1866f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (thumbnailThread != null) { 1867f333327782e14688e1c198c1192172d51308e90bCraig Mautner try { 1868f333327782e14688e1c198c1192172d51308e90bCraig Mautner thumbnailThread.requestThumbnail(token); 1869f333327782e14688e1c198c1192172d51308e90bCraig Mautner } catch (Exception e) { 1870f333327782e14688e1c198c1192172d51308e90bCraig Mautner Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 1871f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.sendPendingThumbnail(null, token, null, null, true); 1872f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1873f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1874f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1875f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Report back to any thumbnail receivers. 1876f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NT; i++) { 1877f333327782e14688e1c198c1192172d51308e90bCraig Mautner ActivityRecord r = thumbnails.get(i); 1878f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.sendPendingThumbnail(r, null, null, null, true); 1879f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1880f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1881f333327782e14688e1c198c1192172d51308e90bCraig Mautner }); 1882f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1883f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Stop any activities that are scheduled to do so but have been 1884f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 1885f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NS; i++) { 1886f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = stops.get(i); 1887f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityStack stack = r.task.stack; 1888f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r.finishing) { 1889f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false); 1890f333327782e14688e1c198c1192172d51308e90bCraig Mautner } else { 1891f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.stopActivityLocked(r); 1892f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1893f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1894f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1895f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Finish any activities that are scheduled to do so but have been 1896f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 1897f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NF; i++) { 1898f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = finishes.get(i); 1899f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle"); 1900f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1901f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1902f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (booting) { 1903f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.finishBooting(); 1904f333327782e14688e1c198c1192172d51308e90bCraig Mautner } else if (startingUsers != null) { 1905f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < startingUsers.size(); i++) { 1906f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.finishUserSwitch(startingUsers.get(i)); 1907f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1908f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1909f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1910f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.trimApplications(); 1911f333327782e14688e1c198c1192172d51308e90bCraig Mautner //dump(); 1912f333327782e14688e1c198c1192172d51308e90bCraig Mautner //mWindowManager.dump(); 1913f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1914f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (enableScreen) { 1915f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.enableScreenAfterBoot(); 1916f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1917f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1918f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (activityRemoved) { 191905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 1920f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1921f333327782e14688e1c198c1192172d51308e90bCraig Mautner 19227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return r; 1923f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1924f333327782e14688e1c198c1192172d51308e90bCraig Mautner 19258e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner boolean handleAppDiedLocked(ProcessRecord app) { 19261909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner boolean hasVisibleActivities = false; 19271909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 19281909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner hasVisibleActivities |= mStacks.get(stackNdx).handleAppDiedLocked(app); 19298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19301909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner return hasVisibleActivities; 19318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 19338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void closeSystemDialogsLocked() { 19348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 19358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 19368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 19378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.closeSystemDialogsLocked(); 19388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 194193529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner void removeUserLocked(int userId) { 19424f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner mUserStackInFront.delete(userId); 194393529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner } 194493529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner 19458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** 19468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * @return true if some activity was finished (or would have finished if doit were true). 19478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner */ 19488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) { 19498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean didSomething = false; 19508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 19518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 19528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 19538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) { 19548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner didSomething = true; 19558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return didSomething; 19588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1960a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn void updatePreviousProcessLocked(ActivityRecord r) { 1961a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now that this process has stopped, we may want to consider 1962a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // it to be the previous app to try to keep around in case 1963a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // the user wants to return to it. 1964a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 1965a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // First, found out what is currently the foreground app, so that 1966a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // we don't blow away the previous app if this activity is being 1967a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // hosted by the process that is actually still the foreground. 1968a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn ProcessRecord fgApp = null; 1969a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 1970a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn final ActivityStack stack = mStacks.get(stackNdx); 1971a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn if (isFrontStack(stack)) { 1972a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn if (stack.mResumedActivity != null) { 1973a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn fgApp = stack.mResumedActivity.app; 1974a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } else if (stack.mPausingActivity != null) { 1975a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn fgApp = stack.mPausingActivity.app; 1976a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1977a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn break; 1978a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1979a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1980a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 1981a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now set this one as the previous process, only if that really 1982a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // makes sense to. 1983a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn if (r.app != null && fgApp != null && r.app != fgApp 1984a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn && r.lastVisibleTime > mService.mPreviousProcessVisibleTime 19854ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner && r.app != mService.mHomeProcess) { 1986a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcess = r.app; 1987a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcessVisibleTime = r.lastVisibleTime; 1988a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1989a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1990a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 199105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked() { 199205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return resumeTopActivitiesLocked(null, null, null); 199305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 199405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 199505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, 199605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner Bundle targetOptions) { 199705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner if (targetStack == null) { 199805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner targetStack = getFocusedStack(); 199905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 200005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean result = false; 2001dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2002f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2003f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner if (isFrontStack(stack)) { 200405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner if (stack == targetStack) { 200505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner result = stack.resumeTopActivityLocked(target, targetOptions); 200605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } else { 200705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner stack.resumeTopActivityLocked(null); 200805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 2009f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner } 20108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 201105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return result; 20128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 20148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void finishTopRunningActivityLocked(ProcessRecord app) { 20158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 20168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 20178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 20188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.finishTopRunningActivityLocked(app); 20198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 20228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) { 20238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 20248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) { 20257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" + 20261d001b670e34fe887488047f525a5430154626e1Craig Mautner mStacks.get(stackNdx)); 20278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return; 20288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2032967212cb542e6eeb308678367b53381bff984c31Craig Mautner ActivityStack getStack(int stackId) { 20338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 20348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 20358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.getStackId() == stackId) { 20368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return stack; 20378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 20408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2042967212cb542e6eeb308678367b53381bff984c31Craig Mautner ArrayList<ActivityStack> getStacks() { 2043967212cb542e6eeb308678367b53381bff984c31Craig Mautner return new ArrayList<ActivityStack>(mStacks); 2044967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 2045967212cb542e6eeb308678367b53381bff984c31Craig Mautner 2046967212cb542e6eeb308678367b53381bff984c31Craig Mautner int createStack() { 2047858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner while (true) { 2048858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (++mLastStackId <= HOME_STACK_ID) { 2049858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mLastStackId = HOME_STACK_ID + 1; 2050858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 2051858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (getStack(mLastStackId) == null) { 2052858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner break; 20538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2055858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId)); 2056858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner return mLastStackId; 20578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 20598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void moveTaskToStack(int taskId, int stackId, boolean toTop) { 2060b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner final TaskRecord task = anyTaskForIdLocked(taskId); 2061b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (task == null) { 2062b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner return; 2063b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner } 20648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = getStack(stackId); 20658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack == null) { 20668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); 20678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return; 20688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2069b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner removeTask(task); 2070b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner stack.addTask(task, toTop); 2071b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner mWindowManager.addTask(taskId, stackId, toTop); 207205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 20738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2075ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityRecord findTaskLocked(ActivityRecord r) { 20762a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r); 20778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2078ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2079ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (!r.isApplicationActivity() && !stack.isHomeStack()) { 20802a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: " + stack); 2081ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner continue; 2082ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 2083ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner final ActivityRecord ar = stack.findTaskLocked(r); 20848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (ar != null) { 20858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ar; 20868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20882a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "No task found"); 20898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 20908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 20928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 20938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 20948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final ActivityRecord ar = mStacks.get(stackNdx).findActivityLocked(intent, info); 20958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (ar != null) { 20968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ar; 20978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 21008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 21028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void goingToSleepLocked() { 21030eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleSleepTimeout(); 21040eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mGoingToSleep.isHeld()) { 21050eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.acquire(); 21067ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 21077ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 21087ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 21090eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 21117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 21120eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2114ce15e157a6cf56fc73961ccb8c5ab18b1bf70280Amith Yamasani checkReadyForSleepLocked(); 21158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 21178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean shutdownLocked(int timeout) { 21188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean timedout = false; 21190eea92c67b292b005c152641a12b920fe145826cCraig Mautner goingToSleepLocked(); 21200eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21210eea92c67b292b005c152641a12b920fe145826cCraig Mautner final long endTime = System.currentTimeMillis() + timeout; 21220eea92c67b292b005c152641a12b920fe145826cCraig Mautner while (true) { 21230eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean cantShutdown = false; 21240eea92c67b292b005c152641a12b920fe145826cCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 21250eea92c67b292b005c152641a12b920fe145826cCraig Mautner cantShutdown |= mStacks.get(stackNdx).checkReadyForSleepLocked(); 21260eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21270eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (cantShutdown) { 21280eea92c67b292b005c152641a12b920fe145826cCraig Mautner long timeRemaining = endTime - System.currentTimeMillis(); 21290eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (timeRemaining > 0) { 21308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 21310eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.wait(timeRemaining); 21328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (InterruptedException e) { 21338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21340eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 21350eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Activity manager shutdown timed out"); 21360eea92c67b292b005c152641a12b920fe145826cCraig Mautner timedout = true; 21370eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 21388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21390eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 21400eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 21418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21430eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21440eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Force checkReadyForSleep to complete. 21450eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 21460eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 21470eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return timedout; 21498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 21518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void comeOutOfSleepIfNeededLocked() { 21520eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 21530eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 21540eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 21550eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 2156ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 21578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2158ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner stack.awakeFromSleepingLocked(); 21595314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner if (isFrontStack(stack)) { 21605314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner resumeTopActivitiesLocked(); 21615314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner } 21628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21630eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.clear(); 21640eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21650eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21660eea92c67b292b005c152641a12b920fe145826cCraig Mautner void activitySleptLocked(ActivityRecord r) { 21670eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.remove(r); 21680eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 21690eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21700eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21710eea92c67b292b005c152641a12b920fe145826cCraig Mautner void checkReadyForSleepLocked() { 21720eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mService.isSleepingOrShuttingDown()) { 21730eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Do not care. 21740eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 21750eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21760eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21770eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mSleepTimeout) { 21780eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean dontSleep = false; 21790eea92c67b292b005c152641a12b920fe145826cCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 21800eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep |= mStacks.get(stackNdx).checkReadyForSleepLocked(); 21810eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21820eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21830eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mStoppingActivities.size() > 0) { 21840eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to stop; can't sleep yet. 21850eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 21860eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mStoppingActivities.size() + " activities"); 21870eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleIdleLocked(); 21880eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 21890eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21900eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21910eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleepActivities.size() > 0) { 21920eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to sleep; can't sleep yet. 21930eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 21940eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mGoingToSleepActivities.size() + " activities"); 21950eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 21960eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21970eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21980eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (dontSleep) { 21990eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 22000eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 22010eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 22020eea92c67b292b005c152641a12b920fe145826cCraig Mautner 22030eea92c67b292b005c152641a12b920fe145826cCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 22040eea92c67b292b005c152641a12b920fe145826cCraig Mautner mStacks.get(stackNdx).goToSleep(); 22050eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 22060eea92c67b292b005c152641a12b920fe145826cCraig Mautner 22070eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 22080eea92c67b292b005c152641a12b920fe145826cCraig Mautner 22090eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 22100eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 22110eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 22120eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.mShuttingDown) { 22130eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.notifyAll(); 22140eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 22158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2217ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner boolean reportResumedActivityLocked(ActivityRecord r) { 2218ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = r.task.stack; 2219ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (isFrontStack(stack)) { 22205782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey mService.updateUsageStats(r, true); 2221ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2222ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (allResumedActivitiesComplete()) { 2223ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ensureActivitiesVisibleLocked(null, 0); 2224ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.executeAppTransition(); 2225ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return true; 2226ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2227ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return false; 2228ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2229ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 22308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void handleAppCrashLocked(ProcessRecord app) { 22318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 22328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 22338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 22348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.handleAppCrashLocked(app); 22358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2238de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) { 2239580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner // First the front stacks. In case any are not fullscreen and are in front of home. 2240580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner boolean showHomeBehindStack = false; 2241de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2242580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2243580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner if (isFrontStack(stack)) { 2244580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner showHomeBehindStack = 2245580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner stack.ensureActivitiesVisibleLocked(starting, configChanges); 2246580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner } 2247580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner } 2248580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner // Now do back stacks. 2249580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2250580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2251580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner if (!isFrontStack(stack)) { 2252580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner stack.ensureActivitiesVisibleLocked(starting, configChanges, showHomeBehindStack); 2253580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner } 22548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 22578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void scheduleDestroyAllActivities(ProcessRecord app, String reason) { 22588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 22598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 22608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 22618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.scheduleDestroyActivities(app, false, reason); 22628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 22658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean switchUserLocked(int userId, UserStartedState uss) { 22664f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId()); 22674f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID); 22682420ead0326bfd2587da6231be419e758dba1930Craig Mautner mCurrentUser = userId; 2269ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 2270858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mStartingUsers.add(uss); 2271ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 227293529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner mStacks.get(stackNdx).switchUserLocked(userId); 2273ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 2274858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 22754f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner ActivityStack stack = getStack(restoreStackId); 22764f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner if (stack == null) { 22774f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner stack = mHomeStack; 22784f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner } 22794f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner final boolean homeInFront = stack.isHomeStack(); 228093529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner moveHomeStack(homeInFront); 22814f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner mWindowManager.moveTaskToTop(stack.topTask().taskId); 228293529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner return homeInFront; 22832219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 22842219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 2285de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) { 2286de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner int N = mStoppingActivities.size(); 2287de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (N <= 0) return null; 2288de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2289de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ArrayList<ActivityRecord> stops = null; 2290de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2291de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final boolean nowVisible = allResumedActivitiesVisible(); 2292de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int i=0; i<N; i++) { 2293de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord s = mStoppingActivities.get(i); 2294a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 2295de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + nowVisible + " waitingVisible=" + s.waitingVisible 2296de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + " finishing=" + s.finishing); 2297de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.waitingVisible && nowVisible) { 2298de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mWaitingVisibleActivities.remove(s); 2299de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner s.waitingVisible = false; 2300de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.finishing) { 2301de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // If this activity is finishing, it is sitting on top of 2302de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // everyone else but we now know it is no longer needed... 2303de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // so get rid of it. Otherwise, we need to go through the 2304de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // normal flow and hide it once we determine that it is 2305de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // hidden by the activities in front of it. 2306de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 2307ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.setAppVisibility(s.appToken, false); 2308de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2309de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2310de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) { 2311de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 2312de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stops == null) { 2313de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops = new ArrayList<ActivityRecord>(); 2314de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2315de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops.add(s); 2316de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStoppingActivities.remove(i); 2317de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner N--; 2318de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner i--; 2319de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2320de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2321de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2322de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return stops; 2323de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2324de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2325cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner void validateTopActivitiesLocked() { 2326cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2327cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2328cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner final ActivityRecord r = stack.topRunningActivityLocked(null); 2329f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityState state = r == null ? ActivityState.DESTROYED : r.state; 2330cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (isFrontStack(stack)) { 2331cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (r == null) { 2332cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: null top activity, stack=" + stack); 2333cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 2334f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord pausing = stack.mPausingActivity; 2335f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (pausing != null && pausing == r) { 2336cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r + 2337f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2338cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2339f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) { 2340cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r + 2341f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2342cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2343cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2344cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 2345f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord resumed = stack.mResumedActivity; 2346f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (resumed != null && resumed == r) { 2347cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r + 2348f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2349cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2350f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (r != null && (state == ActivityState.INITIALIZING 2351f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner || state == ActivityState.RESUMED)) { 2352cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in back resumed r=" + r + 2353f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2354cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2355cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2356cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2357cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2358cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 235976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner private static String stackStateToString(int stackState) { 236076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner switch (stackState) { 236176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner case STACK_STATE_HOME_IN_FRONT: return "STACK_STATE_HOME_IN_FRONT"; 236276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner case STACK_STATE_HOME_TO_BACK: return "STACK_STATE_HOME_TO_BACK"; 236376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner case STACK_STATE_HOME_IN_BACK: return "STACK_STATE_HOME_IN_BACK"; 236476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner case STACK_STATE_HOME_TO_FRONT: return "STACK_STATE_HOME_TO_FRONT"; 236576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner default: return "Unknown stackState=" + stackState; 236676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner } 236776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner } 236876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner 2369270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner public void dump(PrintWriter pw, String prefix) { 2370270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:"); 2371270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner pw.println(mDismissKeyguardOnNextActivity); 237276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState)); 23737ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.print(prefix); pw.println("mSleepTimeout: " + mSleepTimeout); 23747ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.print(prefix); pw.println("mCurTaskId: " + mCurTaskId); 23754f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner pw.print(prefix); pw.println("mUserStackInFront: " + mUserStackInFront); 2376270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 23778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 237820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { 2379ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return getFocusedStack().getDumpActivitiesLocked(name); 238020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 238120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 2382390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage, 2383390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean needSep, String prefix) { 2384390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (activity != null) { 2385390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (dumpPackage == null || dumpPackage.equals(activity.packageName)) { 2386390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (needSep) { 2387390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(); 2388390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2389390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.print(prefix); 2390390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(activity); 23917ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return true; 2392390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2393390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 23947ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return false; 2395390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2396390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn 23978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 23988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpClient, String dumpPackage) { 23997ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean printed = false; 24007ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean needSep = false; 24018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 24028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 24038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 24047ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn StringBuilder stackHeader = new StringBuilder(128); 24057ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn stackHeader.append(" Stack #"); 24067ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn stackHeader.append(mStacks.indexOf(stack)); 24077ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn stackHeader.append(":"); 24087ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, needSep, 24097ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn stackHeader.toString()); 24107ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, " ", "Run", false, !dumpAll, 24117ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Running activities (most recent first):", null); 24127ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn 24137ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn needSep = printed; 24147ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep, 2415390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " mPausingActivity: "); 24167ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (pr) { 24177ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed = true; 24187ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn needSep = false; 24197ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 24207ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep, 2421390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " mResumedActivity: "); 24227ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (pr) { 24237ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed = true; 24247ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn needSep = false; 24257ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 24268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpAll) { 24277ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep, 2428390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " mLastPausedActivity: "); 24297ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (pr) { 24307ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed = true; 24310f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner needSep = true; 24327ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 24330f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage, 24340f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner needSep, " mLastNoHistoryActivity: "); 24358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24367ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn needSep = printed; 24378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 24397ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mFinishingActivities, " ", "Fin", false, !dumpAll, 24407ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to finish:", null); 24417ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mStoppingActivities, " ", "Stop", false, !dumpAll, 24427ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to stop:", null); 24437ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, " ", "Wait", false, !dumpAll, 24447ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting for another to become visible:", 24457ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn null); 24467ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 24477ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 24487ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 24497ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 2450de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 24517ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return printed; 24528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2454390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, 24558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner String prefix, String label, boolean complete, boolean brief, boolean client, 24567ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn String dumpPackage, boolean needNL, String header1, String header2) { 24578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord lastTask = null; 2458390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String innerPrefix = null; 2459390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String[] args = null; 2460390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean printed = false; 24618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int i=list.size()-1; i>=0; i--) { 24628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityRecord r = list.get(i); 24638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpPackage != null && !dumpPackage.equals(r.packageName)) { 24648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner continue; 24658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2466390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (innerPrefix == null) { 2467390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn innerPrefix = prefix + " "; 2468390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn args = new String[0]; 2469390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2470390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn printed = true; 24718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final boolean full = !brief && (complete || !r.isInHistory()); 24728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (needNL) { 2473390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(""); 24748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = false; 24758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24767ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header1 != null) { 24777ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header1); 24787ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header1 = null; 24797ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 24807ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header2 != null) { 24817ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header2); 24827ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header2 = null; 2483390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 24848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask != r.task) { 24858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask = r.task; 24868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); 24878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(full ? "* " : " "); 24888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask); 24898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 24908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask.dump(pw, prefix + " "); 24918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 24928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 24938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask.intent != null) { 24948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(" "); 24958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask.intent.toInsecureStringWithClip()); 24968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(full ? " * " : " "); pw.print(label); 25008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(" #"); pw.print(i); pw.print(": "); 25018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(r); 25028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 25038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.dump(pw, innerPrefix); 25048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 25058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 25068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.intent.toInsecureString()); 25078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (r.app != null) { 25088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.app); 25098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (client && r.app != null && r.app.thread != null) { 25128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // flush anything that is already in the PrintWriter since the thread is going 25138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // to write to the file descriptor directly 25148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.flush(); 25158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 25168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TransferPipe tp = new TransferPipe(); 25178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 25188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(), 25198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.appToken, innerPrefix, args); 25208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Short timeout, since blocking here can 25218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // deadlock with the application. 25228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.go(fd, 2000); 25238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } finally { 25248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.kill(); 25258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (IOException e) { 25278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Failure while dumping the activity: " + e); 25288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (RemoteException e) { 25298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Got a RemoteException while dumping the activity"); 25308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = true; 25328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2534390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn return printed; 25358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2536ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 2537f333327782e14688e1c198c1192172d51308e90bCraig Mautner void scheduleIdleTimeoutLocked(ActivityRecord next) { 2538b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4)); 2539c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next); 2540c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 2541f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2542f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2543f333327782e14688e1c198c1192172d51308e90bCraig Mautner final void scheduleIdleLocked() { 254405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mHandler.sendEmptyMessage(IDLE_NOW_MSG); 2545f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2546f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2547f333327782e14688e1c198c1192172d51308e90bCraig Mautner void removeTimeoutsForActivityLocked(ActivityRecord r) { 2548b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4)); 2549f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 2550f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2551f333327782e14688e1c198c1192172d51308e90bCraig Mautner 255205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner final void scheduleResumeTopActivities() { 255305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 255405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 255505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 25560eea92c67b292b005c152641a12b920fe145826cCraig Mautner void removeSleepTimeouts() { 25570eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = false; 25580eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 25590eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 25600eea92c67b292b005c152641a12b920fe145826cCraig Mautner 25610eea92c67b292b005c152641a12b920fe145826cCraig Mautner final void scheduleSleepTimeout() { 25620eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 25630eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT); 25640eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 25650eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2566ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner private final class ActivityStackSupervisorHandler extends Handler { 2567f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2568ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public ActivityStackSupervisorHandler(Looper looper) { 2569ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner super(looper); 2570ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2571ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 2572f333327782e14688e1c198c1192172d51308e90bCraig Mautner void activityIdleInternal(ActivityRecord r) { 2573f333327782e14688e1c198c1192172d51308e90bCraig Mautner synchronized (mService) { 2574f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternalLocked(r != null ? r.appToken : null, true, null); 2575f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 25767ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 25777ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 2578ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner @Override 2579ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public void handleMessage(Message msg) { 2580ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner switch (msg.what) { 2581f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_TIMEOUT_MSG: { 25825eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj); 2583f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mService.mDidDexOpt) { 2584f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.mDidDexOpt = false; 2585f333327782e14688e1c198c1192172d51308e90bCraig Mautner Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 2586f333327782e14688e1c198c1192172d51308e90bCraig Mautner nmsg.obj = msg.obj; 2587f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 2588f333327782e14688e1c198c1192172d51308e90bCraig Mautner return; 2589f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2590f333327782e14688e1c198c1192172d51308e90bCraig Mautner // We don't at this point know if the activity is fullscreen, 2591f333327782e14688e1c198c1192172d51308e90bCraig Mautner // so we need to be conservative and assume it isn't. 2592f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 2593f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 2594f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_NOW_MSG: { 25955eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj); 2596f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 2597f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 259805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner case RESUME_TOP_ACTIVITY_MSG: { 259905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner synchronized (mService) { 260005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 260105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 260205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } break; 26030eea92c67b292b005c152641a12b920fe145826cCraig Mautner case SLEEP_TIMEOUT_MSG: { 26040eea92c67b292b005c152641a12b920fe145826cCraig Mautner synchronized (mService) { 26050eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.isSleepingOrShuttingDown()) { 26060eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Sleep timeout! Sleeping now."); 26070eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 26080eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 26090eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 26100eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 26110eea92c67b292b005c152641a12b920fe145826cCraig Mautner } break; 26127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner case LAUNCH_TIMEOUT_MSG: { 26137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mService.mDidDexOpt) { 26147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mDidDexOpt = false; 26157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 26167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return; 26177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 26187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner synchronized (mService) { 26197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 26207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 26217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER 26227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner && Binder.getCallingUid() != Process.myUid()) { 26237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 26247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 26257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 26267ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 26277ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 26287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } break; 2629ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2630ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2631ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2632270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner} 2633