ActivityStackSupervisor.java revision a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bd
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; 34e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautnerimport static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE; 35e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautnerimport static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE; 36e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautnerimport static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE; 378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 382420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity; 3923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager; 40ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.app.ActivityManager.StackInfo; 4123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions; 4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals; 434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainer; 444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainerCallback; 45ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager; 4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread; 4723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent; 4820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo; 4923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult; 502420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo; 5123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName; 522219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context; 5323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender; 542219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent; 5523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender; 562219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo; 5723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo; 5823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager; 5923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo; 6023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration; 614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.graphics.Point; 624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager; 634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager.DisplayListener; 644504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.DisplayManagerGlobal; 654504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.VirtualDisplay; 66ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManager; 67ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManagerInternal; 6823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder; 698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle; 70b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug; 71ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler; 7223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder; 732219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper; 742420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message; 7523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor; 760eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport android.os.PowerManager; 777ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautnerimport android.os.Process; 788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException; 7923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock; 806170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle; 8191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionSession; 822420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog; 838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog; 844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseArray; 852219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseIntArray; 87ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.view.Display; 884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.view.DisplayInfo; 89ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.view.InputEvent; 904504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.view.Surface; 9123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity; 9291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor; 93cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe; 94ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport com.android.server.LocalServices; 956170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport com.android.server.am.ActivityManagerService.PendingActivityLaunch; 962420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState; 97ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService; 9823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor; 1008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException; 101270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter; 1022219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList; 1038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List; 104270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 1054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerpublic final class ActivityStackSupervisor implements DisplayListener { 106de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG = ActivityManagerService.DEBUG || false; 107de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG_ADD_REMOVE = DEBUG || false; 108de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG_APP = DEBUG || false; 109de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG_SAVED_STATE = DEBUG || false; 110a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner static final boolean DEBUG_STATES = DEBUG || false; 111b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner static final boolean DEBUG_IDLE = DEBUG || false; 1122420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1132219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner public static final int HOME_STACK_ID = 0; 114270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 115f333327782e14688e1c198c1192172d51308e90bCraig Mautner /** How long we wait until giving up on the last activity telling us it is idle. */ 116f333327782e14688e1c198c1192172d51308e90bCraig Mautner static final int IDLE_TIMEOUT = 10*1000; 117f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1180eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** How long we can hold the sleep wake lock before giving up. */ 1190eea92c67b292b005c152641a12b920fe145826cCraig Mautner static final int SLEEP_TIMEOUT = 5*1000; 1200eea92c67b292b005c152641a12b920fe145826cCraig Mautner 1217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // How long we can hold the launch wake lock before giving up. 1227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner static final int LAUNCH_TIMEOUT = 10*1000; 1237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 12405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG; 12505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1; 12605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2; 1270eea92c67b292b005c152641a12b920fe145826cCraig Mautner static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3; 1287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4; 1294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5; 1304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6; 1314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7; 132e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8; 1334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 1344504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay"; 1357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 1367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // For debugging to make sure the caller when acquiring/releasing our 1377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // wake lock is the system process. 1387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner static final boolean VALIDATE_WAKE_LOCK_CALLER = false; 139f333327782e14688e1c198c1192172d51308e90bCraig Mautner 140270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner final ActivityManagerService mService; 141270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 142ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStackSupervisorHandler mHandler; 143ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 144ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner /** Short cut */ 145ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner WindowManagerService mWindowManager; 1464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner DisplayManager mDisplayManager; 147ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 148270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner /** Dismiss the keyguard after the next activity is displayed? */ 1495314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner boolean mDismissKeyguardOnNextActivity = false; 150270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 1518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** Identifier counter for all ActivityStacks */ 152d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner private int mLastStackId = HOME_STACK_ID; 1538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** Task identifier that activities are currently being started in. Incremented each time a 1558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * new task is created. */ 1568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner private int mCurTaskId = 0; 1578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1582420ead0326bfd2587da6231be419e758dba1930Craig Mautner /** The current user */ 1592420ead0326bfd2587da6231be419e758dba1930Craig Mautner private int mCurrentUser; 1602420ead0326bfd2587da6231be419e758dba1930Craig Mautner 161e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner /** The stack containing the launcher app. Assumed to always be attached to 162e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner * Display.DEFAULT_DISPLAY. */ 1632219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner private ActivityStack mHomeStack; 16420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 165e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner /** The stack currently receiving input or launching the next activity. */ 16629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner private ActivityStack mFocusedStack; 1678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** If this is the same as mFocusedStack then the activity on the top of the focused stack has 1694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner * been resumed. If stacks are changing position this will hold the old stack until the new 170e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner * stack becomes resumed after which it will be set to mFocusedStack. */ 1714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner private ActivityStack mLastFocusedStack; 172de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 173de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner /** List of activities that are waiting for a new activity to become visible before completing 174de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner * whatever operation they are supposed to do. */ 175de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>(); 176de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 177ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner /** List of processes waiting to find out about the next visible activity. */ 178ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible = 179ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner new ArrayList<IActivityManager.WaitResult>(); 180ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 181ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner /** List of processes waiting to find out about the next launched activity. */ 182ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched = 183ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner new ArrayList<IActivityManager.WaitResult>(); 184ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 185de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner /** List of activities that are ready to be stopped, but waiting for the next activity to 186de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner * settle down before doing so. */ 187de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>(); 188de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 189f333327782e14688e1c198c1192172d51308e90bCraig Mautner /** List of activities that are ready to be finished, but waiting for the previous activity to 190f333327782e14688e1c198c1192172d51308e90bCraig Mautner * settle down before doing so. It contains ActivityRecord objects. */ 191f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>(); 192f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1930eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** List of activities that are in the process of going to sleep. */ 1940eea92c67b292b005c152641a12b920fe145826cCraig Mautner final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>(); 1950eea92c67b292b005c152641a12b920fe145826cCraig Mautner 196f333327782e14688e1c198c1192172d51308e90bCraig Mautner /** Used on user changes */ 197f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>(); 198f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1991a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani /** Used to queue up any background users being started */ 2001a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani final ArrayList<UserStartedState> mStartingBackgroundUsers = new ArrayList<UserStartedState>(); 2011a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani 202de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity 203de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner * is being brought in front of us. */ 204de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean mUserLeaving = false; 205de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2060eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** Set when we have taken too long waiting to go to sleep. */ 2070eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean mSleepTimeout = false; 2080eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2090eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** 2107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * We don't want to allow the device to go to sleep while in the process 2117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * of launching an activity. This is primarily to allow alarm intent 2127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * receivers to launch an activity and get that to run before the device 2137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * goes back to sleep. 2147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner */ 2157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner final PowerManager.WakeLock mLaunchingActivity; 2167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 2177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner /** 2180eea92c67b292b005c152641a12b920fe145826cCraig Mautner * Set when the system is going to sleep, until we have 2190eea92c67b292b005c152641a12b920fe145826cCraig Mautner * successfully paused the current activity and released our wake lock. 2200eea92c67b292b005c152641a12b920fe145826cCraig Mautner * At that point the system is allowed to actually sleep. 2210eea92c67b292b005c152641a12b920fe145826cCraig Mautner */ 2220eea92c67b292b005c152641a12b920fe145826cCraig Mautner final PowerManager.WakeLock mGoingToSleep; 2230eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2244f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner /** Stack id of the front stack when user switched, indexed by userId. */ 2254f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner SparseIntArray mUserStackInFront = new SparseIntArray(2); 22693529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner 2274504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner // TODO: Add listener for removal of references. 2284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */ 229f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>(); 2304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 2314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Mapping from displayId to display current state */ 232f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private final SparseArray<ActivityDisplay> mActivityDisplays = 233f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner new SparseArray<ActivityDisplay>(); 2344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 235ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown InputManagerInternal mInputManagerInternal; 236ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown 237aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner /** If non-null then the task specified remains in front and no other tasks may be started 238aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner * until the task exits or #stopLockTaskMode() is called. */ 239aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner private TaskRecord mLockTaskModeTask; 240aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 2414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public ActivityStackSupervisor(ActivityManagerService service) { 242270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mService = service; 2434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE); 2440eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 2454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper()); 2467ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 2477ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 2487ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 2497ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity = 2507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 2517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.setReferenceCounted(false); 2522219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 2532219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 254ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void setWindowManager(WindowManagerService wm) { 2554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 2564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager = wm; 2574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 2584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplayManager = 2594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner (DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE); 2604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplayManager.registerDisplayListener(this, null); 2614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 2624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner Display[] displays = mDisplayManager.getDisplays(); 2634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) { 2644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int displayId = displays[displayNdx].getDisplayId(); 265e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = new ActivityDisplay(displayId); 266e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplays.put(displayId, activityDisplay); 2674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 2684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 269f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner createStackOnDisplay(HOME_STACK_ID, Display.DEFAULT_DISPLAY); 2704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHomeStack = mFocusedStack = mLastFocusedStack = getStack(HOME_STACK_ID); 271ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown 272ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); 2734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 274270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 275270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 276270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner void dismissKeyguard() { 2775314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(""); 278270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner if (mDismissKeyguardOnNextActivity) { 279270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mDismissKeyguardOnNextActivity = false; 280ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.dismissKeyguard(); 281270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 282270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 283270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 284ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack getFocusedStack() { 2854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return mFocusedStack; 28620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 28720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 288de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack getLastStack() { 2894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return mLastFocusedStack; 2902219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 2912219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 2924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // TODO: Split into two methods isFrontStack for any visible stack and isFrontmostStack for the 2934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // top of all visible stacks. 294de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean isFrontStack(ActivityStack stack) { 295df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner final ActivityRecord parent = stack.mActivityContainer.mParentActivity; 296df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (parent != null) { 297df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner stack = parent.task.stack; 298df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 299e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = stack.mStacks; 3004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stacks != null && !stacks.isEmpty()) { 3014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return stack == stacks.get(stacks.size() - 1); 3024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 30420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 30520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 306de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner void moveHomeStack(boolean toFront) { 307e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mHomeStack.mStacks; 3084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int topNdx = stacks.size() - 1; 3094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (topNdx <= 0) { 3104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return; 3114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStack topStack = stacks.get(topNdx); 3134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final boolean homeInFront = topStack == mHomeStack; 3144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (homeInFront != toFront) { 3154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mLastFocusedStack = topStack; 3164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.remove(mHomeStack); 3174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.add(toFront ? topNdx : 0, mHomeStack); 3184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mFocusedStack = stacks.get(topNdx); 3194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: topStack old=" + topStack + " new=" 3204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner + mFocusedStack); 321de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 322de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 323de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 324e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner void moveHomeStackTaskToTop(int homeStackTaskType) { 325e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { 326e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner mWindowManager.showRecentApps(); 327e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner return; 328e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner } 32969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner moveHomeStack(true); 330e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner mHomeStack.moveHomeStackTaskToTop(homeStackTaskType); 3318e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner } 3328e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner 333e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev) { 334e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { 335e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner mWindowManager.showRecentApps(); 336e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner return false; 337e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner } 338e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner moveHomeStackTaskToTop(homeStackTaskType); 33969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner if (prev != null) { 340e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE); 34169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 342e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner 343a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner ActivityRecord r = mHomeStack.topRunningActivityLocked(null); 344e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner if (r != null && (r.isHomeActivity() || r.isRecentsActivity())) { 345a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner mService.setFocusedActivityLocked(r); 34605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return resumeTopActivitiesLocked(mHomeStack, prev, null); 34769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 34869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner return mService.startHomeActivityLocked(mCurrentUser); 34969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 35069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner 351270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner void setDismissKeyguard(boolean dismiss) { 3525314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(" dismiss=" + dismiss); 353270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mDismissKeyguardOnNextActivity = dismiss; 354270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 355270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 3568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord anyTaskForIdLocked(int id) { 357e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner int numDisplays = mActivityDisplays.size(); 3584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 359e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStack stack = stacks.get(stackNdx); 3624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner TaskRecord task = stack.taskForIdLocked(id); 3634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (task != null) { 3644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return task; 3654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 3698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord isInAnyStackLocked(IBinder token) { 372e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner int numDisplays = mActivityDisplays.size(); 3734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 374e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stacks.get(stackNdx).isInStackLocked(token); 3774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null) { 3784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return r; 3794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 3816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 3826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return null; 3836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 3846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 38521d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner void setNextTaskId(int taskId) { 38621d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner if (taskId > mCurTaskId) { 38721d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner mCurTaskId = taskId; 38821d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner } 38921d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner } 39021d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner 3918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner int getNextTaskId() { 3928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner do { 3938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId++; 3948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (mCurTaskId <= 0) { 3958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId = 1; 3968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } while (anyTaskForIdLocked(mCurTaskId) != null); 3988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return mCurTaskId; 3998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 401de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord resumedAppLocked() { 402ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack stack = getFocusedStack(); 403ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (stack == null) { 404ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return null; 405ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 406de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord resumedActivity = stack.mResumedActivity; 407de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (resumedActivity == null || resumedActivity.app == null) { 408de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resumedActivity = stack.mPausingActivity; 409de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (resumedActivity == null || resumedActivity.app == null) { 410de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resumedActivity = stack.topRunningActivityLocked(null); 411de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 412de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 413de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return resumedActivity; 414de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 415de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 416ed8902d3b5452860d87aaa0ed7fba8abb73fc983Mike Lockwood boolean attachApplicationLocked(ProcessRecord app) throws Exception { 41720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final String processName = app.processName; 4184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner boolean didSomething = false; 419e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 420e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 4214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 4224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 4234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (!isFrontStack(stack)) { 4244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner continue; 4254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 4264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityRecord hr = stack.topRunningActivityLocked(null); 4274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (hr != null) { 4284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (hr.app == null && app.uid == hr.info.applicationInfo.uid 4294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner && processName.equals(hr.processName)) { 4304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner try { 4312c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount if (realStartActivityLocked(hr, app, true, true)) { 4324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner didSomething = true; 4334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 4344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } catch (Exception e) { 4354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner Slog.w(TAG, "Exception in new application when starting activity " 4364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner + hr.intent.getComponent().flattenToShortString(), e); 4374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner throw e; 43820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 43920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 44020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 44120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 44220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 443b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (!didSomething) { 444b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner ensureActivitiesVisibleLocked(null, 0); 445b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner } 44620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return didSomething; 44720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 44820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 44920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean allResumedActivitiesIdle() { 450e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 451e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 4524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 4534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 45434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (!isFrontStack(stack) || stack.numActivities() == 0) { 4554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner continue; 4564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 4574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord resumedActivity = stack.mResumedActivity; 4584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (resumedActivity == null || !resumedActivity.idle) { 45934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STATES) Slog.d(TAG, "allResumedActivitiesIdle: stack=" 46034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner + stack.mStackId + " " + resumedActivity + " not idle"); 4614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 4624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 46320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 46420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 46520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return true; 46620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 46720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 468de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allResumedActivitiesComplete() { 469e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 470e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 4714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 4724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 4734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 4744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stack.mResumedActivity; 4754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null && r.state != ActivityState.RESUMED) { 4764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 4774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 478de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 479de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 480de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 481de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // TODO: Not sure if this should check if all Paused are complete too. 4824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STACK) Slog.d(TAG, 4834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner "allResumedActivitiesComplete: mLastFocusedStack changing from=" + 4844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mLastFocusedStack + " to=" + mFocusedStack); 4854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mLastFocusedStack = mFocusedStack; 486de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return true; 487de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 488de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 489de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allResumedActivitiesVisible() { 490e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 491e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 4924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 4934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 4944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stack.mResumedActivity; 4954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null && (!r.nowVisible || r.waitingVisible)) { 4964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 4974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 498de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 499de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 500de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return true; 501de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 502de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 5032acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner /** 5042acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner * Pause all activities in either all of the stacks or just the back stacks. 5052acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving(). 5062acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner * @return true if any activity was paused as a result of this call. 5072acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner */ 5085314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner boolean pauseBackStacks(boolean userLeaving) { 509cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner boolean someActivityPaused = false; 510e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 511e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 5124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 5144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (!isFrontStack(stack) && stack.mResumedActivity != null) { 5154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack + 5164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mResumedActivity=" + stack.mResumedActivity); 5174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.startPausingLocked(userLeaving, false); 5184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner someActivityPaused = true; 5194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 520cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 521cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 522cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner return someActivityPaused; 523cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 524cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 525de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allPausedActivitiesComplete() { 526ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner boolean pausing = true; 527e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 528e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 5294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 5314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stack.mPausingActivity; 5324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null && r.state != ActivityState.PAUSED 5334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner && r.state != ActivityState.STOPPED 5344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner && r.state != ActivityState.STOPPING) { 5354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STATES) { 5364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state); 5374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pausing = false; 5384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } else { 5394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 5404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 541ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 542de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 543de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 544ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return pausing; 545de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 546de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 547df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping) { 5488a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock // TODO: Put all stacks in supervisor and iterate through them instead. 549df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 550df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 551df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 552df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner final ActivityStack stack = stacks.get(stackNdx); 553df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (stack.mResumedActivity != null && 554df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner stack.mActivityContainer.mParentActivity == parent) { 555df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner stack.startPausingLocked(userLeaving, uiSleeping); 556df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 557df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 558df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 559df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 560df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 561ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void reportActivityVisibleLocked(ActivityRecord r) { 562858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) { 563ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner WaitResult w = mWaitingActivityVisible.get(i); 564ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.timeout = false; 565ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (r != null) { 566ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.who = new ComponentName(r.info.packageName, r.info.name); 567ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 568ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 569ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.thisTime = w.totalTime; 570ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 571ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mService.notifyAll(); 572ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner dismissKeyguard(); 573ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 574ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 575ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 576ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner long thisTime, long totalTime) { 577ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) { 578c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner WaitResult w = mWaitingActivityLaunched.remove(i); 579ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.timeout = timeout; 580ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (r != null) { 581ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.who = new ComponentName(r.info.packageName, r.info.name); 582ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 583ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.thisTime = thisTime; 584ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner w.totalTime = totalTime; 585ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 586ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mService.notifyAll(); 587ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 588ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 58929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner ActivityRecord topRunningActivityLocked() { 5901602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner final ActivityStack focusedStack = getFocusedStack(); 5911602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner ActivityRecord r = focusedStack.topRunningActivityLocked(null); 5921602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner if (r != null) { 5931602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner return r; 59429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 5951602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner 5964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // Return to the home stack. 597e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mHomeStack.mStacks; 5984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 600ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (stack != focusedStack && isFrontStack(stack)) { 60129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner r = stack.topRunningActivityLocked(null); 60229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r != null) { 60329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return r; 60429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 60529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 60629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 60729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return null; 60829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 60929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner 61009233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn void getTasksLocked(int maxNum, List<RunningTaskInfo> list, int callingUid, boolean allowed) { 611c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner // Gather all of the running tasks for each stack into runningTaskLists. 6124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<ArrayList<RunningTaskInfo>> runningTaskLists = 6134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner new ArrayList<ArrayList<RunningTaskInfo>>(); 614e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final int numDisplays = mActivityDisplays.size(); 6154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 616e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 6174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 6184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 6194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>(); 6204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner runningTaskLists.add(stackTaskList); 62109233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn stack.getTasksLocked(stackTaskList, callingUid, allowed); 62220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 62320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 624c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner 625c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner // The lists are already sorted from most recent to oldest. Just pull the most recent off 626c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner // each list and add it to list. Stop when all lists are empty or maxNum reached. 627c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner while (maxNum > 0) { 628c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner long mostRecentActiveTime = Long.MIN_VALUE; 629c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner ArrayList<RunningTaskInfo> selectedStackList = null; 6304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numTaskLists = runningTaskLists.size(); 6314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numTaskLists; ++stackNdx) { 6324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists.get(stackNdx); 633c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner if (!stackTaskList.isEmpty()) { 634c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner final long lastActiveTime = stackTaskList.get(0).lastActiveTime; 635c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner if (lastActiveTime > mostRecentActiveTime) { 636c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner mostRecentActiveTime = lastActiveTime; 637c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner selectedStackList = stackTaskList; 638c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 639c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 640c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 641c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner if (selectedStackList != null) { 642c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner list.add(selectedStackList.remove(0)); 643c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner --maxNum; 644c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } else { 645c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner break; 646c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 647c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 64820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 64920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 65023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags, 65123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner String profileFile, ParcelFileDescriptor profileFd, int userId) { 65223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 65323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo; 65423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 65523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ResolveInfo rInfo = 65623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner AppGlobals.getPackageManager().resolveIntent( 65723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent, resolvedType, 65823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner PackageManager.MATCH_DEFAULT_ONLY 65923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | ActivityManagerService.STOCK_PM_FLAGS, userId); 66023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = rInfo != null ? rInfo.activityInfo : null; 66123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (RemoteException e) { 66223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = null; 66323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 66423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 66523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null) { 66623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Store the found target back into the intent, because now that 66723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // we have it we never want to do this again. For example, if the 66823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // user navigates back to this point in the history, we should 66923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // always restart the exact same activity. 67023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent.setComponent(new ComponentName( 67123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo.applicationInfo.packageName, aInfo.name)); 67223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 67323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't debug things in the system process 67423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) { 67523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 67623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setDebugApp(aInfo.processName, true, false); 67723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 67823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 67923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 68023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) { 68123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 68223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName); 68323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 68423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 68523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 68623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (profileFile != null) { 68723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 68823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, 68923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner profileFile, profileFd, 69023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (startFlags&ActivityManager.START_FLAG_AUTO_STOP_PROFILER) != 0); 69123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 69223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 69323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 69423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return aInfo; 69523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 69623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 6972219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner void startHomeActivity(Intent intent, ActivityInfo aInfo) { 698e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE); 69991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null, 0, 700e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner null, false, null, null); 7018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 7028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 70323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final int startActivityMayWait(IApplicationThread caller, int callingUid, 70491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn String callingPackage, Intent intent, String resolvedType, 70591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 70691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IBinder resultTo, String resultWho, int requestCode, int startFlags, String profileFile, 70723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ParcelFileDescriptor profileFd, WaitResult outResult, Configuration config, 708e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner Bundle options, int userId, IActivityContainer iContainer) { 70923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Refuse possible leaked file descriptors 71023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent != null && intent.hasFileDescriptors()) { 71123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("File descriptors passed in Intent"); 71223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 71323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner boolean componentSpecified = intent.getComponent() != null; 71423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 71523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't modify the client's object! 71623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = new Intent(intent); 71723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 71823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 71923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags, 72023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner profileFile, profileFd, userId); 72123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 722e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityContainer container = (ActivityContainer)iContainer; 72323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner synchronized (mService) { 72423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int callingPid; 72523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callingUid >= 0) { 72623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = -1; 72723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (caller == null) { 72823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 72923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 73023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 73123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = callingUid = -1; 73223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 73323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 734e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityStack stack; 735e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (container == null || container.mStack.isOnHomeDisplay()) { 736e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner stack = getFocusedStack(); 737e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } else { 738e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner stack = container.mStack; 739e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 740de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stack.mConfigWillChange = config != null 74123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner && mService.mConfiguration.diff(config) != 0; 74223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, 743de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner "Starting activity when config will change = " + stack.mConfigWillChange); 74423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 74523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final long origId = Binder.clearCallingIdentity(); 74623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 74723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null && 74823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 74923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // This may be a heavy-weight process! Check to see if we already 75023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // have another, different heavy-weight process running. 75123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 75223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (mService.mHeavyWeightProcess != null && 75323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 75423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 75523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int realCallingUid = callingUid; 75623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (caller != null) { 75723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 75823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callerApp != null) { 75923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner realCallingUid = callerApp.info.uid; 76023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Slog.w(TAG, "Unable to find app for caller " + caller 76276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner + " (pid=" + callingPid + ") when starting: " 76323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner + intent.toString()); 76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityOptions.abort(options); 76523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return ActivityManager.START_PERMISSION_DENIED; 76623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner IIntentSender target = mService.getIntentSenderLocked( 77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityManager.INTENT_SENDER_ACTIVITY, "android", 77123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner realCallingUid, userId, null, null, 0, new Intent[] { intent }, 77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | PendingIntent.FLAG_ONE_SHOT, null); 77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent newIntent = new Intent(); 77623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (requestCode >= 0) { 77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Caller is requesting a result. 77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 77923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner new IntentSender(target)); 78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (mService.mHeavyWeightProcess.activities.size() > 0) { 78323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 78423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 78523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner hist.packageName); 78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 78723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner hist.task.taskId); 78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo.packageName); 79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.setFlags(intent.getFlags()); 79223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.setClassName("android", 79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner HeavyWeightSwitcherActivity.class.getName()); 79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = newIntent; 79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner resolvedType = null; 79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner caller = null; 79723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 79823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 79923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner componentSpecified = true; 80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ResolveInfo rInfo = 80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner AppGlobals.getPackageManager().resolveIntent( 80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent, null, 80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner PackageManager.MATCH_DEFAULT_ONLY 80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | ActivityManagerService.STOCK_PM_FLAGS, userId); 80623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = rInfo != null ? rInfo.activityInfo : null; 80723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = mService.getActivityInfoForUser(aInfo, userId); 80823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (RemoteException e) { 80923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = null; 81023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 81123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 81323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 81423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 81591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, aInfo, 81691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn voiceSession, voiceInteractor, resultTo, resultWho, 817e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner requestCode, callingPid, callingUid, callingPackage, startFlags, options, 818e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner componentSpecified, null, container); 81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 820de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stack.mConfigWillChange) { 82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // If the caller also wants to switch to a new configuration, 82223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // do so now. This allows a clean switch, as we are waiting 82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // for the current activity to pause (so we will not destroy 82423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // it), and have not yet started the next activity. 82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "updateConfiguration()"); 827de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stack.mConfigWillChange = false; 82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, 82923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "Updating to new configuration after starting activity."); 83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.updateConfigurationLocked(config, null, false, false); 83123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 83223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 83323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Binder.restoreCallingIdentity(origId); 83423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 83523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (outResult != null) { 83623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.result = res; 83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (res == ActivityManager.START_SUCCESS) { 838ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWaitingActivityLaunched.add(outResult); 83923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner do { 84023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 84123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.wait(); 84223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (InterruptedException e) { 84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } while (!outResult.timeout && outResult.who == null); 84523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (res == ActivityManager.START_TASK_TO_FRONT) { 846de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord r = stack.topRunningActivityLocked(null); 84723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (r.nowVisible) { 84823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.timeout = false; 84923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.who = new ComponentName(r.info.packageName, r.info.name); 85023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.totalTime = 0; 85123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.thisTime = 0; 85223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 85323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.thisTime = SystemClock.uptimeMillis(); 854ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWaitingActivityVisible.add(outResult); 85523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner do { 85623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 85723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.wait(); 85823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (InterruptedException e) { 85923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 86023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } while (!outResult.timeout && outResult.who == null); 86123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 86223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 86323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 86423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 86523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return res; 86623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 86723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 86823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 86923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final int startActivities(IApplicationThread caller, int callingUid, String callingPackage, 87023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent[] intents, String[] resolvedTypes, IBinder resultTo, 87123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Bundle options, int userId) { 87223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intents == null) { 87323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new NullPointerException("intents is null"); 87423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 87523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (resolvedTypes == null) { 87623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new NullPointerException("resolvedTypes is null"); 87723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 87823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intents.length != resolvedTypes.length) { 87923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("intents are length different than resolvedTypes"); 88023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 88123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 88223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 88323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int callingPid; 88423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callingUid >= 0) { 88523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = -1; 88623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (caller == null) { 88723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 88823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 88923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 89023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = callingUid = -1; 89123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 89223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final long origId = Binder.clearCallingIdentity(); 89323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 89423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner synchronized (mService) { 89576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner ActivityRecord[] outActivity = new ActivityRecord[1]; 89623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner for (int i=0; i<intents.length; i++) { 89723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent intent = intents[i]; 89823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent == null) { 89923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner continue; 90023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 90123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 90223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Refuse possible leaked file descriptors 90323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent != null && intent.hasFileDescriptors()) { 90423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("File descriptors passed in Intent"); 90523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 90623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 90723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner boolean componentSpecified = intent.getComponent() != null; 90823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 90923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't modify the client's object! 91023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = new Intent(intent); 91123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 91223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 91323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 91423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 0, null, null, userId); 91523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // TODO: New, check if this is correct 91623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = mService.getActivityInfoForUser(aInfo, userId); 91723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 91823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null && 91923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE) 92023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner != 0) { 92123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException( 92223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "FLAG_CANT_SAVE_STATE not supported here"); 92323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 92423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 92523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Bundle theseOptions; 92623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (options != null && i == intents.length-1) { 92723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner theseOptions = options; 92823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 92923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner theseOptions = null; 93023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 9316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int res = startActivityLocked(caller, intent, resolvedTypes[i], 93291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn aInfo, null, null, resultTo, null, -1, callingPid, callingUid, callingPackage, 933e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner 0, theseOptions, componentSpecified, outActivity, null); 93423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (res < 0) { 93523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return res; 93623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 93723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 93823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner resultTo = outActivity[0] != null ? outActivity[0].appToken : null; 93923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 94023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 94123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } finally { 94223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Binder.restoreCallingIdentity(origId); 94323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 94423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 94523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return ActivityManager.START_SUCCESS; 94623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 94723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 9482420ead0326bfd2587da6231be419e758dba1930Craig Mautner final boolean realStartActivityLocked(ActivityRecord r, 9492c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount ProcessRecord app, boolean andResume, boolean checkConfig) 9502420ead0326bfd2587da6231be419e758dba1930Craig Mautner throws RemoteException { 9512420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9522420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.startFreezingScreenLocked(app, 0); 953a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner if (false) Slog.d(TAG, "realStartActivity: setting app visibility true"); 954ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.setAppVisibility(r.appToken, true); 9552420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9562420ead0326bfd2587da6231be419e758dba1930Craig Mautner // schedule launch ticks to collect information about slow apps. 9572420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.startLaunchTickingLocked(); 9582420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9592420ead0326bfd2587da6231be419e758dba1930Craig Mautner // Have the window manager re-evaluate the orientation of 9602420ead0326bfd2587da6231be419e758dba1930Craig Mautner // the screen based on the new activity order. Note that 9612420ead0326bfd2587da6231be419e758dba1930Craig Mautner // as a result of this, it can call back into the activity 9622420ead0326bfd2587da6231be419e758dba1930Craig Mautner // manager with a new orientation. We don't care about that, 9632420ead0326bfd2587da6231be419e758dba1930Craig Mautner // because the activity is not currently running so we are 9642420ead0326bfd2587da6231be419e758dba1930Craig Mautner // just restarting it anyway. 9652420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (checkConfig) { 966ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner Configuration config = mWindowManager.updateOrientationFromAppTokens( 9672420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mConfiguration, 9682420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.mayFreezeScreenLocked(app) ? r.appToken : null); 9692420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.updateConfigurationLocked(config, r, false, false); 9702420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9712420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9722420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.app = app; 9732420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.waitingToKill = null; 9742420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.launchCount++; 9752420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.lastLaunchTime = SystemClock.uptimeMillis(); 9762420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9772420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (localLOGV) Slog.v(TAG, "Launching: " + r); 9782420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9792420ead0326bfd2587da6231be419e758dba1930Craig Mautner int idx = app.activities.indexOf(r); 9802420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (idx < 0) { 9812420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.activities.add(r); 9822420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 983db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn mService.updateLruProcessLocked(app, true, null); 984db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn mService.updateOomAdjLocked(); 9852420ead0326bfd2587da6231be419e758dba1930Craig Mautner 9862420ead0326bfd2587da6231be419e758dba1930Craig Mautner final ActivityStack stack = r.task.stack; 9872420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 9882420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.thread == null) { 9892420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw new RemoteException(); 9902420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9912420ead0326bfd2587da6231be419e758dba1930Craig Mautner List<ResultInfo> results = null; 9922420ead0326bfd2587da6231be419e758dba1930Craig Mautner List<Intent> newIntents = null; 9932420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 9942420ead0326bfd2587da6231be419e758dba1930Craig Mautner results = r.results; 9952420ead0326bfd2587da6231be419e758dba1930Craig Mautner newIntents = r.newIntents; 9962420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 9972420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 9982420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " icicle=" + r.icicle 9992420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " with results=" + results + " newIntents=" + newIntents 10002420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " andResume=" + andResume); 10012420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 10022420ead0326bfd2587da6231be419e758dba1930Craig Mautner EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 10032420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.userId, System.identityHashCode(r), 10042420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.task.taskId, r.shortComponentName); 10052420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 1006ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (r.isHomeActivity() && r.isNotResolverActivity()) { 10074ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner // Home process is the root process of the task. 10084ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner mService.mHomeProcess = r.task.mActivities.get(0).app; 10092420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10102420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 10112420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.sleeping = false; 10122420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.forceNewConfig = false; 10132420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.showAskCompatModeDialogLocked(r); 10142420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 10152420ead0326bfd2587da6231be419e758dba1930Craig Mautner String profileFile = null; 10162420ead0326bfd2587da6231be419e758dba1930Craig Mautner ParcelFileDescriptor profileFd = null; 10172420ead0326bfd2587da6231be419e758dba1930Craig Mautner boolean profileAutoStop = false; 10182420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 10192420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileProc == null || mService.mProfileProc == app) { 10202420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mProfileProc = app; 10212420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFile = mService.mProfileFile; 10222420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = mService.mProfileFd; 10232420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileAutoStop = mService.mAutoStopProfiler; 10242420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10252420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10262420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.hasShownUi = true; 10272420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.pendingUiClean = true; 10282420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 10292420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 10302420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = profileFd.dup(); 10312420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException e) { 10322420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 10332420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 10342420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd.close(); 10352420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException o) { 10362420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10372420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = null; 10382420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10392420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10402420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 1041cfbe9be5b3b701d95fb24fa0f7c8d9be43eec776Adam Powell 1042a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP); 10432420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 10442420ead0326bfd2587da6231be419e758dba1930Craig Mautner System.identityHashCode(r), r.info, 1045a002604af0c9b1204556610537b85685d7055996Craig Mautner new Configuration(mService.mConfiguration), r.compat, r.task.voiceInteractor, 1046a002604af0c9b1204556610537b85685d7055996Craig Mautner app.repProcState, r.icicle, r.persistentState, results, newIntents, !andResume, 1047233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner mService.isNextTransitionForward(), profileFile, profileFd, profileAutoStop 1048233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner ); 10492420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10502420ead0326bfd2587da6231be419e758dba1930Craig Mautner if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 10512420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This may be a heavy-weight process! Note that the package 10522420ead0326bfd2587da6231be419e758dba1930Craig Mautner // manager will ensure that only activity can run in the main 10532420ead0326bfd2587da6231be419e758dba1930Craig Mautner // process of the .apk, which is the only thing that will be 10542420ead0326bfd2587da6231be419e758dba1930Craig Mautner // considered heavy-weight. 10552420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.processName.equals(app.info.packageName)) { 10562420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mHeavyWeightProcess != null 10572420ead0326bfd2587da6231be419e758dba1930Craig Mautner && mService.mHeavyWeightProcess != app) { 10582420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Starting new heavy weight process " + app 10592420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " when already running " 10602420ead0326bfd2587da6231be419e758dba1930Craig Mautner + mService.mHeavyWeightProcess); 10612420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10622420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHeavyWeightProcess = app; 10632420ead0326bfd2587da6231be419e758dba1930Craig Mautner Message msg = mService.mHandler.obtainMessage( 10642420ead0326bfd2587da6231be419e758dba1930Craig Mautner ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 10652420ead0326bfd2587da6231be419e758dba1930Craig Mautner msg.obj = r; 10662420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHandler.sendMessage(msg); 10672420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10682420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10692420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10702420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (RemoteException e) { 10712420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (r.launchFailed) { 10722420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the second time we failed -- finish activity 10732420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and give up. 10742420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.e(TAG, "Second failure launching " 10752420ead0326bfd2587da6231be419e758dba1930Craig Mautner + r.intent.getComponent().flattenToShortString() 10762420ead0326bfd2587da6231be419e758dba1930Craig Mautner + ", giving up", e); 10772420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.appDiedLocked(app, app.pid, app.thread); 10782420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 10792420ead0326bfd2587da6231be419e758dba1930Craig Mautner "2nd-crash", false); 10802420ead0326bfd2587da6231be419e758dba1930Craig Mautner return false; 10812420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10822420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10832420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the first time we failed -- restart process and 10842420ead0326bfd2587da6231be419e758dba1930Craig Mautner // retry. 10852420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.activities.remove(r); 10862420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw e; 10872420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10882420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10892420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.launchFailed = false; 10902420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (stack.updateLRUListLocked(r)) { 10912420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Activity " + r 10922420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " being launched, but already in LRU list"); 10932420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10942420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10952420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 10962420ead0326bfd2587da6231be419e758dba1930Craig Mautner // As part of the process of launching, ActivityThread also performs 10972420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a resume. 10982420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.minimalResumeActivityLocked(r); 10992420ead0326bfd2587da6231be419e758dba1930Craig Mautner } else { 11002420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This activity is not starting in the resumed state... which 11012420ead0326bfd2587da6231be419e758dba1930Craig Mautner // should look like we asked it to pause+stop (but remain visible), 11022420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and it has done so and reported back the current icicle and 11032420ead0326bfd2587da6231be419e758dba1930Craig Mautner // other state. 11042420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 11052420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " (starting in stopped state)"); 11062420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.state = ActivityState.STOPPED; 11072420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.stopped = true; 11082420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11092420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11102420ead0326bfd2587da6231be419e758dba1930Craig Mautner // Launch the new version setup screen if needed. We do this -after- 11112420ead0326bfd2587da6231be419e758dba1930Craig Mautner // launching the initial activity (that is, home), so that it can have 11122420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a chance to initialize itself while in the background, making the 11132420ead0326bfd2587da6231be419e758dba1930Craig Mautner // switch back to it faster and look better. 1114de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (isFrontStack(stack)) { 11152420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.startSetupActivityLocked(); 11162420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11172420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11182420ead0326bfd2587da6231be419e758dba1930Craig Mautner return true; 11192420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11202420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1121e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner void startSpecificActivityLocked(ActivityRecord r, 11222c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount boolean andResume, boolean checkConfig) { 1123e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // Is this activity's application already running? 1124e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner ProcessRecord app = mService.getProcessRecordLocked(r.processName, 11253bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn r.info.applicationInfo.uid, true); 1126e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1127e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner r.task.stack.setLaunchTime(r); 1128e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1129e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner if (app != null && app.thread != null) { 1130e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner try { 1131237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0 1132237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn || !"android".equals(r.info.packageName)) { 1133237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // Don't add this if it is a platform component that is marked 1134237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // to run in multiple processes, because this is actually 1135237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // part of the framework so doesn't make sense to track as a 1136237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // separate apk in the process. 1137237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn app.addPackage(r.info.packageName, mService.mProcessStats); 1138237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn } 11392c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount realStartActivityLocked(r, app, andResume, checkConfig); 1140e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner return; 1141e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } catch (RemoteException e) { 1142e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner Slog.w(TAG, "Exception when starting activity " 1143e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner + r.intent.getComponent().flattenToShortString(), e); 1144e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1145e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1146e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // If a dead object exception was thrown -- fall through to 1147e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // restart the application. 1148e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1149e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1150e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 11513bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn "activity", r.intent.getComponent(), false, false, true); 1152e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1153e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 11546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startActivityLocked(IApplicationThread caller, 115591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Intent intent, String resolvedType, ActivityInfo aInfo, 115691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 115791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IBinder resultTo, String resultWho, int requestCode, 11586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int callingPid, int callingUid, String callingPackage, int startFlags, Bundle options, 1159e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container) { 11606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int err = ActivityManager.START_SUCCESS; 11616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ProcessRecord callerApp = null; 11636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (caller != null) { 11646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callerApp = mService.getRecordForAppLocked(caller); 11656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (callerApp != null) { 11666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingPid = callerApp.pid; 11676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid = callerApp.info.uid; 11686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 11696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, "Unable to find app for caller " + caller 11706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " (pid=" + callingPid + ") when starting: " 11716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + intent.toString()); 11726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_PERMISSION_DENIED; 11736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS) { 11776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; 11786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false) 11799ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner + "} from pid " + (callerApp != null ? callerApp.pid : callingPid) 11809ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner + " on display " + (container == null ? (mFocusedStack == null ? 11819ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner Display.DEFAULT_DISPLAY : mFocusedStack.mDisplayId) : 11829ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner (container.mActivityDisplay == null ? Display.DEFAULT_DISPLAY : 11839ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner container.mActivityDisplay.mDisplayId))); 11846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 11866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord sourceRecord = null; 11876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord resultRecord = null; 11886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultTo != null) { 11896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord = isInAnyStackLocked(resultTo); 11906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (DEBUG_RESULTS) Slog.v( 11916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner TAG, "Will send result to " + resultTo + " " + sourceRecord); 11926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (sourceRecord != null) { 11936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0 && !sourceRecord.finishing) { 11946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord; 11956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 11986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack; 11996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 120091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final int launchFlags = intent.getFlags(); 12016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 12036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner && sourceRecord != null) { 12046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Transfer the result target from the source activity to the new 12056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // one being started, including any failures. 12066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0) { 12076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 12086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 12096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord.resultTo; 12116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultWho = sourceRecord.resultWho; 12126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner requestCode = sourceRecord.requestCode; 12136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord.resultTo = null; 12146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 12156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord.removeResultsLocked( 12166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord, resultWho, requestCode); 12176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12183026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn if (sourceRecord.launchedFromUid == callingUid) { 12193026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // The new activity is being launched from the same uid as the previous 12203026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // activity in the flow, and asking to forward its result back to the 12213026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // previous. In this case the activity is serving as a trampoline between 12223026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // the two, so we also want to update its launchedFromPackage to be the 12233026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // same as the previous activity. Note that this is safe, since we know 12243026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // these two packages come from the same uid; the caller could just as 12253026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // well have supplied that same package name itself. This specifially 12263026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // deals with the case of an intent picker/chooser being launched in the app 12273026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // flow to redirect to an activity picked by the user, where we want the final 12283026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // activity to consider it to have been launched by the previous app activity. 12293026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn callingPackage = sourceRecord.launchedFromPackage; 12303026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn } 12316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { 12346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find a class that can handle the given Intent. 12356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // That's the end of that! 12366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_INTENT_NOT_RESOLVED; 12376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && aInfo == null) { 12406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find the specific class specified in the Intent. 12416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Also the end of the line. 12426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_CLASS_NOT_FOUND; 12436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 124591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (err == ActivityManager.START_SUCCESS && sourceRecord != null 124691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn && sourceRecord.task.voiceSession != null) { 124791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // If this activity is being launched as part of a voice session, we need 124891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // to ensure that it is safe to do so. If the upcoming activity will also 124991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // be part of the voice session, we can only launch it if it has explicitly 125091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // said it supports the VOICE category, or it is a part of the calling app. 125191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) == 0 125291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) { 125391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 125491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(), 125591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn intent, resolvedType)) { 125691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 125791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 125891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 125991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 126091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 126191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 126291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 126391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 126491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (err == ActivityManager.START_SUCCESS && voiceSession != null) { 126591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // If the caller is starting a new voice session, just make sure the target 126691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // is actually allowing it to run this way. 126791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 126891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(), 126991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn intent, resolvedType)) { 127091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 127191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 127291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 127391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 127491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 127591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 127691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 12776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err != ActivityManager.START_SUCCESS) { 12786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 12796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 12806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 12816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 12826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner setDismissKeyguard(false); 12846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 12856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 12866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startAnyPerm = mService.checkPermission( 12896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner START_ANY_ACTIVITY, callingPid, callingUid); 12906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid, 12916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid, aInfo.applicationInfo.uid, aInfo.exported); 12926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) { 12936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 12946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 12956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 12966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 12976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner setDismissKeyguard(false); 12996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner String msg; 13006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (!aInfo.exported) { 13016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 13026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 13036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 13046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " not exported from uid " + aInfo.applicationInfo.uid; 13056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 13066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 13076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 13086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 13096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " requires " + aInfo.permission; 13106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, msg); 13126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner throw new SecurityException(msg); 13136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1315dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid, 1316b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver callingPid, resolvedType, aInfo.applicationInfo); 13175e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver 13186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mController != null) { 13196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner try { 13206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // The Intent we give to the watcher has the extra data 13216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // stripped off, since it can contain private information. 13226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Intent watchIntent = intent.cloneFilter(); 13235e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver abort |= !mService.mController.activityStarting(watchIntent, 13246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner aInfo.applicationInfo.packageName); 13256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } catch (RemoteException e) { 13266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mController = null; 13276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13285e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver } 13296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13305e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (abort) { 13315e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (resultRecord != null) { 13325e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, 13336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 13346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13355e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // We pretend to the caller that it was really started, but 13365e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // they will just get a cancel result. 13375e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver setDismissKeyguard(false); 13385e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver ActivityOptions.abort(options); 13395e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver return ActivityManager.START_SUCCESS; 13406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage, 1343e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho, 1344233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner requestCode, componentSpecified, this, container, options); 13456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (outActivity != null) { 13466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner outActivity[0] = r; 13476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1349ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = getFocusedStack(); 135091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (voiceSession == null && (stack.mResumedActivity == null 135191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn || stack.mResumedActivity.info.applicationInfo.uid != callingUid)) { 13526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, "Activity start")) { 13536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner PendingActivityLaunch pal = 1354de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner new PendingActivityLaunch(r, sourceRecord, startFlags, stack); 13556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mPendingActivityLaunches.add(pal); 13566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner setDismissKeyguard(false); 13576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 13586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_SWITCHES_CANCELED; 13596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mDidAppSwitch) { 13636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // This is the second allowed switch since we stopped switches, 13646170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // so now just generally allow switches. Use case: user presses 13656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // home (switches disabled, switch to home, mDidAppSwitch now true); 13666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // user taps a home icon (coming from home so allowed, we hit here 13676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // and now allow anyone to switch again). 13686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mAppSwitchesAllowedTime = 0; 13696170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 13706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mDidAppSwitch = true; 13716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.doPendingActivityLaunchesLocked(false); 13746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 137591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor, 137691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn startFlags, true, options); 137710385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner 137810385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner if (allPausedActivitiesComplete()) { 137910385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner // If someone asked to have the keyguard dismissed on the next 13806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // activity start, but we are not actually doing an activity 13816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // switch... just dismiss the keyguard now, because we 13826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // probably want to see whatever is behind it. 13836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner dismissKeyguard(); 13846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 13866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1388ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityStack adjustStackFocus(ActivityRecord r) { 13891d001b670e34fe887488047f525a5430154626e1Craig Mautner final TaskRecord task = r.task; 13901d001b670e34fe887488047f525a5430154626e1Craig Mautner if (r.isApplicationActivity() || (task != null && task.isApplicationTask())) { 1391ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (task != null) { 1392d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner final ActivityStack taskStack = task.stack; 1393e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (taskStack.isOnHomeDisplay()) { 1394e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mFocusedStack != taskStack) { 1395e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: Setting " + 1396e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner "focused stack to r=" + r + " task=" + task); 1397e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mFocusedStack = taskStack; 1398e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } else { 1399e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1400e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner "adjustStackFocus: Focused stack already=" + mFocusedStack); 1401e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 1402858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1403d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner return taskStack; 1404858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1405ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1406e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityContainer container = r.mInitialActivityContainer; 1407e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (container != null) { 1408e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner // The first time put it on the desired stack, after this put on task stack. 1409e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner r.mInitialActivityContainer = null; 1410e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return container.mStack; 1411e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 1412e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner 14134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (mFocusedStack != mHomeStack) { 1414ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1415ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Have a focused stack=" + mFocusedStack); 1416ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mFocusedStack; 1417de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1418ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1419e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks; 1420e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) { 1421e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityStack stack = homeDisplayStacks.get(stackNdx); 1422e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (!stack.isHomeStack()) { 1423e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1424e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner "adjustStackFocus: Setting focused stack=" + stack); 1425e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mFocusedStack = stack; 1426e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return mFocusedStack; 1427ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 14281d001b670e34fe887488047f525a5430154626e1Craig Mautner } 1429ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 14304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // Need to create an app stack for this user. 1431f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); 1432ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r + 1433ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner " stackId=" + stackId); 1434ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mFocusedStack = getStack(stackId); 143529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return mFocusedStack; 1436de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1437de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mHomeStack; 1438de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1439de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 144029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner void setFocusedStack(ActivityRecord r) { 14414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null) { 144212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner final TaskRecord task = r.task; 144312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner boolean isHomeActivity = !r.isApplicationActivity(); 144412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (!isHomeActivity && task != null) { 144512ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner isHomeActivity = !task.isApplicationTask(); 144612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 144712ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (!isHomeActivity && task != null) { 144812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner final ActivityRecord parent = task.stack.mActivityContainer.mParentActivity; 144912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner isHomeActivity = parent != null && parent.isHomeActivity(); 145012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 14514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner moveHomeStack(isHomeActivity); 145229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 145329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 145429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner 14558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final int startActivityUncheckedLocked(ActivityRecord r, 145691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn ActivityRecord sourceRecord, 145791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, 145891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn boolean doResume, Bundle options) { 14598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final Intent intent = r.intent; 14608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final int callingUid = r.launchedFromUid; 14618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 14628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner int launchFlags = intent.getFlags(); 14638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 14648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We'll invoke onUserLeaving before onPause only if the launching 14658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity did not explicitly state that this is an automated launch. 1466a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner mUserLeaving = (launchFlags & Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 1467de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving); 14688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 14698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has asked not to resume at this point, we make note 14708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of this in the record so that we can skip it when trying to find 14718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the top running activity. 14728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!doResume) { 14738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.delayedResume = true; 14748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 1476a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner ActivityRecord notTop = 1477a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner (launchFlags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null; 14788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 14798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the onlyIfNeeded flag is set, then we can do this if the activity 14808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being launched is the same as the one making the call... or, as 14818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a special case, if we do not know the caller then we count the 14828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current top activity as the caller. 14838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 14848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord checkedCaller = sourceRecord; 14858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (checkedCaller == null) { 1486ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop); 14878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!checkedCaller.realActivity.equals(r.realActivity)) { 14898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Caller is not the same as launcher, so always needed. 14908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED; 14918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 14938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 149441db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner switch (r.info.documentLaunchMode) { 149541db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner case ActivityInfo.DOCUMENT_LAUNCH_NONE: 149641db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner break; 149741db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS: 149841db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner intent.addFlags( 149941db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 1500a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner launchFlags = intent.getFlags(); 150141db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner break; 150241db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING: 150341db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); 1504a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner launchFlags = intent.getFlags(); 150541db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner break; 150641db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner } 1507d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner final boolean newDocument = intent.isDocument(); 15088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (sourceRecord == null) { 15098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This activity is not being started from another... in this 15108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // case we -always- start a new task. 1511d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 151229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner Slog.w(TAG, "startActivity called from non-Activity context; forcing " + 151329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 15148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 15158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 1516d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner } else if (newDocument) { 1517d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if (r.launchMode != ActivityInfo.LAUNCH_MULTIPLE) { 1518d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner Slog.w(TAG, "FLAG_ACTIVITY_NEW_DOCUMENT and launchMode != \"standard\""); 1519d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner r.launchMode = ActivityInfo.LAUNCH_MULTIPLE; 1520d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner } 15218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 15228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The original activity who is starting us is running as a single 15238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // instance... this new activity it is starting must go on its 15248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // own task. 15258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 15268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE 15278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 15288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The activity being started is a single instance... it always 15298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // gets launched into its own task. 15308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 15318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 15338862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner ActivityInfo newTaskInfo = null; 15348862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner Intent newTaskIntent = null; 1535de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ActivityStack sourceStack; 1536de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (sourceRecord != null) { 15372a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (sourceRecord.finishing) { 15382a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn // If the source is finishing, we can't further count it as our source. This 15392a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn // is because the task it is associated with may now be empty and on its way out, 15402a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn // so we don't want to blindly throw it in to that task. Instead we will take 15418862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner // the NEW_TASK flow and try to find a task for it. But save the task information 15428862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner // so it can be used when creating the new task. 1543d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 15442a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn Slog.w(TAG, "startActivity called from finishing " + sourceRecord 15452a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 15462a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 15478862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner newTaskInfo = sourceRecord.info; 15488862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner newTaskIntent = sourceRecord.task.intent; 15492a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn } 15502a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn sourceRecord = null; 15512a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn sourceStack = null; 15522a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn } else { 15532a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn sourceStack = sourceRecord.task.stack; 15542a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn } 1555de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } else { 1556de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner sourceStack = null; 1557de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1558de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 1559d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 15608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For whatever reason this activity is being launched into a new 15618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // task... yet the caller has requested a result back. Well, that 15628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is pretty messed up, so instead immediately send back a cancel 15638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // and let the new task continue launched as normal without a 15648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // dependency on its originator. 15658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 15668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, 15678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.resultTo, r.resultWho, r.requestCode, 15688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner Activity.RESULT_CANCELED, null); 15698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.resultTo = null; 15708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 15718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 15728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean addingToTask = false; 15738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean movedHome = false; 15748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner TaskRecord reuseTask = null; 1575de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack targetStack; 1576d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if (((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 1577d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner (launchFlags & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 15798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 15808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If bring to front is requested, and no result is requested, and 15818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we can find a task that was started with this same 15828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // component, then instead of launching bring that one to the front. 15838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo == null) { 15848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // See if there is a task to bring to the front. If this is 15858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a SINGLE_INSTANCE activity, there can be one and only one 15868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // instance of it in the history, and it is always in its own 15878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // unique task, so we do a special search. 15888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord intentActivity = r.launchMode != ActivityInfo.LAUNCH_SINGLE_INSTANCE 1589ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ? findTaskLocked(r) 15908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner : findActivityLocked(intent, r.info); 15918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity != null) { 1592aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(intentActivity.task)) { 1593aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "moveTaskToFront: Attempt to violate Lock Task Mode"); 1594aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 1595aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 159629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) { 159729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner r.task = intentActivity.task; 159829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 15998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack = intentActivity.task.stack; 16000f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 16012a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack 16022a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + " from " + intentActivity); 1603e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner targetStack.moveToFront(); 16048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.task.intent == null) { 16058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This task was started because of movement of 16068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the activity based on affinity... now that we 16078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // are actually launching it, we can assign the 16088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // base intent. 16098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.setIntent(intent, r.info); 16108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the target task is not in the front, then we need 16128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to bring it to the front... except... well, with 16138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 16148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to have the same behavior as if a new instance was 16158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being started, which means not bringing it to the front 16168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // if the caller is not itself in the front. 1617165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner final ActivityStack lastStack = getLastStack(); 1618165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner ActivityRecord curTop = lastStack == null? 1619165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner null : lastStack.topRunningNonDelayedActivityLocked(notTop); 16207504d7b24a07fef05b3447d843f212796e22302fCraig Mautner if (curTop != null && (curTop.task != intentActivity.task || 16217504d7b24a07fef05b3447d843f212796e22302fCraig Mautner curTop.task != lastStack.topTask())) { 16228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 1623d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner if (sourceRecord == null || (sourceStack.topActivity() != null && 1624d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner sourceStack.topActivity().task == sourceRecord.task)) { 16258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We really do want to push this one into the 16268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // user's face, right now. 16278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner movedHome = true; 1628b53d97c4571f8ed09e92eee64301969b96ff1e4dCraig Mautner targetStack.moveTaskToFrontLocked(intentActivity.task, r, options); 1629de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 163029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) 163129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { 1632e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner // Caller wants to appear on home activity. 1633e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 1634de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 16358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner options = null; 16368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has requested that the target task be 16398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // reset, then do so. 16408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 16418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r); 16428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 16448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 16458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 16468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! And for paranoia, make 16478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 16488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 164905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(targetStack, null, options); 16508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 16518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 16528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 16548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags & 16568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 16578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 16588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The caller has requested to completely replace any 16598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task with its new activity. Well that should 16608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // not be too hard... 16618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask = intentActivity.task; 16628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask.performClearTaskLocked(); 16638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask.setIntent(r.intent, r.info); 16648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 16658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK 16668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 16678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this situation we want to remove all activities 16688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from the task up to the one being started. In most 16698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // cases this means we are resetting the task to its 16708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // initial state. 16718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord top = 16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.performClearTaskLocked(r, launchFlags); 16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 16748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.frontOfTask) { 16758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Activity aliases may mean we use different 16768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intents for the top activity, so make sure 16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the task now has the identity of the new 16788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intent. 16798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.task.setIntent(r.intent, r.info); 16808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, 16828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r, top.task); 16838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 16848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 16858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // A special case: we need to 16868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // start the activity because it is not currently 16878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // running, and the caller has asked to clear the 16888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current task to have this activity at the top. 16898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 16908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Now pretend like this activity is being started 16918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // by the top of its task, so it is put in the 16928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // right place. 16938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 16948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (r.realActivity.equals(intentActivity.task.realActivity)) { 16968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case the top activity on the task is the 16978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // same as the one being launched, so we take that 16988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // as a request to bring the task to the foreground. 16998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the top activity in the task is the root 17008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity, deliver this new intent to it if it 17018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // desires. 17028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 17038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP) 17048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner && intentActivity.realActivity.equals(r.realActivity)) { 17058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, 17068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task); 17078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.frontOfTask) { 17088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.setIntent(r.intent, r.info); 17098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.deliverNewIntentLocked(callingUid, r.intent); 17118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!r.intent.filterEquals(intentActivity.task.intent)) { 17128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching the root activity 17138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of the task, but with a different intent. We 17148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // should start a new instance on top. 17158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 17168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 17178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 17198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case an activity is being launched in to an 17208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task, without resetting that task. This 17218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is typically the situation of launching an activity 17228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from a notification or shortcut. We want to place 17238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the new activity on top of the current task. 17248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 17258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 17268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!intentActivity.task.rootWasReset) { 17278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching in to an existing task 17288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that has not yet been started from its front door. 17298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The current task has been brought to the front. 17308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Ideally, we'd probably like to place this new task 17318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the bottom of its stack, but that's a little hard 17328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to do with the current organization of the code so 17338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // for now we'll just drop it. 17348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.setIntent(r.intent, r.info); 17358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!addingToTask && reuseTask == null) { 17378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We didn't do anything... but it was needed (a.k.a., client 17388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // don't use that intent!) And for paranoia, make 17398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 17408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 1741de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner targetStack.resumeTopActivityLocked(null, options); 17428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 17438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 17448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_TASK_TO_FRONT; 17468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //String uri = r.intent.toURI(); 17528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Intent intent2 = new Intent(uri); 17538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "Given intent: " + r.intent); 17548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "URI is: " + uri); 17558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "To intent: " + intent2); 17568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.packageName != null) { 17588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the activity being launched is the same as the one currently 17598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the top, then we need to check if it should only be launched 17608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // once. 1761ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack topStack = getFocusedStack(); 1762de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop); 17638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null && r.resultTo == null) { 17648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 17658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.app != null && top.app.thread != null) { 1766d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 17678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP 17688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK) { 17698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, 17708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.task); 17718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 17728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 17730f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner topStack.mLastPausedActivity = null; 17748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 177505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 17768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 17788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 17798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 17808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 17818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! 17828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 17838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 17858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 17868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 17928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo != null) { 1793de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, 1794de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.requestCode, Activity.RESULT_CANCELED, null); 17958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 17978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_CLASS_NOT_FOUND; 17988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 18008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean newTask = false; 18018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean keepCurTransition = false; 18028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 18038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Should this be considered a new task? 18048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo == null && !addingToTask 18058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1806aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(reuseTask)) { 1807aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 1808aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 1809aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 1810ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner targetStack = adjustStackFocus(r); 1811e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner targetStack.moveToFront(); 18128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (reuseTask == null) { 18138862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner r.setTask(targetStack.createTaskRecord(getNextTaskId(), 18148862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner newTaskInfo != null ? newTaskInfo : r.info, 18158862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner newTaskIntent != null ? newTaskIntent : intent, 181691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn voiceSession, voiceInteractor, true), null, true); 1817e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner if (sourceRecord == null) { 1818e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner // Launched from a service or notification or task that is finishing. 1819e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner r.task.setTaskToReturnTo(isFrontStack(mHomeStack) ? 1820e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner mHomeStack.topTask().taskType : RECENTS_ACTIVITY_TYPE); 1821e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner } 1822de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " + 1823de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.task); 18248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 1825de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.setTask(reuseTask, reuseTask, true); 18268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner newTask = true; 18288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!movedHome) { 1829de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 1830de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 1831de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 1832de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // Caller wants to appear on home activity, so before starting 1833de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // their own activity we will bring home to the front. 1834e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 1835de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 18368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (sourceRecord != null) { 18382a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn TaskRecord sourceTask = sourceRecord.task; 1839aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(sourceTask)) { 1840aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 1841aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 1842aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 1843525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner targetStack = sourceTask.stack; 1844dd221b3780800f03900c52bfc4a1ac7d01b72bc2Craig Mautner targetStack.moveToFront(); 1845abcc59c32fd67c507f2ff192e82fef971968b2dbCraig Mautner mWindowManager.moveTaskToTop(targetStack.topTask().taskId); 18468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!addingToTask && 18478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 18488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are adding the activity to an existing 18498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // task, but the caller has asked to clear that task if the 18508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity is already running. 1851525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags); 18528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner keepCurTransition = true; 18538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 18548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 18558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 18568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 18578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 18580f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 18598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 18608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 18618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 18638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 18648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!addingToTask && 18668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 18678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are launching an activity in our own task 18688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that may already be running somewhere in the history, and 18698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we want to shuffle it to the front of the stack if so. 1870525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r); 18718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 1872de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final TaskRecord task = top.task; 1873de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner task.moveActivityToFrontLocked(top); 1874de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task); 18758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.updateOptionsLocked(options); 18768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.deliverNewIntentLocked(callingUid, r.intent); 18770f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 18788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 18798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 18808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 18828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // An existing activity is starting this new activity, so we want 18858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to keep the new one in the same task as the one that is starting 18868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // it. 1887525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner r.setTask(sourceTask, sourceRecord.thumbHolder, false); 18888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 18892a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + " in existing task " + r.task + " from source " + sourceRecord); 18908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 18918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 18928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This not being started from an existing activity, and not part 18938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of a new task... just put it in the top task, though these days 18948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // this case should never happen. 1895ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner targetStack = adjustStackFocus(r); 1896dd221b3780800f03900c52bfc4a1ac7d01b72bc2Craig Mautner targetStack.moveToFront(); 18971602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner ActivityRecord prev = targetStack.topActivity(); 1898de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.setTask(prev != null ? prev.task 189991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn : targetStack.createTaskRecord(getNextTaskId(), r.info, intent, null, null, true), 1900de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner null, true); 190195e9daab03d0349a69940625c7f718175f371581Craig Mautner mWindowManager.moveTaskToTop(r.task.taskId); 19028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 19038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner + " in new guessed " + r.task); 19048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 19068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 19078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intent, r.getUriPermissionsLocked()); 19088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 19098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (newTask) { 19108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId); 19118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 19130f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 19148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options); 19151d001b670e34fe887488047f525a5430154626e1Craig Mautner mService.setFocusedActivityLocked(r); 19168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_SUCCESS; 19178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 19197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner void acquireLaunchWakelock() { 19207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 19217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 19227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 19237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.acquire(); 19247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 19257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // To be safe, don't allow the wake lock to be held for too long. 19267ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 19277ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 19287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 19297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 1930f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Checked. 1931f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, 1932f333327782e14688e1c198c1192172d51308e90bCraig Mautner Configuration config) { 1933f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 1934f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1935f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> stops = null; 1936f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> finishes = null; 1937f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<UserStartedState> startingUsers = null; 1938f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NS = 0; 1939f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NF = 0; 1940f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean booting = false; 1941f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean enableScreen = false; 1942f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean activityRemoved = false; 1943f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1944f333327782e14688e1c198c1192172d51308e90bCraig Mautner ActivityRecord r = ActivityRecord.forToken(token); 1945f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r != null) { 1946b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" + 1947b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner Debug.getCallers(4)); 1948f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 1949f333327782e14688e1c198c1192172d51308e90bCraig Mautner r.finishLaunchTickingLocked(); 19507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (fromTimeout) { 19517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 19527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 1953f333327782e14688e1c198c1192172d51308e90bCraig Mautner 19547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // This is a hack to semi-deal with a race condition 19557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // in the client where it can be constructed with a 19567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // newer configuration from when we asked it to launch. 19577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We'll update with whatever configuration it now says 19587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // it used to launch. 19597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (config != null) { 19607ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.configuration = config; 19617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 1962f333327782e14688e1c198c1192172d51308e90bCraig Mautner 19637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We are now idle. If someone is waiting for a thumbnail from 19647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // us, we can now deliver. 19657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.idle = true; 19667ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 19677ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 19687ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (!mService.mBooted && isFrontStack(r.task.stack)) { 19697ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mBooted = true; 19707ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner enableScreen = true; 19717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 19727ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 19737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 19747ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (allResumedActivitiesIdle()) { 19757ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (r != null) { 19767ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.scheduleAppGcsLocked(); 19777ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 19787ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 19797ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 19807ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 19817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && 19827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Binder.getCallingUid() != Process.myUid()) { 19837ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 1984f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 19857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 1986f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 19877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner ensureActivitiesVisibleLocked(null, 0); 1988f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1989f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1990f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Atomically retrieve all of the other things to do. 1991f333327782e14688e1c198c1192172d51308e90bCraig Mautner stops = processStoppingActivitiesLocked(true); 1992f333327782e14688e1c198c1192172d51308e90bCraig Mautner NS = stops != null ? stops.size() : 0; 1993f333327782e14688e1c198c1192172d51308e90bCraig Mautner if ((NF=mFinishingActivities.size()) > 0) { 1994f333327782e14688e1c198c1192172d51308e90bCraig Mautner finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 1995f333327782e14688e1c198c1192172d51308e90bCraig Mautner mFinishingActivities.clear(); 1996f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 1997f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1998f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (isFrontStack(mHomeStack)) { 1999f333327782e14688e1c198c1192172d51308e90bCraig Mautner booting = mService.mBooting; 2000f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.mBooting = false; 2001f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2002f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2003f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mStartingUsers.size() > 0) { 2004f333327782e14688e1c198c1192172d51308e90bCraig Mautner startingUsers = new ArrayList<UserStartedState>(mStartingUsers); 2005f333327782e14688e1c198c1192172d51308e90bCraig Mautner mStartingUsers.clear(); 2006f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2007f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2008f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Stop any activities that are scheduled to do so but have been 2009f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 2010f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NS; i++) { 2011f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = stops.get(i); 2012f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityStack stack = r.task.stack; 2013f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r.finishing) { 2014f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false); 2015f333327782e14688e1c198c1192172d51308e90bCraig Mautner } else { 2016f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.stopActivityLocked(r); 2017f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2018f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2019f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2020f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Finish any activities that are scheduled to do so but have been 2021f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 2022f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NF; i++) { 2023f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = finishes.get(i); 2024f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityRemoved |= r.task.stack.destroyActivityLocked(r, true, false, "finish-idle"); 2025f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2026f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2027f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (booting) { 2028f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.finishBooting(); 20291a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } else { 20301a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani // Complete user switch 20311a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani if (startingUsers != null) { 20321a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani for (int i = 0; i < startingUsers.size(); i++) { 20331a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mService.finishUserSwitch(startingUsers.get(i)); 20341a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 20351a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 20361a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani // Complete starting up of background users 20371a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani if (mStartingBackgroundUsers.size() > 0) { 20381a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani startingUsers = new ArrayList<UserStartedState>(mStartingBackgroundUsers); 20391a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mStartingBackgroundUsers.clear(); 20401a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani for (int i = 0; i < startingUsers.size(); i++) { 20411a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mService.finishUserBoot(startingUsers.get(i)); 20421a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 2043f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2044f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2045f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2046f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.trimApplications(); 2047f333327782e14688e1c198c1192172d51308e90bCraig Mautner //dump(); 2048f333327782e14688e1c198c1192172d51308e90bCraig Mautner //mWindowManager.dump(); 2049f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2050f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (enableScreen) { 2051f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.enableScreenAfterBoot(); 2052f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2053f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2054f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (activityRemoved) { 205505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 2056f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2057f333327782e14688e1c198c1192172d51308e90bCraig Mautner 20587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return r; 2059f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2060f333327782e14688e1c198c1192172d51308e90bCraig Mautner 20618e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner boolean handleAppDiedLocked(ProcessRecord app) { 20621909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner boolean hasVisibleActivities = false; 2063e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2064e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 20654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 20664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner hasVisibleActivities |= stacks.get(stackNdx).handleAppDiedLocked(app); 20674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 20688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20691909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner return hasVisibleActivities; 20708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 20728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void closeSystemDialogsLocked() { 2073e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2074e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 20754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 20764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.get(stackNdx).closeSystemDialogsLocked(); 20774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 20788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 208193529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner void removeUserLocked(int userId) { 20824f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner mUserStackInFront.delete(userId); 208393529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner } 208493529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner 20858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** 20868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * @return true if some activity was finished (or would have finished if doit were true). 20878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner */ 20888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) { 20898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean didSomething = false; 2090e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2091e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 20924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 20934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 20944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 20954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) { 20964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner didSomething = true; 20974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 20988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 20998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return didSomething; 21018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2103a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn void updatePreviousProcessLocked(ActivityRecord r) { 2104a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now that this process has stopped, we may want to consider 2105a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // it to be the previous app to try to keep around in case 2106a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // the user wants to return to it. 2107a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 2108a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // First, found out what is currently the foreground app, so that 2109a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // we don't blow away the previous app if this activity is being 2110a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // hosted by the process that is actually still the foreground. 2111a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn ProcessRecord fgApp = null; 2112e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2113e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 21144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 21154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 21164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 21174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stack.mResumedActivity != null) { 21184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner fgApp = stack.mResumedActivity.app; 21194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } else if (stack.mPausingActivity != null) { 21204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner fgApp = stack.mPausingActivity.app; 21214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 21224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner break; 2123a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2124a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2125a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2126a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 2127a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now set this one as the previous process, only if that really 2128a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // makes sense to. 2129a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn if (r.app != null && fgApp != null && r.app != fgApp 2130a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn && r.lastVisibleTime > mService.mPreviousProcessVisibleTime 21314ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner && r.app != mService.mHomeProcess) { 2132a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcess = r.app; 2133a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcessVisibleTime = r.lastVisibleTime; 2134a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2135a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2136a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 213705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked() { 213805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return resumeTopActivitiesLocked(null, null, null); 213905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 214005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 214105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, 214205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner Bundle targetOptions) { 214305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner if (targetStack == null) { 214405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner targetStack = getFocusedStack(); 214505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 214612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner // Do targetStack first. 214705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean result = false; 214812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (isFrontStack(targetStack)) { 214912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner result = targetStack.resumeTopActivityLocked(target, targetOptions); 215012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 2151e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2152e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 21534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 21544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 215512ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (stack == targetStack) { 215612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner // Already started above. 215712ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner continue; 215812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 21594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 216012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner stack.resumeTopActivityLocked(null); 216105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 2162f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner } 21638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 216405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return result; 21658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 21678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void finishTopRunningActivityLocked(ProcessRecord app) { 2168e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2169e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 21704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 21714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 21724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 21734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.finishTopRunningActivityLocked(app); 21744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 21758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2178aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner void findTaskToMoveToFrontLocked(TaskRecord task, int flags, Bundle options) { 2179aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) { 2180aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mUserLeaving = true; 21818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2182aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) { 2183aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner // Caller wants the home activity moved with it. To accomplish this, 2184aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner // we'll just indicate that this task returns to the home task. 2185e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 2186aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2187aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner task.stack.moveTaskToFrontLocked(task, null, options); 2188aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" 2189aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner + task.stack); 21908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2192967212cb542e6eeb308678367b53381bff984c31Craig Mautner ActivityStack getStack(int stackId) { 2193f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer activityContainer = mActivityContainers.get(stackId); 2194f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (activityContainer != null) { 2195f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return activityContainer.mStack; 21968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 21988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 21998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2200967212cb542e6eeb308678367b53381bff984c31Craig Mautner ArrayList<ActivityStack> getStacks() { 22014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<ActivityStack> allStacks = new ArrayList<ActivityStack>(); 2202e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2203e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner allStacks.addAll(mActivityDisplays.valueAt(displayNdx).mStacks); 22044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 22054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return allStacks; 22064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 22074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 22084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner IBinder getHomeActivityToken() { 22094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ArrayList<TaskRecord> tasks = mHomeStack.getAllTasks(); 22104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 22114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final TaskRecord task = tasks.get(taskNdx); 22124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (task.isHomeTask()) { 22134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ArrayList<ActivityRecord> activities = task.mActivities; 22144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { 22154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = activities.get(activityNdx); 22164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r.isHomeActivity()) { 22174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return r.appToken; 22184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 22194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 22204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 22214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 22224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return null; 22234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 22244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 22254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityContainer createActivityContainer(ActivityRecord parentActivity, 22264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner IActivityContainerCallback callback) { 2227f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer activityContainer = new VirtualActivityContainer(parentActivity, callback); 2228f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityContainers.put(activityContainer.mStackId, activityContainer); 2229f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner parentActivity.mChildContainers.add(activityContainer); 2230f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return activityContainer; 22314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 22324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 223334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner void removeChildActivityContainers(ActivityRecord parentActivity) { 2234f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers; 2235f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) { 2236f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer container = childStacks.remove(containerNdx); 2237f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner container.release(); 223834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 223934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 224034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner 224195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner void deleteActivityContainer(IActivityContainer container) { 224295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner ActivityContainer activityContainer = (ActivityContainer)container; 224395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (activityContainer != null) { 2244f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner activityContainer.mStack.finishAllActivitiesLocked(); 224595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner final ActivityRecord parent = activityContainer.mParentActivity; 224695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (parent != null) { 224795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner parent.mChildContainers.remove(activityContainer); 224895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 224995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner final int stackId = activityContainer.mStackId; 225095da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mActivityContainers.remove(stackId); 225195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mWindowManager.removeStack(stackId); 225295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 225395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 225495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner 2255f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private int createStackOnDisplay(int stackId, int displayId) { 2256e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 2257e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay == null) { 22584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return -1; 22594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 22604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 2261f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer activityContainer = new ActivityContainer(stackId); 2262f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityContainers.put(stackId, activityContainer); 2263e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner activityContainer.attachToDisplayLocked(activityDisplay); 22644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return stackId; 2265967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 2266967212cb542e6eeb308678367b53381bff984c31Craig Mautner 22674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int getNextStackId() { 2268858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner while (true) { 2269858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (++mLastStackId <= HOME_STACK_ID) { 2270858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mLastStackId = HOME_STACK_ID + 1; 2271858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 2272858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (getStack(mLastStackId) == null) { 2273858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner break; 22748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2276858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner return mLastStackId; 22778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 22788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 227921d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner void createStackForRestoredTaskHistory(ArrayList<TaskRecord> tasks) { 228021d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); 228121d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner final ActivityStack stack = getStack(stackId); 228221d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 228321d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner final TaskRecord task = tasks.get(taskNdx); 228421d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner stack.addTask(task, false, false); 228521d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner final int taskId = task.taskId; 228621d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner final ArrayList<ActivityRecord> activities = task.mActivities; 228721d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { 228821d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner final ActivityRecord r = activities.get(activityNdx); 228921d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner mWindowManager.addAppToken(0, r.appToken, taskId, stackId, 229021d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner r.info.screenOrientation, r.fullscreen, 229121d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0, 229221d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner r.userId, r.info.configChanges); 229321d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner } 229421d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner mWindowManager.addTask(taskId, stackId, false); 229521d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner } 2296e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner resumeHomeStackTask(HOME_ACTIVITY_TYPE, null); 229721d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner } 229821d24a21ea4aaadd78e73de54168e8a8a8973e4dCraig Mautner 22998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void moveTaskToStack(int taskId, int stackId, boolean toTop) { 2300b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner final TaskRecord task = anyTaskForIdLocked(taskId); 2301b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (task == null) { 2302b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner return; 2303b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner } 23048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = getStack(stackId); 23058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack == null) { 23068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); 23078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return; 23088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 230941db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner task.stack.removeTask(task); 2310c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn stack.addTask(task, toTop, true); 2311b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner mWindowManager.addTask(taskId, stackId, toTop); 231205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 23138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2315ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityRecord findTaskLocked(ActivityRecord r) { 23162a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r); 2317e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2318e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 23194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 23204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 23214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (!r.isApplicationActivity() && !stack.isHomeStack()) { 23224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: " + stack); 23234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner continue; 23244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 23254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord ar = stack.findTaskLocked(r); 23264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (ar != null) { 23274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return ar; 23284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 23298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 23308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 23312a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "No task found"); 23328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 23338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 23348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 23358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 2336e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2337e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 23384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 23394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord ar = stacks.get(stackNdx).findActivityLocked(intent, info); 23404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (ar != null) { 23414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return ar; 23424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 23438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 23448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 23458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 23468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 23478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 23488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void goingToSleepLocked() { 23490eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleSleepTimeout(); 23500eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mGoingToSleep.isHeld()) { 23510eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.acquire(); 23527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 23537ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 23547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 23550eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 23567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 23577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 23580eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 23598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2360ce15e157a6cf56fc73961ccb8c5ab18b1bf70280Amith Yamasani checkReadyForSleepLocked(); 23618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 23638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean shutdownLocked(int timeout) { 23640eea92c67b292b005c152641a12b920fe145826cCraig Mautner goingToSleepLocked(); 23650eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2366f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner boolean timedout = false; 23670eea92c67b292b005c152641a12b920fe145826cCraig Mautner final long endTime = System.currentTimeMillis() + timeout; 23680eea92c67b292b005c152641a12b920fe145826cCraig Mautner while (true) { 23690eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean cantShutdown = false; 2370e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2371e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 23724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 23734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner cantShutdown |= stacks.get(stackNdx).checkReadyForSleepLocked(); 23744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 23750eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 23760eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (cantShutdown) { 23770eea92c67b292b005c152641a12b920fe145826cCraig Mautner long timeRemaining = endTime - System.currentTimeMillis(); 23780eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (timeRemaining > 0) { 23798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 23800eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.wait(timeRemaining); 23818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (InterruptedException e) { 23828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23830eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 23840eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Activity manager shutdown timed out"); 23850eea92c67b292b005c152641a12b920fe145826cCraig Mautner timedout = true; 23860eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 23878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23880eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 23890eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 23908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23920eea92c67b292b005c152641a12b920fe145826cCraig Mautner 23930eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Force checkReadyForSleep to complete. 23940eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 23950eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 23960eea92c67b292b005c152641a12b920fe145826cCraig Mautner 23978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return timedout; 23988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 24008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void comeOutOfSleepIfNeededLocked() { 24010eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 24020eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 24030eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 24040eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 2405e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2406e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 24084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 24094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.awakeFromSleepingLocked(); 24104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 24114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner resumeTopActivitiesLocked(); 24124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24135314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner } 24148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24150eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.clear(); 24160eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24170eea92c67b292b005c152641a12b920fe145826cCraig Mautner 24180eea92c67b292b005c152641a12b920fe145826cCraig Mautner void activitySleptLocked(ActivityRecord r) { 24190eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.remove(r); 24200eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 24210eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24220eea92c67b292b005c152641a12b920fe145826cCraig Mautner 24230eea92c67b292b005c152641a12b920fe145826cCraig Mautner void checkReadyForSleepLocked() { 24240eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mService.isSleepingOrShuttingDown()) { 24250eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Do not care. 24260eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 24270eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24280eea92c67b292b005c152641a12b920fe145826cCraig Mautner 24290eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mSleepTimeout) { 24300eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean dontSleep = false; 2431e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2432e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 24344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner dontSleep |= stacks.get(stackNdx).checkReadyForSleepLocked(); 24354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24360eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24370eea92c67b292b005c152641a12b920fe145826cCraig Mautner 24380eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mStoppingActivities.size() > 0) { 24390eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to stop; can't sleep yet. 24400eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 24410eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mStoppingActivities.size() + " activities"); 24420eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleIdleLocked(); 24430eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 24440eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24450eea92c67b292b005c152641a12b920fe145826cCraig Mautner 24460eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleepActivities.size() > 0) { 24470eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to sleep; can't sleep yet. 24480eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 24490eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mGoingToSleepActivities.size() + " activities"); 24500eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 24510eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24520eea92c67b292b005c152641a12b920fe145826cCraig Mautner 24530eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (dontSleep) { 24540eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 24550eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24560eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24570eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2458e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2459e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 24614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.get(stackNdx).goToSleep(); 24624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24630eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24640eea92c67b292b005c152641a12b920fe145826cCraig Mautner 24650eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 24660eea92c67b292b005c152641a12b920fe145826cCraig Mautner 24670eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 24680eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 24690eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24700eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.mShuttingDown) { 24710eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.notifyAll(); 24720eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 24738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2475ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner boolean reportResumedActivityLocked(ActivityRecord r) { 2476ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = r.task.stack; 2477ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (isFrontStack(stack)) { 24785782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey mService.updateUsageStats(r, true); 2479ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2480ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (allResumedActivitiesComplete()) { 2481ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ensureActivitiesVisibleLocked(null, 0); 2482ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.executeAppTransition(); 2483ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return true; 2484ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2485ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return false; 2486ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2487ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 24888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void handleAppCrashLocked(ProcessRecord app) { 2489e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2490e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 24924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 24934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 24944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.handleAppCrashLocked(app); 24954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2499de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) { 2500580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner // First the front stacks. In case any are not fullscreen and are in front of home. 2501e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2502e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 25034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int topStackNdx = stacks.size() - 1; 25044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) { 25054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 2506729cb2391f8eedbab9af1d0ef62febb0b56292ccJose Lima stack.ensureActivitiesVisibleLocked(starting, configChanges); 2507580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner } 25088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 25118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void scheduleDestroyAllActivities(ProcessRecord app, String reason) { 2512e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2513e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 25144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 25154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 25164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 25174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.scheduleDestroyActivities(app, false, reason); 25184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 25228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean switchUserLocked(int userId, UserStartedState uss) { 25234f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId()); 25244f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID); 25252420ead0326bfd2587da6231be419e758dba1930Craig Mautner mCurrentUser = userId; 2526ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 2527858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mStartingUsers.add(uss); 2528e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2529e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 25304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 2531e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityStack stack = stacks.get(stackNdx); 2532e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner stack.switchUserLocked(userId); 2533dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina TaskRecord task = stack.topTask(); 2534dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina if (task != null) { 2535dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina mWindowManager.moveTaskToTop(task.taskId); 2536dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina } 25374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 2538ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 2539858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 25404f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner ActivityStack stack = getStack(restoreStackId); 25414f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner if (stack == null) { 25424f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner stack = mHomeStack; 25434f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner } 25444f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner final boolean homeInFront = stack.isHomeStack(); 2545e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (stack.isOnHomeDisplay()) { 2546e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner moveHomeStack(homeInFront); 2547dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina TaskRecord task = stack.topTask(); 2548dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina if (task != null) { 2549dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina mWindowManager.moveTaskToTop(task.taskId); 2550dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina } 2551e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } else { 2552e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner // Stack was moved to another display while user was swapped out. 2553e67a784eb2c914c04c62ea5dfa1e3751df5582ccCraig Mautner resumeHomeStackTask(HOME_ACTIVITY_TYPE, null); 2554e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 255593529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner return homeInFront; 25562219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 25572219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 25581a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani /** 25591a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani * Add background users to send boot completed events to. 25601a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani * @param userId The user being started in the background 25611a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani * @param uss The state object for the user. 25621a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani */ 25631a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani public void startBackgroundUserLocked(int userId, UserStartedState uss) { 25641a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mStartingBackgroundUsers.add(uss); 25651a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 25661a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani 2567de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) { 2568de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner int N = mStoppingActivities.size(); 2569de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (N <= 0) return null; 2570de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2571de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ArrayList<ActivityRecord> stops = null; 2572de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2573de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final boolean nowVisible = allResumedActivitiesVisible(); 2574de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int i=0; i<N; i++) { 2575de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord s = mStoppingActivities.get(i); 2576a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 2577de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + nowVisible + " waitingVisible=" + s.waitingVisible 2578de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + " finishing=" + s.finishing); 2579de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.waitingVisible && nowVisible) { 2580de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mWaitingVisibleActivities.remove(s); 2581de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner s.waitingVisible = false; 2582de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.finishing) { 2583de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // If this activity is finishing, it is sitting on top of 2584de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // everyone else but we now know it is no longer needed... 2585de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // so get rid of it. Otherwise, we need to go through the 2586de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // normal flow and hide it once we determine that it is 2587de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // hidden by the activities in front of it. 2588de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 2589ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.setAppVisibility(s.appToken, false); 2590de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2591de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2592de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) { 2593de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 2594de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stops == null) { 2595de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops = new ArrayList<ActivityRecord>(); 2596de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2597de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops.add(s); 2598de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStoppingActivities.remove(i); 2599de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner N--; 2600de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner i--; 2601de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2602de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2603de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2604de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return stops; 2605de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 2606de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2607cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner void validateTopActivitiesLocked() { 26084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // FIXME 26094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner/* for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 26104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 2611cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner final ActivityRecord r = stack.topRunningActivityLocked(null); 2612f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityState state = r == null ? ActivityState.DESTROYED : r.state; 2613cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (isFrontStack(stack)) { 2614cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (r == null) { 2615cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: null top activity, stack=" + stack); 2616cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 2617f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord pausing = stack.mPausingActivity; 2618f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (pausing != null && pausing == r) { 2619cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r + 2620f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2621cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2622f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) { 2623cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r + 2624f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2625cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2626cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2627cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 2628f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord resumed = stack.mResumedActivity; 2629f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (resumed != null && resumed == r) { 2630cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r + 2631f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2632cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2633f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (r != null && (state == ActivityState.INITIALIZING 2634f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner || state == ActivityState.RESUMED)) { 2635cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in back resumed r=" + r + 2636f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 2637cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2638cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 2639cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 26404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner*/ 264176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner } 264276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner 2643270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner public void dump(PrintWriter pw, String prefix) { 2644d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.print("mDismissKeyguardOnNextActivity="); 2645270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner pw.println(mDismissKeyguardOnNextActivity); 2646d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack); 26474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pw.print(" mLastFocusedStack="); pw.println(mLastFocusedStack); 2648d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout); 2649d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId); 2650d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront); 265195da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers); 2652270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 26538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 265420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { 2655ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return getFocusedStack().getDumpActivitiesLocked(name); 265620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 265720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 2658390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage, 2659390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean needSep, String prefix) { 2660390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (activity != null) { 2661390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (dumpPackage == null || dumpPackage.equals(activity.packageName)) { 2662390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (needSep) { 2663390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(); 2664390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2665390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.print(prefix); 2666390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(activity); 26677ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return true; 2668390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2669390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 26707ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return false; 2671390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2672390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn 26738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 26748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpClient, String dumpPackage) { 26757ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean printed = false; 26767ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean needSep = false; 2677e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { 2678e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx); 2679e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner pw.print("Display #"); pw.println(activityDisplay.mDisplayId); 2680e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = activityDisplay.mStacks; 26814a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 26824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 26834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 26844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StringBuilder stackHeader = new StringBuilder(128); 26854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stackHeader.append(" Stack #"); 26864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stackHeader.append(stack.mStackId); 26874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stackHeader.append(":"); 26884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, 26894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep, stackHeader.toString()); 26904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, " ", "Run", false, 26914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner !dumpAll, false, dumpPackage, true, 26924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " Running activities (most recent first):", null); 26934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 26944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = printed; 26954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep, 26964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mPausingActivity: "); 26974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (pr) { 26984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed = true; 26994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = false; 27004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep, 27024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mResumedActivity: "); 27037ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (pr) { 27047ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed = true; 27054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = false; 27064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (dumpAll) { 27084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep, 27094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mLastPausedActivity: "); 27104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (pr) { 27114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed = true; 27124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = true; 27134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage, 27154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep, " mLastNoHistoryActivity: "); 27167ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 27174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = printed; 27188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 27217ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mFinishingActivities, " ", "Fin", false, !dumpAll, 27227ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to finish:", null); 27237ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mStoppingActivities, " ", "Stop", false, !dumpAll, 27247ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to stop:", null); 27257ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, " ", "Wait", false, !dumpAll, 27267ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting for another to become visible:", 27277ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn null); 27287ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 27297ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 27307ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 27317ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 2732de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 27337ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return printed; 27348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2736390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, 27378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner String prefix, String label, boolean complete, boolean brief, boolean client, 27387ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn String dumpPackage, boolean needNL, String header1, String header2) { 27398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord lastTask = null; 2740390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String innerPrefix = null; 2741390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String[] args = null; 2742390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean printed = false; 27438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int i=list.size()-1; i>=0; i--) { 27448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityRecord r = list.get(i); 27458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpPackage != null && !dumpPackage.equals(r.packageName)) { 27468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner continue; 27478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2748390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (innerPrefix == null) { 2749390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn innerPrefix = prefix + " "; 2750390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn args = new String[0]; 2751390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 2752390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn printed = true; 27538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final boolean full = !brief && (complete || !r.isInHistory()); 27548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (needNL) { 2755390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(""); 27568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = false; 27578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27587ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header1 != null) { 27597ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header1); 27607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header1 = null; 27617ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 27627ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header2 != null) { 27637ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header2); 27647ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header2 = null; 2765390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 27668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask != r.task) { 27678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask = r.task; 27688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); 27698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(full ? "* " : " "); 27708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask); 27718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 27728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask.dump(pw, prefix + " "); 27738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 27748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 27758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask.intent != null) { 27768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(" "); 27778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask.intent.toInsecureStringWithClip()); 27788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(full ? " * " : " "); pw.print(label); 27828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(" #"); pw.print(i); pw.print(": "); 27838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(r); 27848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 27858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.dump(pw, innerPrefix); 27868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 27878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 27888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.intent.toInsecureString()); 27898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (r.app != null) { 27908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.app); 27918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (client && r.app != null && r.app.thread != null) { 27948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // flush anything that is already in the PrintWriter since the thread is going 27958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // to write to the file descriptor directly 27968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.flush(); 27978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 27988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TransferPipe tp = new TransferPipe(); 27998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 28008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(), 28018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.appToken, innerPrefix, args); 28028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Short timeout, since blocking here can 28038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // deadlock with the application. 28048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.go(fd, 2000); 28058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } finally { 28068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.kill(); 28078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (IOException e) { 28098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Failure while dumping the activity: " + e); 28108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (RemoteException e) { 28118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Got a RemoteException while dumping the activity"); 28128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = true; 28148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2816390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn return printed; 28178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2818ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 2819f333327782e14688e1c198c1192172d51308e90bCraig Mautner void scheduleIdleTimeoutLocked(ActivityRecord next) { 2820b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4)); 2821c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next); 2822c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 2823f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2824f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2825f333327782e14688e1c198c1192172d51308e90bCraig Mautner final void scheduleIdleLocked() { 282605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mHandler.sendEmptyMessage(IDLE_NOW_MSG); 2827f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2828f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2829f333327782e14688e1c198c1192172d51308e90bCraig Mautner void removeTimeoutsForActivityLocked(ActivityRecord r) { 2830b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4)); 2831f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 2832f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2833f333327782e14688e1c198c1192172d51308e90bCraig Mautner 283405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner final void scheduleResumeTopActivities() { 283534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) { 283634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 283734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 283805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 283905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 28400eea92c67b292b005c152641a12b920fe145826cCraig Mautner void removeSleepTimeouts() { 28410eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = false; 28420eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 28430eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28440eea92c67b292b005c152641a12b920fe145826cCraig Mautner 28450eea92c67b292b005c152641a12b920fe145826cCraig Mautner final void scheduleSleepTimeout() { 28460eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 28470eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT); 28480eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28490eea92c67b292b005c152641a12b920fe145826cCraig Mautner 28504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 28514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void onDisplayAdded(int displayId) { 28524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0)); 28534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 28554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 28564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void onDisplayRemoved(int displayId) { 28574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0)); 28584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 28604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 28614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void onDisplayChanged(int displayId) { 28624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0)); 28634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 28654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void handleDisplayAddedLocked(int displayId) { 28664504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner boolean newDisplay; 28674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 28684504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner newDisplay = mActivityDisplays.get(displayId) == null; 28694504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner if (newDisplay) { 28704504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner ActivityDisplay activityDisplay = new ActivityDisplay(displayId); 28714504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mActivityDisplays.put(displayId, activityDisplay); 28724504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 28734504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 28744504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner if (newDisplay) { 28754504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mWindowManager.onDisplayAdded(displayId); 28764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 28794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void handleDisplayRemovedLocked(int displayId) { 28804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 2881e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 2882e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay != null) { 2883e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = activityDisplay.mStacks; 28844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 288534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner stacks.get(stackNdx).mActivityContainer.detachLocked(); 28864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 2887e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplays.remove(displayId); 28884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager.onDisplayRemoved(displayId); 28914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 28934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void handleDisplayChangedLocked(int displayId) { 28944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 2895e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 2896e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay != null) { 28974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // TODO: Update the bounds. 28984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager.onDisplayChanged(displayId); 29014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 29034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StackInfo getStackInfo(ActivityStack stack) { 29044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StackInfo info = new StackInfo(); 29054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager.getStackBounds(stack.mStackId, info.bounds); 29064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.displayId = Display.DEFAULT_DISPLAY; 29074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.stackId = stack.mStackId; 29084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 29094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<TaskRecord> tasks = stack.getAllTasks(); 29104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numTasks = tasks.size(); 29114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int[] taskIds = new int[numTasks]; 29124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner String[] taskNames = new String[numTasks]; 29134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int i = 0; i < numTasks; ++i) { 29144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final TaskRecord task = tasks.get(i); 29154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner taskIds[i] = task.taskId; 29164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner taskNames[i] = task.origActivity != null ? task.origActivity.flattenToString() 29174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner : task.realActivity != null ? task.realActivity.flattenToString() 29184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner : task.getTopActivity() != null ? task.getTopActivity().packageName 29194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner : "unknown"; 29204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.taskIds = taskIds; 29224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.taskNames = taskNames; 29234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return info; 29244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 29264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StackInfo getStackInfoLocked(int stackId) { 29274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStack stack = getStack(stackId); 29284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stack != null) { 29294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return getStackInfo(stack); 29304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return null; 29324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 29344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<StackInfo> getAllStackInfosLocked() { 29354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<StackInfo> list = new ArrayList<StackInfo>(); 2936e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { 2937e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 29384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int ndx = stacks.size() - 1; ndx >= 0; --ndx) { 29394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner list.add(getStackInfo(stacks.get(ndx))); 29404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return list; 29434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 2945aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner void setLockTaskModeLocked(TaskRecord task) { 2946aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (task == null) { 2947aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner // Take out of lock task mode. 2948aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mLockTaskModeTask = null; 2949aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return; 2950aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2951aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(task)) { 2952aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "setLockTaskMode: Attempt to start a second Lock Task Mode task."); 2953aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return; 2954aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2955aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mLockTaskModeTask = task; 2956aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner findTaskToMoveToFrontLocked(task, 0, null); 2957aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner resumeTopActivitiesLocked(); 2958aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2959aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 2960aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner boolean isLockTaskModeViolation(TaskRecord task) { 2961aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return mLockTaskModeTask != null && mLockTaskModeTask != task; 2962aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2963aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 2964aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner void endLockTaskModeIfTaskEnding(TaskRecord task) { 2965aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (mLockTaskModeTask != null && mLockTaskModeTask == task) { 2966aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mLockTaskModeTask = null; 2967aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2968aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2969aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 2970aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner boolean isInLockTaskMode() { 2971aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return mLockTaskModeTask != null; 2972aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2973aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 2974ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner private final class ActivityStackSupervisorHandler extends Handler { 2975f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2976ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public ActivityStackSupervisorHandler(Looper looper) { 2977ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner super(looper); 2978ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2979ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 2980f333327782e14688e1c198c1192172d51308e90bCraig Mautner void activityIdleInternal(ActivityRecord r) { 2981f333327782e14688e1c198c1192172d51308e90bCraig Mautner synchronized (mService) { 2982f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternalLocked(r != null ? r.appToken : null, true, null); 2983f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 29847ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 29857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 2986ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner @Override 2987ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public void handleMessage(Message msg) { 2988ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner switch (msg.what) { 2989f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_TIMEOUT_MSG: { 29905eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj); 2991f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mService.mDidDexOpt) { 2992f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.mDidDexOpt = false; 2993f333327782e14688e1c198c1192172d51308e90bCraig Mautner Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 2994f333327782e14688e1c198c1192172d51308e90bCraig Mautner nmsg.obj = msg.obj; 2995f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 2996f333327782e14688e1c198c1192172d51308e90bCraig Mautner return; 2997f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2998f333327782e14688e1c198c1192172d51308e90bCraig Mautner // We don't at this point know if the activity is fullscreen, 2999f333327782e14688e1c198c1192172d51308e90bCraig Mautner // so we need to be conservative and assume it isn't. 3000f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 3001f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 3002f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_NOW_MSG: { 30035eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj); 3004f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 3005f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 300605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner case RESUME_TOP_ACTIVITY_MSG: { 300705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner synchronized (mService) { 300805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 300905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 301005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } break; 30110eea92c67b292b005c152641a12b920fe145826cCraig Mautner case SLEEP_TIMEOUT_MSG: { 30120eea92c67b292b005c152641a12b920fe145826cCraig Mautner synchronized (mService) { 30130eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.isSleepingOrShuttingDown()) { 30140eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Sleep timeout! Sleeping now."); 30150eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 30160eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 30170eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 30180eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 30190eea92c67b292b005c152641a12b920fe145826cCraig Mautner } break; 30207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner case LAUNCH_TIMEOUT_MSG: { 30217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mService.mDidDexOpt) { 30227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mDidDexOpt = false; 30237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 30247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return; 30257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 30267ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner synchronized (mService) { 30277ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 30287ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 30297ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER 30307ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner && Binder.getCallingUid() != Process.myUid()) { 30317ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 30327ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 30337ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 30347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 30357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 30367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } break; 30374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner case HANDLE_DISPLAY_ADDED: { 30384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner handleDisplayAddedLocked(msg.arg1); 30394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } break; 30404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner case HANDLE_DISPLAY_CHANGED: { 30414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner handleDisplayChangedLocked(msg.arg1); 30424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } break; 30434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner case HANDLE_DISPLAY_REMOVED: { 30444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner handleDisplayRemovedLocked(msg.arg1); 30454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } break; 3046e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner case CONTAINER_CALLBACK_VISIBILITY: { 3047e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner final ActivityContainer container = (ActivityContainer) msg.obj; 3048e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner try { 3049e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner // We only send this message if mCallback is non-null. 3050e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner container.mCallback.setVisible(container.asBinder(), msg.arg1 == 1); 3051e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } catch (RemoteException e) { 3052e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3053e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3054ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3055ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3056ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3057ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3058b081a59a0fdec88dd9b0f68b45c2f625f751d625Ying Wang class ActivityContainer extends android.app.IActivityContainer.Stub { 30597f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner final static int FORCE_NEW_TASK_FLAGS = Intent.FLAG_ACTIVITY_NEW_TASK | 30607f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner Intent.FLAG_ACTIVITY_MULTIPLE_TASK; 30614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int mStackId; 3062f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner IActivityContainerCallback mCallback = null; 30634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack mStack; 3064f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityRecord mParentActivity = null; 3065f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner String mIdString; 3066ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3067e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner boolean mVisible = true; 3068e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner 30694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Display this ActivityStack is currently on. Null if not attached to a Display. */ 3070e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay mActivityDisplay; 30714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3072f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final static int CONTAINER_STATE_HAS_SURFACE = 0; 3073f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final static int CONTAINER_STATE_NO_SURFACE = 1; 3074f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final static int CONTAINER_STATE_FINISHING = 2; 3075f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner int mContainerState = CONTAINER_STATE_HAS_SURFACE; 3076f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3077f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer(int stackId) { 30784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 30794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mStackId = stackId; 30804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mStack = new ActivityStack(this); 3081f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mIdString = "ActivtyContainer{" + mStackId + "}"; 308234b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "Creating " + this); 30834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3084ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 3085ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3086e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner void attachToDisplayLocked(ActivityDisplay activityDisplay) { 308734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "attachToDisplayLocked: " + this 308834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner + " to display=" + activityDisplay); 3089e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay = activityDisplay; 3090e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mDisplayId = activityDisplay.mDisplayId; 3091e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mStacks = activityDisplay.mStacks; 3092e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner 3093e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner activityDisplay.attachActivities(mStack); 3094df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mWindowManager.attachStack(mStackId, activityDisplay.mDisplayId); 30954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 30964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 30974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3098ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown public void attachToDisplay(int displayId) { 30994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 3100e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 3101e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay == null) { 31024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return; 31034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3104e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner attachToDisplayLocked(activityDisplay); 31054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 31064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 31074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 31084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3109ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown public int getDisplayId() { 3110e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mActivityDisplay != null) { 3111e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return mActivityDisplay.mDisplayId; 3112e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 3113e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return -1; 31144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 31154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3116ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown @Override 3117ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown public boolean injectEvent(InputEvent event) { 3118ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown final long origId = Binder.clearCallingIdentity(); 3119ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown try { 3120ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown if (mActivityDisplay != null) { 3121ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown return mInputManagerInternal.injectInputEvent(event, 3122ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown mActivityDisplay.mDisplayId, 3123ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); 3124ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } 3125ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown return false; 3126ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } finally { 3127ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown Binder.restoreCallingIdentity(origId); 3128ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } 3129ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } 3130ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown 3131f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 3132f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public void release() { 3133f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mContainerState = CONTAINER_STATE_FINISHING; 3134f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mStack.finishAllActivitiesLocked(); 3135f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner detachLocked(); 3136f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mWindowManager.removeStack(mStackId); 3137f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3138f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 313934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner private void detachLocked() { 314034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display=" 314134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner + mActivityDisplay + " Callers=" + Debug.getCallers(2)); 3142e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mActivityDisplay != null) { 3143e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay.detachActivitiesLocked(mStack); 3144e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay = null; 3145e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mDisplayId = -1; 3146e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mStacks = null; 3147df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mWindowManager.detachStack(mStackId); 31484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 31494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 31504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 31514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3152e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner public final int startActivity(Intent intent) { 3153df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mService.enforceNotIsolatedCaller("ActivityContainer.startActivity"); 3154e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner int userId = mService.handleIncomingUser(Binder.getCallingPid(), 3155e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner Binder.getCallingUid(), mCurrentUser, false, true, "ActivityContainer", null); 3156e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner // TODO: Switch to user app stacks here. 31577f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner intent.addFlags(FORCE_NEW_TASK_FLAGS); 3158e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner String mimeType = intent.getType(); 3159e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mimeType == null && intent.getData() != null 3160e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner && "content".equals(intent.getData().getScheme())) { 3161e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mimeType = mService.getProviderMimeType(intent.getData(), userId); 3162e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 316391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn return startActivityMayWait(null, -1, null, intent, mimeType, null, null, null, null, 0, 0, null, 3164e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner null, null, null, null, userId, this); 31654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 31664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 31674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3168df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner public final int startActivityIntentSender(IIntentSender intentSender) { 3169df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender"); 3170df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 3171df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (!(intentSender instanceof PendingIntentRecord)) { 3172df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner throw new IllegalArgumentException("Bad PendingIntent object"); 3173df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 3174df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 3175df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner return ((PendingIntentRecord)intentSender).sendInner(0, null, null, null, null, null, 31767f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner null, 0, FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this); 3177df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 3178df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 3179247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner private void checkEmbeddedAllowedInner(Intent intent, String resolvedType) { 3180247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner int userId = mService.handleIncomingUser(Binder.getCallingPid(), 3181247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner Binder.getCallingUid(), mCurrentUser, false, true, "ActivityContainer", null); 3182247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner if (resolvedType == null) { 3183247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner resolvedType = intent.getType(); 3184247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner if (resolvedType == null && intent.getData() != null 3185247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner && "content".equals(intent.getData().getScheme())) { 3186247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner resolvedType = mService.getProviderMimeType(intent.getData(), userId); 3187247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3188247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3189247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, null, userId); 319005678d5a3136a747a2e7eaccca0ad148c52a2d00Craig Mautner if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) { 3191247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner throw new SecurityException( 3192247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner "Attempt to embed activity that has not set allowEmbedded=\"true\""); 3193247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3194247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3195247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner 3196247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner /** Throw a SecurityException if allowEmbedded is not true */ 3197247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner @Override 3198247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner public final void checkEmbeddedAllowed(Intent intent) { 3199247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner checkEmbeddedAllowedInner(intent, null); 3200247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3201247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner 3202247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner /** Throw a SecurityException if allowEmbedded is not true */ 3203247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner @Override 3204247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner public final void checkEmbeddedAllowedIntentSender(IIntentSender intentSender) { 3205247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner if (!(intentSender instanceof PendingIntentRecord)) { 3206247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner throw new IllegalArgumentException("Bad PendingIntent object"); 3207247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3208247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender; 3209247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner checkEmbeddedAllowedInner(pendingIntent.key.requestIntent, 3210247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner pendingIntent.key.requestResolvedType); 3211247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3212247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner 3213df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner @Override 32144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public IBinder asBinder() { 32154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return this; 32164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 32174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 32184504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner @Override 3219f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public void setSurface(Surface surface, int width, int height, int density) { 3220df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface"); 32214504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 32224504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner 32234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStackSupervisor getOuter() { 32244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return ActivityStackSupervisor.this; 32254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 32264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 32274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner boolean isAttached() { 3228e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return mActivityDisplay != null; 32294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 32304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 32314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner void getBounds(Point outBounds) { 3232e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mActivityDisplay != null) { 3233e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay.getBounds(outBounds); 32344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } else { 32354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner outBounds.set(0, 0); 32364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3237ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 323834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner 32396985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner // TODO: Make sure every change to ActivityRecord.visible results in a call to this. 3240e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner void setVisible(boolean visible) { 3241e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner if (mVisible != visible) { 3242e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner mVisible = visible; 3243e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner if (mCallback != null) { 3244e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0, 3245e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner 0 /* unused */, this).sendToTarget(); 3246e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3247e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3248e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3249e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner 32506985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner void setDrawn() { 32516985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 32526985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 325334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner @Override 325434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner public String toString() { 325534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner return mIdString + (mActivityDisplay == null ? "N" : "A"); 325634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 3257ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 3258ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3259f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private class VirtualActivityContainer extends ActivityContainer { 3260f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner Surface mSurface; 32616985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner boolean mDrawn = false; 3262f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3263f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) { 3264f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner super(getNextStackId()); 3265f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mParentActivity = parent; 3266f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mCallback = callback; 3267f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mContainerState = CONTAINER_STATE_NO_SURFACE; 3268f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mIdString = "VirtualActivtyContainer{" + mStackId + ", parent=" + mParentActivity + "}"; 3269f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3270f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3271f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 3272f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public void setSurface(Surface surface, int width, int height, int density) { 3273f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner super.setSurface(surface, width, height, density); 3274f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3275f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner synchronized (mService) { 3276f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final long origId = Binder.clearCallingIdentity(); 3277f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner try { 3278f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner setSurfaceLocked(surface, width, height, density); 3279f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } finally { 3280f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner Binder.restoreCallingIdentity(origId); 3281f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3282f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3283f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3284f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3285f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private void setSurfaceLocked(Surface surface, int width, int height, int density) { 3286f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mContainerState == CONTAINER_STATE_FINISHING) { 3287f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return; 3288f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3289f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner VirtualActivityDisplay virtualActivityDisplay = 3290f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner (VirtualActivityDisplay) mActivityDisplay; 3291f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (virtualActivityDisplay == null) { 3292f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner virtualActivityDisplay = 32936985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner new VirtualActivityDisplay(width, height, density); 3294f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityDisplay = virtualActivityDisplay; 3295f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay); 3296f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner attachToDisplayLocked(virtualActivityDisplay); 3297f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3298f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3299f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mSurface != null) { 3300f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mSurface.release(); 3301f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3302f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 33036985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner mSurface = surface; 3304f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (surface != null) { 3305f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mStack.resumeTopActivityLocked(null); 3306f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } else { 3307f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mContainerState = CONTAINER_STATE_NO_SURFACE; 33086985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner ((VirtualActivityDisplay) mActivityDisplay).setSurface(null); 3309d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) { 3310d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner mStack.startPausingLocked(false, true); 3311d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner } 3312f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 33136985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 33146985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner setSurfaceIfReady(); 33156985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 3316f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display=" 3317f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner + virtualActivityDisplay); 33186985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 3319f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 33206985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner @Override 3321d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner boolean isAttached() { 3322d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner return mSurface != null && super.isAttached(); 3323d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner } 3324d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner 3325d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner @Override 33266985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner void setDrawn() { 33276985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner synchronized (mService) { 33286985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner mDrawn = true; 33296985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner setSurfaceIfReady(); 33306985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 33316985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 33326985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 33336985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner private void setSurfaceIfReady() { 33346985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReady: mDrawn=" + mDrawn + 33356985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner " mContainerState=" + mContainerState + " mSurface=" + mSurface); 33366985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) { 33376985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface); 33386985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner mContainerState = CONTAINER_STATE_HAS_SURFACE; 33396985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 3340f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3341f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3342f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 33434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Exactly one of these classes per Display in the system. Capable of holding zero or more 33444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner * attached {@link ActivityStack}s */ 3345f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner class ActivityDisplay { 33464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Actual Display this object tracks. */ 334734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner int mDisplayId; 334834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner Display mDisplay; 334934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner DisplayInfo mDisplayInfo = new DisplayInfo(); 33504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** All of the stacks on this display. Order matters, topmost stack is in front of all other 33524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner * stacks, bottommost behind. Accessed directly by ActivityManager package classes */ 3353e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); 33544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3355f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityDisplay() { 3356f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 33574504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner 3358e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay(int displayId) { 335934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner init(mDisplayManager.getDisplay(displayId)); 33604504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 33614504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner 3362f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner void init(Display display) { 33634504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mDisplay = display; 33644504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mDisplayId = display.getDisplayId(); 33654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplay.getDisplayInfo(mDisplayInfo); 33664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner void attachActivities(ActivityStack stack) { 3369e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_STACK) Slog.v(TAG, "attachActivities: attaching " + stack + " to displayId=" 3370e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner + mDisplayId); 3371e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStacks.add(stack); 33724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3374e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner void detachActivitiesLocked(ActivityStack stack) { 337534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.v(TAG, "detachActivitiesLocked: detaching " + stack 3376e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner + " from displayId=" + mDisplayId); 3377e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStacks.remove(stack); 33784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner void getBounds(Point bounds) { 33814a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplay.getDisplayInfo(mDisplayInfo); 33824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner bounds.x = mDisplayInfo.appWidth; 33834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner bounds.y = mDisplayInfo.appHeight; 3384ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 338534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner 338634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner @Override 338734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner public String toString() { 3388f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}"; 3389f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3390f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3391f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3392f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner class VirtualActivityDisplay extends ActivityDisplay { 3393f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner VirtualDisplay mVirtualDisplay; 3394f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 33956985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner VirtualActivityDisplay(int width, int height, int density) { 3396f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); 3397f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, VIRTUAL_DISPLAY_BASE_NAME, 33986985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner width, height, density, null, DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | 3399f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY); 3400f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3401f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner init(mVirtualDisplay.getDisplay()); 3402f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3403f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mWindowManager.handleDisplayAdded(mDisplayId); 3404f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3405f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3406f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner void setSurface(Surface surface) { 3407f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mVirtualDisplay != null) { 3408f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay.setSurface(surface); 3409f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3410f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3411f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3412f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 3413f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner void detachActivitiesLocked(ActivityStack stack) { 3414f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner super.detachActivitiesLocked(stack); 3415f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mVirtualDisplay != null) { 3416f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay.release(); 3417f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay = null; 3418f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3419f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3420f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3421f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 3422f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public String toString() { 3423f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return "VirtualActivityDisplay={" + mDisplayId + "}"; 342434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 3425ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 3426270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner} 3427