ActivityStackSupervisor.java revision e12a4a68101725eaecefef7d7bd9236991e3f508
1270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner/* 2270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Copyright (C) 2013 The Android Open Source Project 3270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * 4270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License"); 5270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * you may not use this file except in compliance with the License. 6270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * You may obtain a copy of the License at 7270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * 8270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * http://www.apache.org/licenses/LICENSE-2.0 9270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * 10270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Unless required by applicable law or agreed to in writing, software 11270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS, 12270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * See the License for the specific language governing permissions and 14270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * limitations under the License. 15270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner */ 16270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 17270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpackage com.android.server.am; 18270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 196170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.Manifest.permission.START_ANY_ACTIVITY; 2029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautnerimport static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; 2129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautnerimport static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME; 226170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.content.pm.PackageManager.PERMISSION_GRANTED; 232420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.localLOGV; 2423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_CONFIGURATION; 25e7c58b6d7d761b93e785b0a399e5b00fdb82f4ceCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_FOCUS; 260eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_PAUSE; 276170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_RESULTS; 280eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_STACK; 292420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_SWITCH; 308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_TASKS; 318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING; 3205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautnerimport static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG; 338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG; 348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 352420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity; 3623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager; 3723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions; 3823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals; 39ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager; 4023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread; 4120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.IThumbnailReceiver; 4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent; 4320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo; 4423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult; 452420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo; 4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName; 472219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context; 4823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender; 492219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent; 5023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender; 512219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo; 5223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo; 5323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager; 5423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo; 5523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration; 5623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder; 578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle; 58b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug; 59ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler; 6023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder; 612219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper; 622420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message; 6323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor; 640eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport android.os.PowerManager; 657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautnerimport android.os.Process; 668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException; 6723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock; 686170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle; 692420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog; 708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog; 71858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautnerimport android.util.SparseArray; 722219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 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; 91de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig 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? */ 125270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner private 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 206ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner /** 207ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner * The name of the current home activity for each user. 208ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner * TODO: Remove entries when user is deleted. 209ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner */ 210ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner final SparseArray<String> mHomePackageNames = new SparseArray<String>(); 211ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 2122219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner public ActivityStackSupervisor(ActivityManagerService service, Context context, 2132219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner Looper looper) { 214270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mService = service; 2152219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner mContext = context; 2162219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner mLooper = looper; 2170eea92c67b292b005c152641a12b920fe145826cCraig Mautner PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); 2180eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 219ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mHandler = new ActivityStackSupervisorHandler(looper); 2207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 2217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 2227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 2237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity = 2247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 2257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.setReferenceCounted(false); 2262219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 2272219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 228ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void setWindowManager(WindowManagerService wm) { 229ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager = wm; 230ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mHomeStack = new ActivityStack(mService, mContext, mLooper, HOME_STACK_ID); 2318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mStacks.add(mHomeStack); 232270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 233270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 234270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner void dismissKeyguard() { 235270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner if (mDismissKeyguardOnNextActivity) { 236270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mDismissKeyguardOnNextActivity = false; 237ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.dismissKeyguard(); 238270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 239270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 240270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 241ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack getFocusedStack() { 242f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner if (mFocusedStack == null) { 243f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner return mHomeStack; 244f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner } 245de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner switch (mStackState) { 246de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_IN_FRONT: 247de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_TO_FRONT: 248de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mHomeStack; 249de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_IN_BACK: 250de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_TO_BACK: 251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner default: 25229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return mFocusedStack; 253de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 25420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 25520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack getLastStack() { 257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner switch (mStackState) { 258de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_IN_FRONT: 259de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_TO_BACK: 260de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mHomeStack; 261de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_TO_FRONT: 262de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_IN_BACK: 263de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner default: 26429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return mFocusedStack; 265de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2662219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 2672219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 268de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean isFrontStack(ActivityStack stack) { 269ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return !(stack.isHomeStack() ^ getFocusedStack().isHomeStack()); 27020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 27120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 272de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner void moveHomeStack(boolean toFront) { 273de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final boolean homeInFront = isFrontStack(mHomeStack); 274de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (homeInFront ^ toFront) { 27576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: mStackState old=" + 27676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(mStackState) + " new=" + stackStateToString(homeInFront ? 27776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT)); 278de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStackState = homeInFront ? STACK_STATE_HOME_TO_BACK : STACK_STATE_HOME_TO_FRONT; 279de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 280de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 281de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 28269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner boolean resumeHomeActivity(ActivityRecord prev) { 28369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner moveHomeStack(true); 28469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner if (prev != null) { 28569ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner prev.mLaunchHomeTaskNext = false; 28669ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 287a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner ActivityRecord r = mHomeStack.topRunningActivityLocked(null); 288a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner if (r != null) { 289a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner mService.setFocusedActivityLocked(r); 29005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return resumeTopActivitiesLocked(mHomeStack, prev, null); 29169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 29269ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner return mService.startHomeActivityLocked(mCurrentUser); 29369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 29469ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner 295de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final void setLaunchHomeTaskNextFlag(ActivityRecord sourceRecord, ActivityRecord r, 296de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack stack) { 297de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stack == mHomeStack) { 298de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return; 299de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 300de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((sourceRecord == null && getLastStack() == mHomeStack) || 30186d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner (sourceRecord != null && sourceRecord.isHomeActivity())) { 302de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (r == null) { 303de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r = stack.topRunningActivityLocked(null); 304de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 30586d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner if (r != null && !r.isHomeActivity() && r.isRootActivity()) { 306de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.mLaunchHomeTaskNext = true; 307de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 308de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3092219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 3102219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 311270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner void setDismissKeyguard(boolean dismiss) { 312270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mDismissKeyguardOnNextActivity = dismiss; 313270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 314270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 3158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord anyTaskForIdLocked(int id) { 3168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 3178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner ActivityStack stack = mStacks.get(stackNdx); 3188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord task = stack.taskForIdLocked(id); 3198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (task != null) { 3208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return task; 3218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 3248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord isInAnyStackLocked(IBinder token) { 3276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 3286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final ActivityRecord r = mStacks.get(stackNdx).isInStackLocked(token); 3296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (r != null) { 3306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return r; 3316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 3326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 3336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return null; 3346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 3356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 3368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner int getNextTaskId() { 3378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner do { 3388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId++; 3398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (mCurTaskId <= 0) { 3408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId = 1; 3418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } while (anyTaskForIdLocked(mCurTaskId) != null); 3438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return mCurTaskId; 3448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 346de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner void removeTask(TaskRecord task) { 347b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner mWindowManager.removeTask(task.taskId); 348de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ActivityStack stack = task.stack; 349b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner final ActivityRecord r = stack.mResumedActivity; 350b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (r != null && r.task == task) { 351b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner stack.mResumedActivity = null; 352b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner } 353de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stack.removeTask(task) && !stack.isHomeStack()) { 354a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack); 355de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStacks.remove(stack); 3564cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner final int stackId = stack.mStackId; 357ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final int nextStackId = mWindowManager.removeStack(stackId); 358a9a3fb1da3d3d41f923e87d5b08b35c3e0c1f72eCraig Mautner // TODO: Perhaps we need to let the ActivityManager determine the next focus... 359ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (mFocusedStack == null || mFocusedStack.mStackId == stackId) { 3601602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner // If this is the last app stack, set mFocusedStack to null. 36129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner mFocusedStack = nextStackId == HOME_STACK_ID ? null : getStack(nextStackId); 362de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 363de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 364de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 365de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 366de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord resumedAppLocked() { 367ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack stack = getFocusedStack(); 368ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (stack == null) { 369ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return null; 370ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 371de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord resumedActivity = stack.mResumedActivity; 372de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (resumedActivity == null || resumedActivity.app == null) { 373de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resumedActivity = stack.mPausingActivity; 374de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (resumedActivity == null || resumedActivity.app == null) { 375de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resumedActivity = stack.topRunningActivityLocked(null); 376de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 377de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 378de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return resumedActivity; 379de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 380de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 38120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean attachApplicationLocked(ProcessRecord app, boolean headless) throws Exception { 38220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean didSomething = false; 38320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final String processName = app.processName; 38420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 38520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 386858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (!isFrontStack(stack)) { 387858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner continue; 388858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 38920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ActivityRecord hr = stack.topRunningActivityLocked(null); 39020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner if (hr != null) { 39120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner if (hr.app == null && app.uid == hr.info.applicationInfo.uid 39220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner && processName.equals(hr.processName)) { 39320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner try { 39420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner if (headless) { 39520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner Slog.e(TAG, "Starting activities not supported on headless device: " 39620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner + hr); 3972420ead0326bfd2587da6231be419e758dba1930Craig Mautner } else if (realStartActivityLocked(hr, app, true, true)) { 39820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner didSomething = true; 39920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 40020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } catch (Exception e) { 40120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner Slog.w(TAG, "Exception in new application when starting activity " 40220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner + hr.intent.getComponent().flattenToShortString(), e); 40320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner throw e; 40420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 40520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 40620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 40720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 408b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (!didSomething) { 409b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner ensureActivitiesVisibleLocked(null, 0); 410b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner } 41120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return didSomething; 41220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 41320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 41420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean allResumedActivitiesIdle() { 41520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 4167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 4177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (!isFrontStack(stack)) { 4187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner continue; 4197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 4207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner final ActivityRecord resumedActivity = stack.mResumedActivity; 421dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner if (resumedActivity == null || !resumedActivity.idle) { 42220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return false; 42320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 42420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 42520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return true; 42620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 42720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 428de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allResumedActivitiesComplete() { 429de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 430de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 431967212cb542e6eeb308678367b53381bff984c31Craig Mautner if (isFrontStack(stack)) { 432de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ActivityRecord r = stack.mResumedActivity; 433de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (r != null && r.state != ActivityState.RESUMED) { 434de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return false; 435de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 436de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 437de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 438de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // TODO: Not sure if this should check if all Paused are complete too. 439de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner switch (mStackState) { 440de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_TO_BACK: 44176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" + 44276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(STACK_STATE_HOME_TO_BACK) + " new=" + 44376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(STACK_STATE_HOME_IN_BACK)); 444de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStackState = STACK_STATE_HOME_IN_BACK; 445de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner break; 446de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner case STACK_STATE_HOME_TO_FRONT: 44776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "allResumedActivitiesComplete: mStackState old=" + 44876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(STACK_STATE_HOME_TO_FRONT) + " new=" + 44976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(STACK_STATE_HOME_IN_FRONT)); 450de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStackState = STACK_STATE_HOME_IN_FRONT; 451de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner break; 452de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 453de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return true; 454de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 455de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 456de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allResumedActivitiesVisible() { 457de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 458de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 459de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ActivityRecord r = stack.mResumedActivity; 460de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (r != null && (!r.nowVisible || r.waitingVisible)) { 461de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return false; 462de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 463de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 464de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return true; 465de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 466de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 467cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner boolean pauseBackStacks(boolean userLeaving) { 468cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner boolean someActivityPaused = false; 469cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 470cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 471cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (!isFrontStack(stack) && stack.mResumedActivity != null) { 472ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack + 473ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner " mResumedActivity=" + stack.mResumedActivity); 474cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner stack.startPausingLocked(userLeaving, false); 475cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner someActivityPaused = true; 476cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 477cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 478cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner return someActivityPaused; 479cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 480cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 481de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allPausedActivitiesComplete() { 482ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner boolean pausing = true; 483de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 484de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 48569ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner final ActivityRecord r = stack.mPausingActivity; 48669ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner if (r != null && r.state != ActivityState.PAUSED 48769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner && r.state != ActivityState.STOPPED 48869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner && r.state != ActivityState.STOPPING) { 489ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_STATES) { 490ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state); 491ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner pausing = false; 492ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } else { 493ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return false; 494ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 495de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 496de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 497ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return pausing; 498de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 499de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 500ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void reportActivityVisibleLocked(ActivityRecord r) { 501858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) { 502ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner WaitResult w = mWaitingActivityVisible.get(i); 503ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.timeout = false; 504ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (r != null) { 505ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.who = new ComponentName(r.info.packageName, r.info.name); 506ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 507ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 508ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.thisTime = w.totalTime; 509ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 510ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mService.notifyAll(); 511ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner dismissKeyguard(); 512ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 513ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 514ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 515ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner long thisTime, long totalTime) { 516ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) { 517c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner WaitResult w = mWaitingActivityLaunched.remove(i); 518ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.timeout = timeout; 519ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (r != null) { 520ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.who = new ComponentName(r.info.packageName, r.info.name); 521ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 522ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.thisTime = thisTime; 523ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.totalTime = totalTime; 524ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 525ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mService.notifyAll(); 526ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 527ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 52829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner ActivityRecord topRunningActivityLocked() { 5291602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner final ActivityStack focusedStack = getFocusedStack(); 5301602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner ActivityRecord r = focusedStack.topRunningActivityLocked(null); 5311602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner if (r != null) { 5321602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner return r; 53329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 5341602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner 53529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 53629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 537ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (stack != focusedStack && isFrontStack(stack)) { 53829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner r = stack.topRunningActivityLocked(null); 53929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r != null) { 54029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return r; 54129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 54229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 54329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 54429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return null; 54529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 54629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner 54720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ActivityRecord getTasksLocked(int maxNum, IThumbnailReceiver receiver, 54820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner PendingThumbnailsRecord pending, List<RunningTaskInfo> list) { 54920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ActivityRecord r = null; 55020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 55120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 55220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final ActivityRecord ar = 55320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner stack.getTasksLocked(maxNum - list.size(), receiver, pending, list); 554de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (isFrontStack(stack)) { 55520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner r = ar; 55620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 55720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 55820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return r; 55920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 56020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 56123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags, 56223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner String profileFile, ParcelFileDescriptor profileFd, int userId) { 56323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 56423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo; 56523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 56623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ResolveInfo rInfo = 56723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner AppGlobals.getPackageManager().resolveIntent( 56823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent, resolvedType, 56923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner PackageManager.MATCH_DEFAULT_ONLY 57023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | ActivityManagerService.STOCK_PM_FLAGS, userId); 57123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = rInfo != null ? rInfo.activityInfo : null; 57223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (RemoteException e) { 57323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = null; 57423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 57523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 57623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null) { 57723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Store the found target back into the intent, because now that 57823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // we have it we never want to do this again. For example, if the 57923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // user navigates back to this point in the history, we should 58023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // always restart the exact same activity. 58123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent.setComponent(new ComponentName( 58223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo.applicationInfo.packageName, aInfo.name)); 58323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 58423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't debug things in the system process 58523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) { 58623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 58723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setDebugApp(aInfo.processName, true, false); 58823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 58923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 59023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 59123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) { 59223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 59323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName); 59423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 59523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 59623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 59723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (profileFile != null) { 59823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 59923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, 60023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner profileFile, profileFd, 60123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0); 60223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 60323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 60423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 60523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return aInfo; 60623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 60723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 6082219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner void startHomeActivity(Intent intent, ActivityInfo aInfo) { 609de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner moveHomeStack(true); 6106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner startActivityLocked(null, intent, null, aInfo, null, null, 0, 0, 0, null, 0, 6112219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner null, false, null); 6128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 6138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 61423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final int startActivityMayWait(IApplicationThread caller, int callingUid, 61523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner String callingPackage, Intent intent, String resolvedType, IBinder resultTo, 61623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner String resultWho, int requestCode, int startFlags, String profileFile, 61723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config, 61823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Bundle options, int userId) { 61923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Refuse possible leaked file descriptors 62023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent != null && intent.hasFileDescriptors()) { 62123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("File descriptors passed in Intent"); 62223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 62323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner boolean componentSpecified = intent.getComponent() != null; 62423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 62523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't modify the client's object! 62623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = new Intent(intent); 62723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 62823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 62923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags, 63023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner profileFile, profileFd, userId); 63123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 63223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner synchronized (mService) { 63323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int callingPid; 63423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callingUid >= 0) { 63523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = -1; 63623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (caller == null) { 63723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 63823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 63923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 64023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = callingUid = -1; 64123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 64223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 643ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = getFocusedStack(); 644de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stack.mConfigWillChange = config != null 64523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner && mService.mConfiguration.diff(config) != 0; 64623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, 647de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner "Starting activity when config will change = " + stack.mConfigWillChange); 64823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 64923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final long origId = Binder.clearCallingIdentity(); 65023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 65123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null && 65223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 65323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // This may be a heavy-weight process! Check to see if we already 65423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // have another, different heavy-weight process running. 65523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 65623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (mService.mHeavyWeightProcess != null && 65723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 65823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 65923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int realCallingUid = callingUid; 66023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (caller != null) { 66123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 66223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callerApp != null) { 66323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner realCallingUid = callerApp.info.uid; 66423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 66523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Slog.w(TAG, "Unable to find app for caller " + caller 66676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner + " (pid=" + callingPid + ") when starting: " 66723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner + intent.toString()); 66823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityOptions.abort(options); 66923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return ActivityManager.START_PERMISSION_DENIED; 67023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 67123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 67223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 67323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner IIntentSender target = mService.getIntentSenderLocked( 67423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityManager.INTENT_SENDER_ACTIVITY, "android", 67523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner realCallingUid, userId, null, null, 0, new Intent[] { intent }, 67623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 67723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | PendingIntent.FLAG_ONE_SHOT, null); 67823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 67923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent newIntent = new Intent(); 68023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (requestCode >= 0) { 68123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Caller is requesting a result. 68223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 68323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 68423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 68523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner new IntentSender(target)); 68623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (mService.mHeavyWeightProcess.activities.size() > 0) { 68723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 68823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 68923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner hist.packageName); 69023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 69123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner hist.task.taskId); 69223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 69323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 69423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo.packageName); 69523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.setFlags(intent.getFlags()); 69623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.setClassName("android", 69723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner HeavyWeightSwitcherActivity.class.getName()); 69823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = newIntent; 69923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner resolvedType = null; 70023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner caller = null; 70123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 70223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 70323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner componentSpecified = true; 70423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 70523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ResolveInfo rInfo = 70623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner AppGlobals.getPackageManager().resolveIntent( 70723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent, null, 70823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner PackageManager.MATCH_DEFAULT_ONLY 70923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | ActivityManagerService.STOCK_PM_FLAGS, userId); 71023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = rInfo != null ? rInfo.activityInfo : null; 71123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = mService.getActivityInfoForUser(aInfo, userId); 71223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (RemoteException e) { 71323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = null; 71423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 71523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 71623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 71723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 71823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 7196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int res = startActivityLocked(caller, intent, resolvedType, 72023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo, resultTo, resultWho, requestCode, callingPid, callingUid, 72123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPackage, startFlags, options, componentSpecified, null); 72223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 723de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stack.mConfigWillChange) { 72423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // If the caller also wants to switch to a new configuration, 72523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // do so now. This allows a clean switch, as we are waiting 72623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // for the current activity to pause (so we will not destroy 72723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // it), and have not yet started the next activity. 72823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 72923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "updateConfiguration()"); 730de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stack.mConfigWillChange = false; 73123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, 73223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "Updating to new configuration after starting activity."); 73323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.updateConfigurationLocked(config, null, false, false); 73423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 73523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 73623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Binder.restoreCallingIdentity(origId); 73723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 73823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (outResult != null) { 73923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.result = res; 74023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (res == ActivityManager.START_SUCCESS) { 741ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWaitingActivityLaunched.add(outResult); 74223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner do { 74323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 74423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.wait(); 74523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (InterruptedException e) { 74623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 74723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } while (!outResult.timeout && outResult.who == null); 74823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (res == ActivityManager.START_TASK_TO_FRONT) { 749de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord r = stack.topRunningActivityLocked(null); 75023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (r.nowVisible) { 75123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.timeout = false; 75223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.who = new ComponentName(r.info.packageName, r.info.name); 75323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.totalTime = 0; 75423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.thisTime = 0; 75523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 75623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.thisTime = SystemClock.uptimeMillis(); 757ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWaitingActivityVisible.add(outResult); 75823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner do { 75923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 76023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.wait(); 76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (InterruptedException e) { 76223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 76323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } while (!outResult.timeout && outResult.who == null); 76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 76523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 76623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return res; 76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 77123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final int startActivities(IApplicationThread caller, int callingUid, String callingPackage, 77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent[] intents, String[] resolvedTypes, IBinder resultTo, 77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Bundle options, int userId) { 77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intents == null) { 77623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new NullPointerException("intents is null"); 77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (resolvedTypes == null) { 77923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new NullPointerException("resolvedTypes is null"); 78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intents.length != resolvedTypes.length) { 78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("intents are length different than resolvedTypes"); 78323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 78423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 78523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int callingPid; 78723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callingUid >= 0) { 78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = -1; 78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (caller == null) { 79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 79223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = callingUid = -1; 79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final long origId = Binder.clearCallingIdentity(); 79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 79723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner synchronized (mService) { 79876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner ActivityRecord[] outActivity = new ActivityRecord[1]; 79923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner for (int i=0; i<intents.length; i++) { 80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent intent = intents[i]; 80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent == null) { 80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner continue; 80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Refuse possible leaked file descriptors 80623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent != null && intent.hasFileDescriptors()) { 80723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("File descriptors passed in Intent"); 80823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 80923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 81023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner boolean componentSpecified = intent.getComponent() != null; 81123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't modify the client's object! 81323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = new Intent(intent); 81423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 81523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 81623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 81723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 0, null, null, userId); 81823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // TODO: New, check if this is correct 81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = mService.getActivityInfoForUser(aInfo, userId); 82023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null && 82223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE) 82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner != 0) { 82423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException( 82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "FLAG_CANT_SAVE_STATE not supported here"); 82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 82723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Bundle theseOptions; 82923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (options != null && i == intents.length-1) { 83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner theseOptions = options; 83123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 83223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner theseOptions = null; 83323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 8346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int res = startActivityLocked(caller, intent, resolvedTypes[i], 83523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo, resultTo, null, -1, callingPid, callingUid, callingPackage, 83623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 0, theseOptions, componentSpecified, outActivity); 83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (res < 0) { 83823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return res; 83923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 84023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 84123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner resultTo = outActivity[0] != null ? outActivity[0].appToken : null; 84223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } finally { 84523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Binder.restoreCallingIdentity(origId); 84623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 84723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 84823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return ActivityManager.START_SUCCESS; 84923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 85023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 8512420ead0326bfd2587da6231be419e758dba1930Craig Mautner final boolean realStartActivityLocked(ActivityRecord r, 8522420ead0326bfd2587da6231be419e758dba1930Craig Mautner ProcessRecord app, boolean andResume, boolean checkConfig) 8532420ead0326bfd2587da6231be419e758dba1930Craig Mautner throws RemoteException { 8542420ead0326bfd2587da6231be419e758dba1930Craig Mautner 8552420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.startFreezingScreenLocked(app, 0); 856ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.setAppVisibility(r.appToken, true); 8572420ead0326bfd2587da6231be419e758dba1930Craig Mautner 8582420ead0326bfd2587da6231be419e758dba1930Craig Mautner // schedule launch ticks to collect information about slow apps. 8592420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.startLaunchTickingLocked(); 8602420ead0326bfd2587da6231be419e758dba1930Craig Mautner 8612420ead0326bfd2587da6231be419e758dba1930Craig Mautner // Have the window manager re-evaluate the orientation of 8622420ead0326bfd2587da6231be419e758dba1930Craig Mautner // the screen based on the new activity order. Note that 8632420ead0326bfd2587da6231be419e758dba1930Craig Mautner // as a result of this, it can call back into the activity 8642420ead0326bfd2587da6231be419e758dba1930Craig Mautner // manager with a new orientation. We don't care about that, 8652420ead0326bfd2587da6231be419e758dba1930Craig Mautner // because the activity is not currently running so we are 8662420ead0326bfd2587da6231be419e758dba1930Craig Mautner // just restarting it anyway. 8672420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (checkConfig) { 868ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner Configuration config = mWindowManager.updateOrientationFromAppTokens( 8692420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mConfiguration, 8702420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.mayFreezeScreenLocked(app) ? r.appToken : null); 8712420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.updateConfigurationLocked(config, r, false, false); 8722420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 8732420ead0326bfd2587da6231be419e758dba1930Craig Mautner 8742420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.app = app; 8752420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.waitingToKill = null; 8762420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.launchCount++; 8772420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.lastLaunchTime = SystemClock.uptimeMillis(); 8782420ead0326bfd2587da6231be419e758dba1930Craig Mautner 8792420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (localLOGV) Slog.v(TAG, "Launching: " + r); 8802420ead0326bfd2587da6231be419e758dba1930Craig Mautner 8812420ead0326bfd2587da6231be419e758dba1930Craig Mautner int idx = app.activities.indexOf(r); 8822420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (idx < 0) { 8832420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.activities.add(r); 8842420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 8852420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.updateLruProcessLocked(app, true); 8862420ead0326bfd2587da6231be419e758dba1930Craig Mautner 8872420ead0326bfd2587da6231be419e758dba1930Craig Mautner final ActivityStack stack = r.task.stack; 8882420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 8892420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.thread == null) { 8902420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw new RemoteException(); 8912420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 8922420ead0326bfd2587da6231be419e758dba1930Craig Mautner List<ResultInfo> results = null; 8932420ead0326bfd2587da6231be419e758dba1930Craig Mautner List<Intent> newIntents = null; 8942420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 8952420ead0326bfd2587da6231be419e758dba1930Craig Mautner results = r.results; 8962420ead0326bfd2587da6231be419e758dba1930Craig Mautner newIntents = r.newIntents; 8972420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 8982420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 8992420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " icicle=" + r.icicle 9002420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " with results=" + results + " newIntents=" + newIntents 9012420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " andResume=" + andResume); 9022420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 9032420ead0326bfd2587da6231be419e758dba1930Craig Mautner EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 9042420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.userId, System.identityHashCode(r), 9052420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.task.taskId, r.shortComponentName); 9062420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 907ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (r.isHomeActivity() && r.isNotResolverActivity()) { 908e428a7f662f109a5f2015008e3161df23932483eCraig Mautner mService.mHomeProcess.add(app); 9092420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9102420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 9112420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.sleeping = false; 9122420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.forceNewConfig = false; 9132420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.showAskCompatModeDialogLocked(r); 9142420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 9152420ead0326bfd2587da6231be419e758dba1930Craig Mautner String profileFile = null; 9162420ead0326bfd2587da6231be419e758dba1930Craig Mautner ParcelFileDescriptor profileFd = null; 9172420ead0326bfd2587da6231be419e758dba1930Craig Mautner boolean profileAutoStop = false; 9182420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 9192420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileProc == null || mService.mProfileProc == app) { 9202420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mProfileProc = app; 9212420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFile = mService.mProfileFile; 9222420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = mService.mProfileFd; 9232420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileAutoStop = mService.mAutoStopProfiler; 9242420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9252420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9262420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.hasShownUi = true; 9272420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.pendingUiClean = true; 9282420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 9292420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 9302420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = profileFd.dup(); 9312420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException e) { 9322420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 9332420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 9342420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd.close(); 9352420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException o) { 9362420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9372420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = null; 9382420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9392420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9402420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 941a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP); 9422420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 9432420ead0326bfd2587da6231be419e758dba1930Craig Mautner System.identityHashCode(r), r.info, 944a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn new Configuration(mService.mConfiguration), r.compat, 945a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn app.repProcState, r.icicle, results, newIntents, !andResume, 9462420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.isNextTransitionForward(), profileFile, profileFd, 9472420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileAutoStop); 9482420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9492420ead0326bfd2587da6231be419e758dba1930Craig Mautner if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 9502420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This may be a heavy-weight process! Note that the package 9512420ead0326bfd2587da6231be419e758dba1930Craig Mautner // manager will ensure that only activity can run in the main 9522420ead0326bfd2587da6231be419e758dba1930Craig Mautner // process of the .apk, which is the only thing that will be 9532420ead0326bfd2587da6231be419e758dba1930Craig Mautner // considered heavy-weight. 9542420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.processName.equals(app.info.packageName)) { 9552420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mHeavyWeightProcess != null 9562420ead0326bfd2587da6231be419e758dba1930Craig Mautner && mService.mHeavyWeightProcess != app) { 9572420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Starting new heavy weight process " + app 9582420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " when already running " 9592420ead0326bfd2587da6231be419e758dba1930Craig Mautner + mService.mHeavyWeightProcess); 9602420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9612420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHeavyWeightProcess = app; 9622420ead0326bfd2587da6231be419e758dba1930Craig Mautner Message msg = mService.mHandler.obtainMessage( 9632420ead0326bfd2587da6231be419e758dba1930Craig Mautner ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 9642420ead0326bfd2587da6231be419e758dba1930Craig Mautner msg.obj = r; 9652420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHandler.sendMessage(msg); 9662420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9672420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9682420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9692420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (RemoteException e) { 9702420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (r.launchFailed) { 9712420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the second time we failed -- finish activity 9722420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and give up. 9732420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.e(TAG, "Second failure launching " 9742420ead0326bfd2587da6231be419e758dba1930Craig Mautner + r.intent.getComponent().flattenToShortString() 9752420ead0326bfd2587da6231be419e758dba1930Craig Mautner + ", giving up", e); 9762420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.appDiedLocked(app, app.pid, app.thread); 9772420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 9782420ead0326bfd2587da6231be419e758dba1930Craig Mautner "2nd-crash", false); 9792420ead0326bfd2587da6231be419e758dba1930Craig Mautner return false; 9802420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9812420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9822420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the first time we failed -- restart process and 9832420ead0326bfd2587da6231be419e758dba1930Craig Mautner // retry. 9842420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.activities.remove(r); 9852420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw e; 9862420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9872420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9882420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.launchFailed = false; 9892420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (stack.updateLRUListLocked(r)) { 9902420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Activity " + r 9912420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " being launched, but already in LRU list"); 9922420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9932420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9942420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 9952420ead0326bfd2587da6231be419e758dba1930Craig Mautner // As part of the process of launching, ActivityThread also performs 9962420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a resume. 9972420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.minimalResumeActivityLocked(r); 9982420ead0326bfd2587da6231be419e758dba1930Craig Mautner } else { 9992420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This activity is not starting in the resumed state... which 10002420ead0326bfd2587da6231be419e758dba1930Craig Mautner // should look like we asked it to pause+stop (but remain visible), 10012420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and it has done so and reported back the current icicle and 10022420ead0326bfd2587da6231be419e758dba1930Craig Mautner // other state. 10032420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 10042420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " (starting in stopped state)"); 10052420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.state = ActivityState.STOPPED; 10062420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.stopped = true; 10072420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10082420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10092420ead0326bfd2587da6231be419e758dba1930Craig Mautner // Launch the new version setup screen if needed. We do this -after- 10102420ead0326bfd2587da6231be419e758dba1930Craig Mautner // launching the initial activity (that is, home), so that it can have 10112420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a chance to initialize itself while in the background, making the 10122420ead0326bfd2587da6231be419e758dba1930Craig Mautner // switch back to it faster and look better. 1013de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (isFrontStack(stack)) { 10142420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.startSetupActivityLocked(); 10152420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10162420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10172420ead0326bfd2587da6231be419e758dba1930Craig Mautner return true; 10182420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10192420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1020e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner void startSpecificActivityLocked(ActivityRecord r, 1021e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner boolean andResume, boolean checkConfig) { 1022e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // Is this activity's application already running? 1023e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner ProcessRecord app = mService.getProcessRecordLocked(r.processName, 1024e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner r.info.applicationInfo.uid); 1025e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1026e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner r.task.stack.setLaunchTime(r); 1027e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1028e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner if (app != null && app.thread != null) { 1029e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner try { 1030d2932243e3313b59e7538641731aa98852bc5ac7Dianne Hackborn app.addPackage(r.info.packageName, mService.mProcessStats); 1031e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner realStartActivityLocked(r, app, andResume, checkConfig); 1032e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner return; 1033e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } catch (RemoteException e) { 1034e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner Slog.w(TAG, "Exception when starting activity " 1035e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner + r.intent.getComponent().flattenToShortString(), e); 1036e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1037e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1038e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // If a dead object exception was thrown -- fall through to 1039e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // restart the application. 1040e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1041e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1042e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 1043e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner "activity", r.intent.getComponent(), false, false); 1044e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1045e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 10466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startActivityLocked(IApplicationThread caller, 10476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Intent intent, String resolvedType, ActivityInfo aInfo, IBinder resultTo, 10486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner String resultWho, int requestCode, 10496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options, 10506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner boolean componentSpecified, ActivityRecord[] outActivity) { 10516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int err = ActivityManager.START_SUCCESS; 10526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 10536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ProcessRecord callerApp = null; 10546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (caller != null) { 10556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callerApp = mService.getRecordForAppLocked(caller); 10566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (callerApp != null) { 10576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingPid = callerApp.pid; 10586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid = callerApp.info.uid; 10596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 10606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, "Unable to find app for caller " + caller 10616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " (pid=" + callingPid + ") when starting: " 10626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + intent.toString()); 10636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_PERMISSION_DENIED; 10646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 10676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS) { 10686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; 10696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false) 10706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + "} from pid " + (callerApp != null ? callerApp.pid : callingPid)); 10716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 10736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord sourceRecord = null; 10746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord resultRecord = null; 10756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultTo != null) { 10766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord = isInAnyStackLocked(resultTo); 10776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (DEBUG_RESULTS) Slog.v( 10786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner TAG, "Will send result to " + resultTo + " " + sourceRecord); 10796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (sourceRecord != null) { 10806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0 && !sourceRecord.finishing) { 10816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord; 10826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack; 10866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 10876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int launchFlags = intent.getFlags(); 10886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 10896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 10906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner && sourceRecord != null) { 10916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Transfer the result target from the source activity to the new 10926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // one being started, including any failures. 10936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0) { 10946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 10956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 10966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 10976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord.resultTo; 10986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultWho = sourceRecord.resultWho; 10996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner requestCode = sourceRecord.requestCode; 11006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord.resultTo = null; 11016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 11026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord.removeResultsLocked( 11036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord, resultWho, requestCode); 11046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { 11086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find a class that can handle the given Intent. 11096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // That's the end of that! 11106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_INTENT_NOT_RESOLVED; 11116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && aInfo == null) { 11146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find the specific class specified in the Intent. 11156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Also the end of the line. 11166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_CLASS_NOT_FOUND; 11176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err != ActivityManager.START_SUCCESS) { 11206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 11216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 11226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 11236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 11246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner setDismissKeyguard(false); 11266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 11276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 11286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startAnyPerm = mService.checkPermission( 11316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner START_ANY_ACTIVITY, callingPid, callingUid); 11326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid, 11336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid, aInfo.applicationInfo.uid, aInfo.exported); 11346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) { 11356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 11366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 11376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 11386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 11396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner setDismissKeyguard(false); 11416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner String msg; 11426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (!aInfo.exported) { 11436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 11446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 11456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 11466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " not exported from uid " + aInfo.applicationInfo.uid; 11476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 11486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 11496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 11506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 11516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " requires " + aInfo.permission; 11526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, msg); 11546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner throw new SecurityException(msg); 11556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1157dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid, 1158b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver callingPid, resolvedType, aInfo.applicationInfo); 11595e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver 11606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mController != null) { 11616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner try { 11626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // The Intent we give to the watcher has the extra data 11636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // stripped off, since it can contain private information. 11646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Intent watchIntent = intent.cloneFilter(); 11655e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver abort |= !mService.mController.activityStarting(watchIntent, 11666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner aInfo.applicationInfo.packageName); 11676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } catch (RemoteException e) { 11686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mController = null; 11696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11705e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver } 11716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11725e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (abort) { 11735e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (resultRecord != null) { 11745e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, 11756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 11766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11775e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // We pretend to the caller that it was really started, but 11785e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // they will just get a cancel result. 11795e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver setDismissKeyguard(false); 11805e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver ActivityOptions.abort(options); 11815e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver return ActivityManager.START_SUCCESS; 11826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage, 11856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner intent, resolvedType, aInfo, mService.mConfiguration, 1186de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resultRecord, resultWho, requestCode, componentSpecified, this); 11876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (outActivity != null) { 11886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner outActivity[0] = r; 11896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1191ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = getFocusedStack(); 1192de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stack.mResumedActivity == null 1193de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner || stack.mResumedActivity.info.applicationInfo.uid != callingUid) { 11946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 11956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner PendingActivityLaunch pal = 1196de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner new PendingActivityLaunch(r, sourceRecord, startFlags, stack); 11976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mPendingActivityLaunches.add(pal); 11986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner setDismissKeyguard(false); 11996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 12006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_SWITCHES_CANCELED; 12016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mDidAppSwitch) { 12056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // This is the second allowed switch since we stopped switches, 12066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // so now just generally allow switches. Use case: user presses 12076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // home (switches disabled, switch to home, mDidAppSwitch now true); 12086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // user taps a home icon (coming from home so allowed, we hit here 12096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // and now allow anyone to switch again). 12106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mAppSwitchesAllowedTime = 0; 12116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 12126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mDidAppSwitch = true; 12136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.doPendingActivityLaunchesLocked(false); 12166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner err = startActivityUncheckedLocked(r, sourceRecord, startFlags, true, options); 1218de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stack.mPausingActivity == null) { 12196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Someone asked to have the keyguard dismissed on the next 12206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // activity start, but we are not actually doing an activity 12216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // switch... just dismiss the keyguard now, because we 12226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // probably want to see whatever is behind it. 12236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner dismissKeyguard(); 12246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 12266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1228ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityStack adjustStackFocus(ActivityRecord r) { 12291d001b670e34fe887488047f525a5430154626e1Craig Mautner final TaskRecord task = r.task; 12301d001b670e34fe887488047f525a5430154626e1Craig Mautner if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) { 1231ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (task != null) { 1232ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (mFocusedStack != task.stack) { 1233ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1234ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Setting focused stack to r=" + r + " task=" + task); 1235ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mFocusedStack = task.stack; 1236ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } else { 1237ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1238ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Focused stack already=" + mFocusedStack); 1239858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1240ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mFocusedStack; 1241858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1242ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1243ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (mFocusedStack != null) { 1244ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1245ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Have a focused stack=" + mFocusedStack); 1246ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mFocusedStack; 1247de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1248ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1249ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx > 0; --stackNdx) { 1250ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityStack stack = mStacks.get(stackNdx); 1251ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (!stack.isHomeStack()) { 1252ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1253ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Setting focused stack=" + stack); 1254ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mFocusedStack = stack; 1255ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mFocusedStack; 1256ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 12571d001b670e34fe887488047f525a5430154626e1Craig Mautner } 1258ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1259ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner // Time to create the first app stack for this user. 1260ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner int stackId = mService.createStack(-1, HOME_STACK_ID, 1261ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner StackBox.TASK_STACK_GOES_OVER, 1.0f); 1262ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r + 1263ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner " stackId=" + stackId); 1264ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mFocusedStack = getStack(stackId); 126529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return mFocusedStack; 1266de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1267de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mHomeStack; 1268de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1269de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 127029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner void setFocusedStack(ActivityRecord r) { 127129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r == null) { 127229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return; 127329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 127486d67a4faad2cca95f6ec7c93876d6d3d1c136d9Craig Mautner if (!r.isApplicationActivity() || (r.task != null && !r.task.isApplicationTask())) { 127529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (mStackState != STACK_STATE_HOME_IN_FRONT) { 1276e7c58b6d7d761b93e785b0a399e5b00fdb82f4ceCraig Mautner if (DEBUG_STACK || DEBUG_FOCUS) Slog.d(TAG, "setFocusedStack: mStackState old=" + 127776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(mStackState) + " new=" + 127876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(STACK_STATE_HOME_TO_FRONT) + 127976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner " Callers=" + Debug.getCallers(3)); 128029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner mStackState = STACK_STATE_HOME_TO_FRONT; 128129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 128229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } else { 1283ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1284ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "setFocusedStack: Setting focused stack to r=" + r + " task=" + r.task + 1285ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner " Callers=" + Debug.getCallers(3)); 128629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner mFocusedStack = r.task.stack; 128729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (mStackState != STACK_STATE_HOME_IN_BACK) { 128876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "setFocusedStack: mStackState old=" + 128976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(mStackState) + " new=" + 129076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner stackStateToString(STACK_STATE_HOME_TO_BACK) + 129176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner " Callers=" + Debug.getCallers(3)); 129229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner mStackState = STACK_STATE_HOME_TO_BACK; 129329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 129429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 129529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 129629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner 12978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final int startActivityUncheckedLocked(ActivityRecord r, 12988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord sourceRecord, int startFlags, boolean doResume, 12998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner Bundle options) { 13008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final Intent intent = r.intent; 13018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final int callingUid = r.launchedFromUid; 13028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner int launchFlags = intent.getFlags(); 13048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We'll invoke onUserLeaving before onPause only if the launching 13068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity did not explicitly state that this is an automated launch. 1307de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mUserLeaving = (launchFlags&Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 1308de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving); 13098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has asked not to resume at this point, we make note 13118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of this in the record so that we can skip it when trying to find 13128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the top running activity. 13138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!doResume) { 13148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.delayedResume = true; 13158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord notTop = (launchFlags&Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null; 13188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the onlyIfNeeded flag is set, then we can do this if the activity 13208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being launched is the same as the one making the call... or, as 13218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a special case, if we do not know the caller then we count the 13228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current top activity as the caller. 13238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 13248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord checkedCaller = sourceRecord; 13258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (checkedCaller == null) { 1326ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop); 13278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!checkedCaller.realActivity.equals(r.realActivity)) { 13298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Caller is not the same as launcher, so always needed. 13308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED; 13318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (sourceRecord == null) { 13358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This activity is not being started from another... in this 13368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // case we -always- start a new task. 13378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 133829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner Slog.w(TAG, "startActivity called from non-Activity context; forcing " + 133929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 13408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 13418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 13438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The original activity who is starting us is running as a single 13448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // instance... this new activity it is starting must go on its 13458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // own task. 13468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 13478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 13488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 13498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The activity being started is a single instance... it always 13508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // gets launched into its own task. 13518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 13528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 1354de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ActivityStack sourceStack; 1355525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner TaskRecord sourceTask; 1356de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (sourceRecord != null) { 1357de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner sourceTask = sourceRecord.task; 1358de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner sourceStack = sourceTask.stack; 1359de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } else { 1360de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner sourceTask = null; 1361de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner sourceStack = null; 1362de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1363de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 13648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo != null && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 13658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For whatever reason this activity is being launched into a new 13668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // task... yet the caller has requested a result back. Well, that 13678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is pretty messed up, so instead immediately send back a cancel 13688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // and let the new task continue launched as normal without a 13698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // dependency on its originator. 13708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 13718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, 13728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.resultTo, r.resultWho, r.requestCode, 13738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner Activity.RESULT_CANCELED, null); 13748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.resultTo = null; 13758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 13768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 13778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean addingToTask = false; 13788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean movedHome = false; 13798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner TaskRecord reuseTask = null; 1380de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack targetStack; 13818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 13828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 13838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 13848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 13858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If bring to front is requested, and no result is requested, and 13868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we can find a task that was started with this same 13878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // component, then instead of launching bring that one to the front. 13888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo == null) { 13898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // See if there is a task to bring to the front. If this is 13908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a SINGLE_INSTANCE activity, there can be one and only one 13918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // instance of it in the history, and it is always in its own 13928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // unique task, so we do a special search. 13938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 1394ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ? findTaskLocked(r) 13958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner : findActivityLocked(intent, r.info); 13968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity != null) { 139729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) { 139829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner r.task = intentActivity.task; 139929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 14008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack = intentActivity.task.stack; 14010f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 1402de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner moveHomeStack(targetStack.isHomeStack()); 14038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.task.intent == null) { 14048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This task was started because of movement of 14058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the activity based on affinity... now that we 14068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // are actually launching it, we can assign the 14078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // base intent. 14088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.setIntent(intent, r.info); 14098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the target task is not in the front, then we need 14118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to bring it to the front... except... well, with 14128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 14138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to have the same behavior as if a new instance was 14148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being started, which means not bringing it to the front 14158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // if the caller is not itself in the front. 1416165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner final ActivityStack lastStack = getLastStack(); 1417165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner ActivityRecord curTop = lastStack == null? 1418165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner null : lastStack.topRunningNonDelayedActivityLocked(notTop); 14198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (curTop != null && curTop.task != intentActivity.task) { 14208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 1421d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner if (sourceRecord == null || (sourceStack.topActivity() != null && 1422d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner sourceStack.topActivity().task == sourceRecord.task)) { 14238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We really do want to push this one into the 14248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // user's face, right now. 14258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner movedHome = true; 1426de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 142729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) 142829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { 1429e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner // Caller wants to appear on home activity. 1430de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.mLaunchHomeTaskNext = true; 1431de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 14328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.moveTaskToFrontLocked(intentActivity.task, r, options); 14338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner options = null; 14348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has requested that the target task be 14378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // reset, then do so. 14388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 14398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r); 14408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 14428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 14438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 14448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! And for paranoia, make 14458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 14468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 1447de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack); 144805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(targetStack, null, options); 14498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 14508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 14518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 145229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 145329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 145429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 14558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 14568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags & 14588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 14598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 14608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The caller has requested to completely replace any 14618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task with its new activity. Well that should 14628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // not be too hard... 14638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask = intentActivity.task; 14648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask.performClearTaskLocked(); 14658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask.setIntent(r.intent, r.info); 14668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 14678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 14688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 14698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this situation we want to remove all activities 14708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from the task up to the one being started. In most 14718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // cases this means we are resetting the task to its 14728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // initial state. 14738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord top = 14748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.performClearTaskLocked(r, launchFlags); 14758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 14768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.frontOfTask) { 14778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Activity aliases may mean we use different 14788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intents for the top activity, so make sure 14798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the task now has the identity of the new 14808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intent. 14818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.task.setIntent(r.intent, r.info); 14828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, 14848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r, top.task); 14858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 14868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 14878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // A special case: we need to 14888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // start the activity because it is not currently 14898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // running, and the caller has asked to clear the 14908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current task to have this activity at the top. 14918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 14928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Now pretend like this activity is being started 14938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // by the top of its task, so it is put in the 14948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // right place. 14958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 14968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (r.realActivity.equals(intentActivity.task.realActivity)) { 14988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case the top activity on the task is the 14998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // same as the one being launched, so we take that 15008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // as a request to bring the task to the foreground. 15018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the top activity in the task is the root 15028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity, deliver this new intent to it if it 15038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // desires. 15048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 15058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) 15068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner && intentActivity.realActivity.equals(r.realActivity)) { 15078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, 15088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task); 15098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.frontOfTask) { 15108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.setIntent(r.intent, r.info); 15118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.deliverNewIntentLocked(callingUid, r.intent); 15138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!r.intent.filterEquals(intentActivity.task.intent)) { 15148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching the root activity 15158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of the task, but with a different intent. We 15168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // should start a new instance on top. 15178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 15188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 15198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 15218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case an activity is being launched in to an 15228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task, without resetting that task. This 15238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is typically the situation of launching an activity 15248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from a notification or shortcut. We want to place 15258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the new activity on top of the current task. 15268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 15278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 15288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!intentActivity.task.rootWasReset) { 15298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching in to an existing task 15308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that has not yet been started from its front door. 15318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The current task has been brought to the front. 15328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Ideally, we'd probably like to place this new task 15338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the bottom of its stack, but that's a little hard 15348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to do with the current organization of the code so 15358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // for now we'll just drop it. 15368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.setIntent(r.intent, r.info); 15378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!addingToTask && reuseTask == null) { 15398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We didn't do anything... but it was needed (a.k.a., client 15408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // don't use that intent!) And for paranoia, make 15418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 15428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 1543e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner // Reset flag so it gets correctly reevaluated. 1544e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner intentActivity.mLaunchHomeTaskNext = false; 1545de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner setLaunchHomeTaskNextFlag(sourceRecord, intentActivity, targetStack); 1546de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner targetStack.resumeTopActivityLocked(null, options); 15478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 15488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 15498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 155029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 155129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 155229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 15538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_TASK_TO_FRONT; 15548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 15598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //String uri = r.intent.toURI(); 15608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Intent intent2 = new Intent(uri); 15618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "Given intent: " + r.intent); 15628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "URI is: " + uri); 15638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "To intent: " + intent2); 15648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 15658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.packageName != null) { 15668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the activity being launched is the same as the one currently 15678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the top, then we need to check if it should only be launched 15688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // once. 1569ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack topStack = getFocusedStack(); 1570de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop); 15718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null && r.resultTo == null) { 15728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 15738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.app != null && top.app.thread != null) { 15748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 15758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 15768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 15778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, 15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.task); 15798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 15808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 15810f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner topStack.mLastPausedActivity = null; 15828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 1583de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner setLaunchHomeTaskNextFlag(sourceRecord, null, topStack); 158405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 15858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 15878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 15888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 15898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 15908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! 159129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 159229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 159329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 15948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 15958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 159729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 159829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 159929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 16008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 16018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 16078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo != null) { 1608de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, 1609de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.requestCode, Activity.RESULT_CANCELED, null); 16108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 161229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 161329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 161429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 16158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_CLASS_NOT_FOUND; 16168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean newTask = false; 16198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean keepCurTransition = false; 16208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Should this be considered a new task? 16228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo == null && !addingToTask 16238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1624ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner targetStack = adjustStackFocus(r); 1625de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner moveHomeStack(targetStack.isHomeStack()); 16268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (reuseTask == null) { 1627de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.setTask(targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true), 1628de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner null, true); 1629de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " + 1630de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.task); 16318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 1632de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.setTask(reuseTask, reuseTask, true); 16338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner newTask = true; 16358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!movedHome) { 1636de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 1637de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 1638de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 1639de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // Caller wants to appear on home activity, so before starting 1640de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // their own activity we will bring home to the front. 1641de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.mLaunchHomeTaskNext = true; 1642de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 16438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (sourceRecord != null) { 1645525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner sourceTask = sourceRecord.task; 1646525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner targetStack = sourceTask.stack; 1647de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner moveHomeStack(targetStack.isHomeStack()); 16488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!addingToTask && 16498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 16508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are adding the activity to an existing 16518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // task, but the caller has asked to clear that task if the 16528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity is already running. 1653525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags); 16548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner keepCurTransition = true; 16558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 16568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 16578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 16588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 16598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 16600f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 16618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 1662de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack); 16638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 16648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 166629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) Slog.v(TAG, 166729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "startActivityUncheckedLocked: task left null", 166829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner new RuntimeException("here").fillInStackTrace()); 16698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 16708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!addingToTask && 16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are launching an activity in our own task 16748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that may already be running somewhere in the history, and 16758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we want to shuffle it to the front of the stack if so. 1676525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r); 16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 1678de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final TaskRecord task = top.task; 1679de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner task.moveActivityToFrontLocked(top); 1680de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task); 16818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.updateOptionsLocked(options); 16828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 16830f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 16848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 1685de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner setLaunchHomeTaskNextFlag(sourceRecord, null, targetStack); 16868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 16878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 16898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // An existing activity is starting this new activity, so we want 16928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to keep the new one in the same task as the one that is starting 16938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // it. 1694525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner r.setTask(sourceTask, sourceRecord.thumbHolder, false); 16958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 16968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner + " in existing task " + r.task); 16978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 16998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This not being started from an existing activity, and not part 17008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of a new task... just put it in the top task, though these days 17018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // this case should never happen. 1702ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner targetStack = adjustStackFocus(r); 1703de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner moveHomeStack(targetStack.isHomeStack()); 17041602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner ActivityRecord prev = targetStack.topActivity(); 1705de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.setTask(prev != null ? prev.task 1706de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, true), 1707de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner null, true); 17088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 17098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner + " in new guessed " + r.task); 17108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 17138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intent, r.getUriPermissionsLocked()); 17148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (newTask) { 17168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId); 17178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 1719de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner setLaunchHomeTaskNextFlag(sourceRecord, r, targetStack); 17200f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 17218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options); 17221d001b670e34fe887488047f525a5430154626e1Craig Mautner mService.setFocusedActivityLocked(r); 17238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_SUCCESS; 17248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17267ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner void acquireLaunchWakelock() { 17277ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 17287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 17297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17307ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.acquire(); 17317ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 17327ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // To be safe, don't allow the wake lock to be held for too long. 17337ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 17347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 1737f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Checked. 1738f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, 1739f333327782e14688e1c198c1192172d51308e90bCraig Mautner Configuration config) { 1740f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 1741f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1742f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> stops = null; 1743f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> finishes = null; 1744f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<UserStartedState> startingUsers = null; 1745f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NS = 0; 1746f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NF = 0; 1747f333327782e14688e1c198c1192172d51308e90bCraig Mautner IApplicationThread sendThumbnail = null; 1748f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean booting = false; 1749f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean enableScreen = false; 1750f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean activityRemoved = false; 1751f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1752f333327782e14688e1c198c1192172d51308e90bCraig Mautner ActivityRecord r = ActivityRecord.forToken(token); 1753f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r != null) { 1754b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" + 1755b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner Debug.getCallers(4)); 1756f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 1757f333327782e14688e1c198c1192172d51308e90bCraig Mautner r.finishLaunchTickingLocked(); 17587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (fromTimeout) { 17597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 17607ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 1761f333327782e14688e1c198c1192172d51308e90bCraig Mautner 17627ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // This is a hack to semi-deal with a race condition 17637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // in the client where it can be constructed with a 17647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // newer configuration from when we asked it to launch. 17657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We'll update with whatever configuration it now says 17667ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // it used to launch. 17677ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (config != null) { 17687ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.configuration = config; 17697ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 1770f333327782e14688e1c198c1192172d51308e90bCraig Mautner 17717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We are now idle. If someone is waiting for a thumbnail from 17727ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // us, we can now deliver. 17737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.idle = true; 17747ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 17757ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (r.thumbnailNeeded && r.app != null && r.app.thread != null) { 17767ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner sendThumbnail = r.app.thread; 17777ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.thumbnailNeeded = false; 17787ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17797ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 17807ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 17817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (!mService.mBooted && isFrontStack(r.task.stack)) { 17827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mBooted = true; 17837ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner enableScreen = true; 17847ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17867ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 17877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (allResumedActivitiesIdle()) { 17887ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (r != null) { 17897ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.scheduleAppGcsLocked(); 17907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 17917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 17927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 17937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 17947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && 17957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Binder.getCallingUid() != Process.myUid()) { 17967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 1797f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 17987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 1799f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 18007ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner ensureActivitiesVisibleLocked(null, 0); 1801f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1802f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1803f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Atomically retrieve all of the other things to do. 1804f333327782e14688e1c198c1192172d51308e90bCraig Mautner stops = processStoppingActivitiesLocked(true); 1805f333327782e14688e1c198c1192172d51308e90bCraig Mautner NS = stops != null ? stops.size() : 0; 1806f333327782e14688e1c198c1192172d51308e90bCraig Mautner if ((NF=mFinishingActivities.size()) > 0) { 1807f333327782e14688e1c198c1192172d51308e90bCraig Mautner finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 1808f333327782e14688e1c198c1192172d51308e90bCraig Mautner mFinishingActivities.clear(); 1809f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1810f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1811f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ArrayList<ActivityRecord> thumbnails; 1812f333327782e14688e1c198c1192172d51308e90bCraig Mautner final int NT = mCancelledThumbnails.size(); 1813f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (NT > 0) { 1814f333327782e14688e1c198c1192172d51308e90bCraig Mautner thumbnails = new ArrayList<ActivityRecord>(mCancelledThumbnails); 1815f333327782e14688e1c198c1192172d51308e90bCraig Mautner mCancelledThumbnails.clear(); 1816f333327782e14688e1c198c1192172d51308e90bCraig Mautner } else { 1817f333327782e14688e1c198c1192172d51308e90bCraig Mautner thumbnails = null; 1818f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1819f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1820f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (isFrontStack(mHomeStack)) { 1821f333327782e14688e1c198c1192172d51308e90bCraig Mautner booting = mService.mBooting; 1822f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.mBooting = false; 1823f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1824f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1825f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mStartingUsers.size() > 0) { 1826f333327782e14688e1c198c1192172d51308e90bCraig Mautner startingUsers = new ArrayList<UserStartedState>(mStartingUsers); 1827f333327782e14688e1c198c1192172d51308e90bCraig Mautner mStartingUsers.clear(); 1828f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1829f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1830f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Perform the following actions from unsynchronized state. 1831f333327782e14688e1c198c1192172d51308e90bCraig Mautner final IApplicationThread thumbnailThread = sendThumbnail; 1832f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.post(new Runnable() { 1833f333327782e14688e1c198c1192172d51308e90bCraig Mautner @Override 1834f333327782e14688e1c198c1192172d51308e90bCraig Mautner public void run() { 1835f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (thumbnailThread != null) { 1836f333327782e14688e1c198c1192172d51308e90bCraig Mautner try { 1837f333327782e14688e1c198c1192172d51308e90bCraig Mautner thumbnailThread.requestThumbnail(token); 1838f333327782e14688e1c198c1192172d51308e90bCraig Mautner } catch (Exception e) { 1839f333327782e14688e1c198c1192172d51308e90bCraig Mautner Slog.w(TAG, "Exception thrown when requesting thumbnail", e); 1840f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.sendPendingThumbnail(null, token, null, null, true); 1841f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1842f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1843f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1844f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Report back to any thumbnail receivers. 1845f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NT; i++) { 1846f333327782e14688e1c198c1192172d51308e90bCraig Mautner ActivityRecord r = thumbnails.get(i); 1847f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.sendPendingThumbnail(r, null, null, null, true); 1848f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1849f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1850f333327782e14688e1c198c1192172d51308e90bCraig Mautner }); 1851f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1852f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Stop any activities that are scheduled to do so but have been 1853f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 1854f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NS; i++) { 1855f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = stops.get(i); 1856f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityStack stack = r.task.stack; 1857f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r.finishing) { 1858f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false); 1859f333327782e14688e1c198c1192172d51308e90bCraig Mautner } else { 1860f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.stopActivityLocked(r); 1861f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1862f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1863f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1864f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Finish any activities that are scheduled to do so but have been 1865f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 1866f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NF; i++) { 1867f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = finishes.get(i); 1868f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle"); 1869f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1870f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1871f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (booting) { 1872f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.finishBooting(); 1873f333327782e14688e1c198c1192172d51308e90bCraig Mautner } else if (startingUsers != null) { 1874f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < startingUsers.size(); i++) { 1875f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.finishUserSwitch(startingUsers.get(i)); 1876f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1877f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1878f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1879f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.trimApplications(); 1880f333327782e14688e1c198c1192172d51308e90bCraig Mautner //dump(); 1881f333327782e14688e1c198c1192172d51308e90bCraig Mautner //mWindowManager.dump(); 1882f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1883f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (enableScreen) { 1884f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.enableScreenAfterBoot(); 1885f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1886f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1887f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (activityRemoved) { 188805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 1889f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1890f333327782e14688e1c198c1192172d51308e90bCraig Mautner 18917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return r; 1892f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1893f333327782e14688e1c198c1192172d51308e90bCraig Mautner 18948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void handleAppDiedLocked(ProcessRecord app, boolean restarting) { 18958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Just in case. 18968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 18978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 1898e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner mStacks.get(stackNdx).handleAppDiedLocked(app, restarting); 18998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 19028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void closeSystemDialogsLocked() { 19038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 19048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 19058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 19068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.closeSystemDialogsLocked(); 19078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 19108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** 19118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * @return true if some activity was finished (or would have finished if doit were true). 19128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner */ 19138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) { 19148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean didSomething = false; 19158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 19168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 19178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 19188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) { 19198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner didSomething = true; 19208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return didSomething; 19238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1925a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn void updatePreviousProcessLocked(ActivityRecord r) { 1926a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now that this process has stopped, we may want to consider 1927a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // it to be the previous app to try to keep around in case 1928a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // the user wants to return to it. 1929a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 1930a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // First, found out what is currently the foreground app, so that 1931a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // we don't blow away the previous app if this activity is being 1932a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // hosted by the process that is actually still the foreground. 1933a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn ProcessRecord fgApp = null; 1934a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 1935a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn final ActivityStack stack = mStacks.get(stackNdx); 1936a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn if (isFrontStack(stack)) { 1937a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn if (stack.mResumedActivity != null) { 1938a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn fgApp = stack.mResumedActivity.app; 1939a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } else if (stack.mPausingActivity != null) { 1940a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn fgApp = stack.mPausingActivity.app; 1941a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1942a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn break; 1943a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1944a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1945a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 1946a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now set this one as the previous process, only if that really 1947a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // makes sense to. 1948a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn if (r.app != null && fgApp != null && r.app != fgApp 1949a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn && r.lastVisibleTime > mService.mPreviousProcessVisibleTime 1950e428a7f662f109a5f2015008e3161df23932483eCraig Mautner && !mService.mHomeProcess.contains(r.app)) { 1951a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcess = r.app; 1952a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcessVisibleTime = r.lastVisibleTime; 1953a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1954a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 1955a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 195605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked() { 195705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return resumeTopActivitiesLocked(null, null, null); 195805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 195905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 196005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, 196105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner Bundle targetOptions) { 196205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner if (targetStack == null) { 196305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner targetStack = getFocusedStack(); 196405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 196505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean result = false; 1966dbcb31f28c7123f25e4b19c369332f23c36f9205Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 1967f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 1968f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner if (isFrontStack(stack)) { 196905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner if (stack == targetStack) { 197005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner result = stack.resumeTopActivityLocked(target, targetOptions); 197105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } else { 197205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner stack.resumeTopActivityLocked(null); 197305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 1974f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner } 19758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 197605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return result; 19778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 19798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void finishTopRunningActivityLocked(ProcessRecord app) { 19808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 19818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 19828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 19838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.finishTopRunningActivityLocked(app); 19848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 19878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void findTaskToMoveToFrontLocked(int taskId, int flags, Bundle options) { 19888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 19898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (mStacks.get(stackNdx).findTaskToMoveToFrontLocked(taskId, flags, options)) { 19907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" + 19911d001b670e34fe887488047f525a5430154626e1Craig Mautner mStacks.get(stackNdx)); 19928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return; 19938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 19968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1997967212cb542e6eeb308678367b53381bff984c31Craig Mautner ActivityStack getStack(int stackId) { 19988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 19998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 20008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack.getStackId() == stackId) { 20018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return stack; 20028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 20058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2007967212cb542e6eeb308678367b53381bff984c31Craig Mautner ArrayList<ActivityStack> getStacks() { 2008967212cb542e6eeb308678367b53381bff984c31Craig Mautner return new ArrayList<ActivityStack>(mStacks); 2009967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 2010967212cb542e6eeb308678367b53381bff984c31Craig Mautner 2011967212cb542e6eeb308678367b53381bff984c31Craig Mautner int createStack() { 2012858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner while (true) { 2013858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (++mLastStackId <= HOME_STACK_ID) { 2014858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mLastStackId = HOME_STACK_ID + 1; 2015858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 2016858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (getStack(mLastStackId) == null) { 2017858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner break; 20188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2020858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mStacks.add(new ActivityStack(mService, mContext, mLooper, mLastStackId)); 2021858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner return mLastStackId; 20228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 20248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void moveTaskToStack(int taskId, int stackId, boolean toTop) { 2025b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner final TaskRecord task = anyTaskForIdLocked(taskId); 2026b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (task == null) { 2027b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner return; 2028b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner } 20298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = getStack(stackId); 20308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack == null) { 20318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); 20328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return; 20338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2034b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner removeTask(task); 2035b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner stack.addTask(task, toTop); 2036b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner mWindowManager.addTask(taskId, stackId, toTop); 203705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 20388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2040ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityRecord findTaskLocked(ActivityRecord r) { 20418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2042ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2043ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (!r.isApplicationActivity() && !stack.isHomeStack()) { 2044ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner continue; 2045ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 2046ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner final ActivityRecord ar = stack.findTaskLocked(r); 20478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (ar != null) { 20488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ar; 20498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 20528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 20548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 20558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 20568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final ActivityRecord ar = mStacks.get(stackNdx).findActivityLocked(intent, info); 20578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (ar != null) { 20588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ar; 20598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 20628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 20648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void goingToSleepLocked() { 20650eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleSleepTimeout(); 20660eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mGoingToSleep.isHeld()) { 20670eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.acquire(); 20687ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 20697ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 20707ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 20710eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 20727ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 20737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 20740eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 20758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 20788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean shutdownLocked(int timeout) { 20798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean timedout = false; 20800eea92c67b292b005c152641a12b920fe145826cCraig Mautner goingToSleepLocked(); 20810eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 20820eea92c67b292b005c152641a12b920fe145826cCraig Mautner 20830eea92c67b292b005c152641a12b920fe145826cCraig Mautner final long endTime = System.currentTimeMillis() + timeout; 20840eea92c67b292b005c152641a12b920fe145826cCraig Mautner while (true) { 20850eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean cantShutdown = false; 20860eea92c67b292b005c152641a12b920fe145826cCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 20870eea92c67b292b005c152641a12b920fe145826cCraig Mautner cantShutdown |= mStacks.get(stackNdx).checkReadyForSleepLocked(); 20880eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 20890eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (cantShutdown) { 20900eea92c67b292b005c152641a12b920fe145826cCraig Mautner long timeRemaining = endTime - System.currentTimeMillis(); 20910eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (timeRemaining > 0) { 20928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 20930eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.wait(timeRemaining); 20948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (InterruptedException e) { 20958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20960eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 20970eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Activity manager shutdown timed out"); 20980eea92c67b292b005c152641a12b920fe145826cCraig Mautner timedout = true; 20990eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 21008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21010eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 21020eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 21038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21050eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21060eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Force checkReadyForSleep to complete. 21070eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 21080eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 21090eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return timedout; 21118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 21138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void comeOutOfSleepIfNeededLocked() { 21140eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 21150eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 21160eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 21170eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 2118ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 21198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2120ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner stack.awakeFromSleepingLocked(); 2121ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (isFrontStack(stack)) { 212205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 2123de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 21248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21250eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.clear(); 21260eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21270eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21280eea92c67b292b005c152641a12b920fe145826cCraig Mautner void activitySleptLocked(ActivityRecord r) { 21290eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.remove(r); 21300eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 21310eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21320eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21330eea92c67b292b005c152641a12b920fe145826cCraig Mautner void checkReadyForSleepLocked() { 21340eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mService.isSleepingOrShuttingDown()) { 21350eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Do not care. 21360eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 21370eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21380eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21390eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mSleepTimeout) { 21400eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean dontSleep = false; 21410eea92c67b292b005c152641a12b920fe145826cCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 21420eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep |= mStacks.get(stackNdx).checkReadyForSleepLocked(); 21430eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21440eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21450eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mStoppingActivities.size() > 0) { 21460eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to stop; can't sleep yet. 21470eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 21480eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mStoppingActivities.size() + " activities"); 21490eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleIdleLocked(); 21500eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 21510eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21520eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21530eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleepActivities.size() > 0) { 21540eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to sleep; can't sleep yet. 21550eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 21560eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mGoingToSleepActivities.size() + " activities"); 21570eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 21580eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21590eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21600eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (dontSleep) { 21610eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 21620eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21630eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21640eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21650eea92c67b292b005c152641a12b920fe145826cCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 21660eea92c67b292b005c152641a12b920fe145826cCraig Mautner mStacks.get(stackNdx).goToSleep(); 21670eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21680eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21690eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 21700eea92c67b292b005c152641a12b920fe145826cCraig Mautner 21710eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 21720eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 21730eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21740eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.mShuttingDown) { 21750eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.notifyAll(); 21760eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 21778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2179ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner boolean reportResumedActivityLocked(ActivityRecord r) { 2180ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = r.task.stack; 2181ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (isFrontStack(stack)) { 21825782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey mService.updateUsageStats(r, true); 2183ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2184ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (allResumedActivitiesComplete()) { 2185ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ensureActivitiesVisibleLocked(null, 0); 2186ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.executeAppTransition(); 2187ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return true; 2188ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2189ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return false; 2190ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2191ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 21928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void handleAppCrashLocked(ProcessRecord app) { 21938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 21948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 21958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 21968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.handleAppCrashLocked(app); 21978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2200de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) { 2201580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner // First the front stacks. In case any are not fullscreen and are in front of home. 2202580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner boolean showHomeBehindStack = false; 2203de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2204580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2205580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner if (isFrontStack(stack)) { 2206580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner showHomeBehindStack = 2207580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner stack.ensureActivitiesVisibleLocked(starting, configChanges); 2208580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner } 2209580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner } 2210580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner // Now do back stacks. 2211580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2212580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2213580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner if (!isFrontStack(stack)) { 2214580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner stack.ensureActivitiesVisibleLocked(starting, configChanges, showHomeBehindStack); 2215580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner } 22168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 22198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void scheduleDestroyAllActivities(ProcessRecord app, String reason) { 22208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 22218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 22228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 22238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner stack.scheduleDestroyActivities(app, false, reason); 22248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 22278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean switchUserLocked(int userId, UserStartedState uss) { 22282420ead0326bfd2587da6231be419e758dba1930Craig Mautner mCurrentUser = userId; 2229ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 2230ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner final String homePackageName = mService.getHomePackageName(); 2231ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (homePackageName != null) { 2232ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner setHomePackageName(mCurrentUser, homePackageName); 22338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2234858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 2235858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mStartingUsers.add(uss); 2236ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner boolean haveActivities = false; 2237ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2238ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner haveActivities |= mStacks.get(stackNdx).switchUserLocked(userId); 2239ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 2240858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 2241858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner resumeTopActivitiesLocked(); 2242858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 22438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return haveActivities; 22442219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 22452219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 2246de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) { 2247de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner int N = mStoppingActivities.size(); 2248de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (N <= 0) return null; 2249de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2250de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ArrayList<ActivityRecord> stops = null; 2251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2252de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final boolean nowVisible = allResumedActivitiesVisible(); 2253de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int i=0; i<N; i++) { 2254de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord s = mStoppingActivities.get(i); 2255de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 2256de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + nowVisible + " waitingVisible=" + s.waitingVisible 2257de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + " finishing=" + s.finishing); 2258de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.waitingVisible && nowVisible) { 2259de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mWaitingVisibleActivities.remove(s); 2260de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner s.waitingVisible = false; 2261de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.finishing) { 2262de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // If this activity is finishing, it is sitting on top of 2263de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // everyone else but we now know it is no longer needed... 2264de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // so get rid of it. Otherwise, we need to go through the 2265de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // normal flow and hide it once we determine that it is 2266de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // hidden by the activities in front of it. 2267de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 2268ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.setAppVisibility(s.appToken, false); 2269de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2270de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2271de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) { 2272de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 2273de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stops == null) { 2274de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops = new ArrayList<ActivityRecord>(); 2275de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2276de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops.add(s); 2277de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStoppingActivities.remove(i); 2278de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner N--; 2279de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner i--; 2280de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2281de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2282de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2283de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return stops; 2284de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2285de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2286cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner void validateTopActivitiesLocked() { 2287cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner for (int stackNdx = mStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2288cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner final ActivityStack stack = mStacks.get(stackNdx); 2289cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner final ActivityRecord r = stack.topRunningActivityLocked(null); 2290f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityState state = r == null ? ActivityState.DESTROYED : r.state; 2291cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (isFrontStack(stack)) { 2292cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (r == null) { 2293cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: null top activity, stack=" + stack); 2294cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 2295f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord pausing = stack.mPausingActivity; 2296f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (pausing != null && pausing == r) { 2297cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r + 2298f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2299cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2300f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) { 2301cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r + 2302f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2303cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2304cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2305cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 2306f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord resumed = stack.mResumedActivity; 2307f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (resumed != null && resumed == r) { 2308cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r + 2309f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2310cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2311f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (r != null && (state == ActivityState.INITIALIZING 2312f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner || state == ActivityState.RESUMED)) { 2313cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in back resumed r=" + r + 2314f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2315cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2316cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2317cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2318cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2319cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 232076ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner private static String stackStateToString(int stackState) { 232176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner switch (stackState) { 232276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner case STACK_STATE_HOME_IN_FRONT: return "STACK_STATE_HOME_IN_FRONT"; 232376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner case STACK_STATE_HOME_TO_BACK: return "STACK_STATE_HOME_TO_BACK"; 232476ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner case STACK_STATE_HOME_IN_BACK: return "STACK_STATE_HOME_IN_BACK"; 232576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner case STACK_STATE_HOME_TO_FRONT: return "STACK_STATE_HOME_TO_FRONT"; 232676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner default: return "Unknown stackState=" + stackState; 232776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner } 232876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner } 232976ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner 2330270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner public void dump(PrintWriter pw, String prefix) { 2331270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity:"); 2332270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner pw.println(mDismissKeyguardOnNextActivity); 233376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner pw.print(prefix); pw.print("mStackState="); pw.println(stackStateToString(mStackState)); 23347ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.print(prefix); pw.println("mSleepTimeout: " + mSleepTimeout); 23357ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.print(prefix); pw.println("mCurTaskId: " + mCurTaskId); 2336ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner pw.print(prefix); pw.print("mHomePackageNames:"); 2337ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner for (int i = 0; i < mHomePackageNames.size(); ++i) { 2338ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner pw.print(" ("); pw.print(mHomePackageNames.keyAt(i)); pw.print(","); 2339ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner pw.print(mHomePackageNames.valueAt(i)); pw.print(")"); 2340ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 2341ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner pw.println(); 2342270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 23438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 234420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { 2345ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return getFocusedStack().getDumpActivitiesLocked(name); 234620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 234720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 2348390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage, 2349390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean needSep, String prefix) { 2350390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (activity != null) { 2351390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (dumpPackage == null || dumpPackage.equals(activity.packageName)) { 2352390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (needSep) { 2353390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(); 2354390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2355390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.print(prefix); 2356390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(activity); 23577ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return true; 2358390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2359390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 23607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return false; 2361390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2362390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn 23638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 23648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpClient, String dumpPackage) { 23657ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean printed = false; 23667ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean needSep = false; 23678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final int numStacks = mStacks.size(); 23688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 23698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = mStacks.get(stackNdx); 23707ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn StringBuilder stackHeader = new StringBuilder(128); 23717ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn stackHeader.append(" Stack #"); 23727ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn stackHeader.append(mStacks.indexOf(stack)); 23737ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn stackHeader.append(":"); 23747ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, needSep, 23757ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn stackHeader.toString()); 23767ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, " ", "Run", false, !dumpAll, 23777ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Running activities (most recent first):", null); 23787ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn 23797ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn needSep = printed; 23807ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep, 2381390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " mPausingActivity: "); 23827ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (pr) { 23837ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed = true; 23847ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn needSep = false; 23857ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 23867ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep, 2387390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " mResumedActivity: "); 23887ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (pr) { 23897ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed = true; 23907ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn needSep = false; 23917ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 23928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpAll) { 23937ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep, 2394390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn " mLastPausedActivity: "); 23957ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (pr) { 23967ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed = true; 23970f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner needSep = true; 23987ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 23990f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage, 24000f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner needSep, " mLastNoHistoryActivity: "); 24018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24027ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn needSep = printed; 24038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 24057ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mFinishingActivities, " ", "Fin", false, !dumpAll, 24067ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to finish:", null); 24077ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mStoppingActivities, " ", "Stop", false, !dumpAll, 24087ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to stop:", null); 24097ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, " ", "Wait", false, !dumpAll, 24107ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting for another to become visible:", 24117ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn null); 24127ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 24137ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 24147ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 24157ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 2416de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 24177ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return printed; 24188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2420390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, 24218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner String prefix, String label, boolean complete, boolean brief, boolean client, 24227ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn String dumpPackage, boolean needNL, String header1, String header2) { 24238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord lastTask = null; 2424390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String innerPrefix = null; 2425390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String[] args = null; 2426390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean printed = false; 24278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int i=list.size()-1; i>=0; i--) { 24288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityRecord r = list.get(i); 24298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpPackage != null && !dumpPackage.equals(r.packageName)) { 24308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner continue; 24318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2432390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (innerPrefix == null) { 2433390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn innerPrefix = prefix + " "; 2434390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn args = new String[0]; 2435390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2436390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn printed = true; 24378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final boolean full = !brief && (complete || !r.isInHistory()); 24388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (needNL) { 2439390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(""); 24408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = false; 24418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24427ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header1 != null) { 24437ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header1); 24447ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header1 = null; 24457ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 24467ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header2 != null) { 24477ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header2); 24487ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header2 = null; 2449390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 24508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask != r.task) { 24518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask = r.task; 24528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); 24538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(full ? "* " : " "); 24548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask); 24558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 24568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask.dump(pw, prefix + " "); 24578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 24588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 24598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask.intent != null) { 24608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(" "); 24618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask.intent.toInsecureStringWithClip()); 24628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(full ? " * " : " "); pw.print(label); 24668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(" #"); pw.print(i); pw.print(": "); 24678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(r); 24688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 24698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.dump(pw, innerPrefix); 24708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 24718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 24728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.intent.toInsecureString()); 24738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (r.app != null) { 24748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.app); 24758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (client && r.app != null && r.app.thread != null) { 24788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // flush anything that is already in the PrintWriter since the thread is going 24798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // to write to the file descriptor directly 24808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.flush(); 24818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 24828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TransferPipe tp = new TransferPipe(); 24838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 24848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(), 24858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.appToken, innerPrefix, args); 24868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Short timeout, since blocking here can 24878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // deadlock with the application. 24888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.go(fd, 2000); 24898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } finally { 24908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.kill(); 24918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (IOException e) { 24938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Failure while dumping the activity: " + e); 24948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (RemoteException e) { 24958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Got a RemoteException while dumping the activity"); 24968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = true; 24988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2500390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn return printed; 25018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2502ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 2503f333327782e14688e1c198c1192172d51308e90bCraig Mautner void scheduleIdleTimeoutLocked(ActivityRecord next) { 2504b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4)); 2505c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next); 2506c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 2507f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2508f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2509f333327782e14688e1c198c1192172d51308e90bCraig Mautner final void scheduleIdleLocked() { 251005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mHandler.sendEmptyMessage(IDLE_NOW_MSG); 2511f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2512f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2513f333327782e14688e1c198c1192172d51308e90bCraig Mautner void removeTimeoutsForActivityLocked(ActivityRecord r) { 2514b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4)); 2515f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 2516f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2517f333327782e14688e1c198c1192172d51308e90bCraig Mautner 251805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner final void scheduleResumeTopActivities() { 251905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 252005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 252105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 25220eea92c67b292b005c152641a12b920fe145826cCraig Mautner void removeSleepTimeouts() { 25230eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = false; 25240eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 25250eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 25260eea92c67b292b005c152641a12b920fe145826cCraig Mautner 25270eea92c67b292b005c152641a12b920fe145826cCraig Mautner final void scheduleSleepTimeout() { 25280eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 25290eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT); 25300eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 25310eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2532ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner private final class ActivityStackSupervisorHandler extends Handler { 2533f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2534ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public ActivityStackSupervisorHandler(Looper looper) { 2535ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner super(looper); 2536ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2537ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 2538f333327782e14688e1c198c1192172d51308e90bCraig Mautner void activityIdleInternal(ActivityRecord r) { 2539f333327782e14688e1c198c1192172d51308e90bCraig Mautner synchronized (mService) { 2540f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternalLocked(r != null ? r.appToken : null, true, null); 2541f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 25427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 25437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 2544ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner @Override 2545ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public void handleMessage(Message msg) { 2546ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner switch (msg.what) { 2547f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_TIMEOUT_MSG: { 25485eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj); 2549f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mService.mDidDexOpt) { 2550f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.mDidDexOpt = false; 2551f333327782e14688e1c198c1192172d51308e90bCraig Mautner Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 2552f333327782e14688e1c198c1192172d51308e90bCraig Mautner nmsg.obj = msg.obj; 2553f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 2554f333327782e14688e1c198c1192172d51308e90bCraig Mautner return; 2555f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2556f333327782e14688e1c198c1192172d51308e90bCraig Mautner // We don't at this point know if the activity is fullscreen, 2557f333327782e14688e1c198c1192172d51308e90bCraig Mautner // so we need to be conservative and assume it isn't. 2558f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 2559f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 2560f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_NOW_MSG: { 25615eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj); 2562f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 2563f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 256405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner case RESUME_TOP_ACTIVITY_MSG: { 256505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner synchronized (mService) { 256605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 256705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 256805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } break; 25690eea92c67b292b005c152641a12b920fe145826cCraig Mautner case SLEEP_TIMEOUT_MSG: { 25700eea92c67b292b005c152641a12b920fe145826cCraig Mautner synchronized (mService) { 25710eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.isSleepingOrShuttingDown()) { 25720eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Sleep timeout! Sleeping now."); 25730eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 25740eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 25750eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 25760eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 25770eea92c67b292b005c152641a12b920fe145826cCraig Mautner } break; 25787ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner case LAUNCH_TIMEOUT_MSG: { 25797ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mService.mDidDexOpt) { 25807ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mDidDexOpt = false; 25817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 25827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return; 25837ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 25847ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner synchronized (mService) { 25857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 25867ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 25877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER 25887ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner && Binder.getCallingUid() != Process.myUid()) { 25897ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 25907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 25917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 25927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 25937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 25947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } break; 2595ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2596ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2597ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2598858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 2599ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner String getHomePackageName() { 2600ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mHomePackageNames.get(mCurrentUser); 2601ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 2602858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 2603ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner void setHomePackageName(int userId, String homePackageName) { 2604ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_SWITCH) Slog.d(TAG, "setHomePackageName: user=" + userId + " package=" 2605ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner + homePackageName); 2606ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mHomePackageNames.put(userId, homePackageName); 2607858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 2608270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner} 2609