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; 277de0535701351d76b634ab18577269e8130749eaWale Ogunwaleimport static com.android.server.am.ActivityManagerService.DEBUG_RECENTS; 286170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_RESULTS; 290eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_STACK; 302420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_SWITCH; 318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_TASKS; 328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING; 3305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautnerimport static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG; 348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG; 3584984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE; 3684984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE; 3784984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE; 388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 392420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity; 4023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager; 41ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.app.ActivityManager.StackInfo; 4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions; 4323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals; 444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainer; 454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainerCallback; 46ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager; 4723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread; 4823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent; 491b012d302b56b4adf950035136d1d191a1936d5aJeff Haoimport android.app.ProfilerInfo; 5020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo; 5123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult; 522420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo; 535286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport android.app.StatusBarManager; 5435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monkimport android.app.admin.IDevicePolicyManager; 5523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName; 562219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context; 5723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender; 582219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent; 5923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender; 602219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo; 6123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo; 6223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager; 6323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo; 6423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration; 654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.graphics.Point; 664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager; 674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager.DisplayListener; 684504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.DisplayManagerGlobal; 694504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.VirtualDisplay; 70ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManager; 71ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManagerInternal; 7223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder; 738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle; 74b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug; 75ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler; 7623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder; 772219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper; 782420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message; 7923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor; 800eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport android.os.PowerManager; 817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautnerimport android.os.Process; 828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException; 835286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport android.os.ServiceManager; 8423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock; 856170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle; 8662515beee67307d8859beec521b7baedfa54b2b5Jason Monkimport android.provider.Settings; 8762515beee67307d8859beec521b7baedfa54b2b5Jason Monkimport android.provider.Settings.SettingNotFoundException; 8891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionSession; 8989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.util.ArraySet; 902420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog; 918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog; 924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseArray; 932219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseIntArray; 95ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.view.Display; 964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.view.DisplayInfo; 97ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.view.InputEvent; 984504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.view.Surface; 9923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity; 10091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor; 10185d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackbornimport com.android.internal.content.ReferrerIntent; 102cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe; 1035286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport com.android.internal.statusbar.IStatusBarService; 104e069779dea07c77fb858a403c42020e39b3d9c60Jason Monkimport com.android.internal.widget.LockPatternUtils; 105ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport com.android.server.LocalServices; 1062420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState; 107ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService; 10823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 1095286d3ff47135976d66d67888cadca52ef2ab244justinzhang 1108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor; 1118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException; 112270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter; 1132219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList; 1148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List; 115270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 1164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerpublic final class ActivityStackSupervisor implements DisplayListener { 117de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG = ActivityManagerService.DEBUG || false; 118de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG_ADD_REMOVE = DEBUG || false; 119de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG_APP = DEBUG || false; 120d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner static final boolean DEBUG_CONTAINERS = DEBUG || false; 121b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner static final boolean DEBUG_IDLE = DEBUG || false; 12289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn static final boolean DEBUG_RELEASE = DEBUG || false; 123d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner static final boolean DEBUG_SAVED_STATE = DEBUG || false; 124cc12f28e5dc6bd027971c995c7aab63dadcc0d35Winson Chung static final boolean DEBUG_SCREENSHOTS = DEBUG || false; 12530bd3bb77b8bd1ac70723bcf7f1017fc40ea89b2Craig Mautner static final boolean DEBUG_STATES = DEBUG || false; 12689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn static final boolean DEBUG_VISIBLE_BEHIND = DEBUG || false; 1272420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1282219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner public static final int HOME_STACK_ID = 0; 129270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 130f333327782e14688e1c198c1192172d51308e90bCraig Mautner /** How long we wait until giving up on the last activity telling us it is idle. */ 131f333327782e14688e1c198c1192172d51308e90bCraig Mautner static final int IDLE_TIMEOUT = 10*1000; 132f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1330eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** How long we can hold the sleep wake lock before giving up. */ 1340eea92c67b292b005c152641a12b920fe145826cCraig Mautner static final int SLEEP_TIMEOUT = 5*1000; 1350eea92c67b292b005c152641a12b920fe145826cCraig Mautner 1367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // How long we can hold the launch wake lock before giving up. 1377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner static final int LAUNCH_TIMEOUT = 10*1000; 1387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 13905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG; 14005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1; 14105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2; 1420eea92c67b292b005c152641a12b920fe145826cCraig Mautner static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3; 1437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4; 1444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5; 1454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6; 1464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7; 147e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8; 1485286d3ff47135976d66d67888cadca52ef2ab244justinzhang static final int LOCK_TASK_START_MSG = FIRST_SUPERVISOR_STACK_MSG + 9; 1495286d3ff47135976d66d67888cadca52ef2ab244justinzhang static final int LOCK_TASK_END_MSG = FIRST_SUPERVISOR_STACK_MSG + 10; 150b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 11; 1514c07d0246fb37e6a77be2c5cdcdf55a989b90f75Craig Mautner static final int CONTAINER_TASK_LIST_EMPTY_TIMEOUT = FIRST_SUPERVISOR_STACK_MSG + 12; 152bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_STACK_MSG + 13; 1534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 1544504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay"; 1557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 15662515beee67307d8859beec521b7baedfa54b2b5Jason Monk private static final String LOCK_TASK_TAG = "Lock-to-App"; 15762515beee67307d8859beec521b7baedfa54b2b5Jason Monk 1585286d3ff47135976d66d67888cadca52ef2ab244justinzhang /** Status Bar Service **/ 1595286d3ff47135976d66d67888cadca52ef2ab244justinzhang private IBinder mToken = new Binder(); 1605286d3ff47135976d66d67888cadca52ef2ab244justinzhang private IStatusBarService mStatusBarService; 16135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk private IDevicePolicyManager mDevicePolicyManager; 1625286d3ff47135976d66d67888cadca52ef2ab244justinzhang 1637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // For debugging to make sure the caller when acquiring/releasing our 1647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // wake lock is the system process. 1657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner static final boolean VALIDATE_WAKE_LOCK_CALLER = false; 166f333327782e14688e1c198c1192172d51308e90bCraig Mautner 167270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner final ActivityManagerService mService; 168270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 169ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStackSupervisorHandler mHandler; 170ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 171ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner /** Short cut */ 172ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner WindowManagerService mWindowManager; 1734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner DisplayManager mDisplayManager; 174ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 1758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** Identifier counter for all ActivityStacks */ 176d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner private int mLastStackId = HOME_STACK_ID; 1778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** Task identifier that activities are currently being started in. Incremented each time a 1798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * new task is created. */ 1808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner private int mCurTaskId = 0; 1818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1822420ead0326bfd2587da6231be419e758dba1930Craig Mautner /** The current user */ 1832420ead0326bfd2587da6231be419e758dba1930Craig Mautner private int mCurrentUser; 1842420ead0326bfd2587da6231be419e758dba1930Craig Mautner 185e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner /** The stack containing the launcher app. Assumed to always be attached to 186e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner * Display.DEFAULT_DISPLAY. */ 1872219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner private ActivityStack mHomeStack; 18820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 189e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner /** The stack currently receiving input or launching the next activity. */ 19029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner private ActivityStack mFocusedStack; 1918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** If this is the same as mFocusedStack then the activity on the top of the focused stack has 1934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner * been resumed. If stacks are changing position this will hold the old stack until the new 194e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner * stack becomes resumed after which it will be set to mFocusedStack. */ 1954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner private ActivityStack mLastFocusedStack; 196de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 197de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner /** List of activities that are waiting for a new activity to become visible before completing 198de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner * whatever operation they are supposed to do. */ 199de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>(); 200de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 201ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner /** List of processes waiting to find out about the next visible activity. */ 202ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible = 203ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner new ArrayList<IActivityManager.WaitResult>(); 204ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 205ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner /** List of processes waiting to find out about the next launched activity. */ 206ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched = 207ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner new ArrayList<IActivityManager.WaitResult>(); 208ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 209de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner /** List of activities that are ready to be stopped, but waiting for the next activity to 210de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner * settle down before doing so. */ 211de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>(); 212de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 213f333327782e14688e1c198c1192172d51308e90bCraig Mautner /** List of activities that are ready to be finished, but waiting for the previous activity to 214f333327782e14688e1c198c1192172d51308e90bCraig Mautner * settle down before doing so. It contains ActivityRecord objects. */ 215f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>(); 216f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2170eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** List of activities that are in the process of going to sleep. */ 2180eea92c67b292b005c152641a12b920fe145826cCraig Mautner final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>(); 2190eea92c67b292b005c152641a12b920fe145826cCraig Mautner 220f333327782e14688e1c198c1192172d51308e90bCraig Mautner /** Used on user changes */ 221f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>(); 222f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2231a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani /** Used to queue up any background users being started */ 2241a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani final ArrayList<UserStartedState> mStartingBackgroundUsers = new ArrayList<UserStartedState>(); 2251a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani 226de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity 227de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner * is being brought in front of us. */ 228de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean mUserLeaving = false; 229de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2300eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** Set when we have taken too long waiting to go to sleep. */ 2310eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean mSleepTimeout = false; 2320eea92c67b292b005c152641a12b920fe145826cCraig Mautner 23358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima /** Indicates if we are running on a Leanback-only (TV) device. Only initialized after 23458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima * setWindowManager is called. **/ 23558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima private boolean mLeanbackOnlyDevice; 23658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 2370eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** 2387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * We don't want to allow the device to go to sleep while in the process 2397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * of launching an activity. This is primarily to allow alarm intent 2407ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * receivers to launch an activity and get that to run before the device 2417ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * goes back to sleep. 2427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner */ 2432c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown PowerManager.WakeLock mLaunchingActivity; 2447ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 2457ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner /** 2460eea92c67b292b005c152641a12b920fe145826cCraig Mautner * Set when the system is going to sleep, until we have 2470eea92c67b292b005c152641a12b920fe145826cCraig Mautner * successfully paused the current activity and released our wake lock. 2480eea92c67b292b005c152641a12b920fe145826cCraig Mautner * At that point the system is allowed to actually sleep. 2490eea92c67b292b005c152641a12b920fe145826cCraig Mautner */ 2502c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown PowerManager.WakeLock mGoingToSleep; 2510eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2524f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner /** Stack id of the front stack when user switched, indexed by userId. */ 2534f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner SparseIntArray mUserStackInFront = new SparseIntArray(2); 25493529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner 2554504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner // TODO: Add listener for removal of references. 2564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */ 257d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>(); 2584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 2594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Mapping from displayId to display current state */ 260f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private final SparseArray<ActivityDisplay> mActivityDisplays = 261f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner new SparseArray<ActivityDisplay>(); 2624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 263ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown InputManagerInternal mInputManagerInternal; 264ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown 265aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner /** If non-null then the task specified remains in front and no other tasks may be started 266aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner * until the task exits or #stopLockTaskMode() is called. */ 267d7b8621bde44857ebb07130693a00f5f777887d4Jason Monk TaskRecord mLockTaskModeTask; 268a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk /** Whether lock task has been entered by an authorized app and cannot 269a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk * be exited. */ 270a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk private boolean mLockTaskIsLocked; 27162515beee67307d8859beec521b7baedfa54b2b5Jason Monk /** 27262515beee67307d8859beec521b7baedfa54b2b5Jason Monk * Notifies the user when entering/exiting lock-task. 27362515beee67307d8859beec521b7baedfa54b2b5Jason Monk */ 27462515beee67307d8859beec521b7baedfa54b2b5Jason Monk private LockTaskNotify mLockTaskNotify; 275aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 276ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ArrayList<PendingActivityLaunch> mPendingActivityLaunches 277ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner = new ArrayList<PendingActivityLaunch>(); 278ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 27942d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner /** Used to keep resumeTopActivityLocked() from being entered recursively */ 28042d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner boolean inResumeTopActivity; 28142d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner 282ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner /** 283ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner * Description of a request to start a new activity, which has been held 284ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner * due to app switches being disabled. 285ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner */ 286ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner static class PendingActivityLaunch { 287ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ActivityRecord r; 288ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ActivityRecord sourceRecord; 289ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final int startFlags; 290ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ActivityStack stack; 291ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 292ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord, 293ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner int _startFlags, ActivityStack _stack) { 294ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner r = _r; 295ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner sourceRecord = _sourceRecord; 296ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner startFlags = _startFlags; 297ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner stack = _stack; 298ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 299ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 300ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 3014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public ActivityStackSupervisor(ActivityManagerService service) { 302270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mService = service; 3032c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper()); 3042c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 3052c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 3062c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown /** 3072c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * At the time when the constructor runs, the power manager has not yet been 3082c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * initialized. So we initialize our wakelocks afterwards. 3092c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown */ 3102c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown void initPowerManagement() { 3114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE); 3120eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 3137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity = 3147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 3157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.setReferenceCounted(false); 3162219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 3172219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 3185286d3ff47135976d66d67888cadca52ef2ab244justinzhang // This function returns a IStatusBarService. The value is from ServiceManager. 3195286d3ff47135976d66d67888cadca52ef2ab244justinzhang // getService and is cached. 3205286d3ff47135976d66d67888cadca52ef2ab244justinzhang private IStatusBarService getStatusBarService() { 3215286d3ff47135976d66d67888cadca52ef2ab244justinzhang synchronized (mService) { 3225286d3ff47135976d66d67888cadca52ef2ab244justinzhang if (mStatusBarService == null) { 3235286d3ff47135976d66d67888cadca52ef2ab244justinzhang mStatusBarService = IStatusBarService.Stub.asInterface( 3245286d3ff47135976d66d67888cadca52ef2ab244justinzhang ServiceManager.checkService(Context.STATUS_BAR_SERVICE)); 3255286d3ff47135976d66d67888cadca52ef2ab244justinzhang if (mStatusBarService == null) { 3265286d3ff47135976d66d67888cadca52ef2ab244justinzhang Slog.w("StatusBarManager", "warning: no STATUS_BAR_SERVICE"); 3275286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3285286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3295286d3ff47135976d66d67888cadca52ef2ab244justinzhang return mStatusBarService; 3305286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3315286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3325286d3ff47135976d66d67888cadca52ef2ab244justinzhang 33335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk private IDevicePolicyManager getDevicePolicyManager() { 33435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk synchronized (mService) { 33535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk if (mDevicePolicyManager == null) { 33635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk mDevicePolicyManager = IDevicePolicyManager.Stub.asInterface( 33735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk ServiceManager.checkService(Context.DEVICE_POLICY_SERVICE)); 33835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk if (mDevicePolicyManager == null) { 33935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk Slog.w(TAG, "warning: no DEVICE_POLICY_SERVICE"); 34035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 34135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 34235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk return mDevicePolicyManager; 34335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 34435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 34535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk 346ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void setWindowManager(WindowManagerService wm) { 3474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 3484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager = wm; 3494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplayManager = 3514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner (DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE); 3524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplayManager.registerDisplayListener(this, null); 3534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner Display[] displays = mDisplayManager.getDisplays(); 3554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) { 3564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int displayId = displays[displayNdx].getDisplayId(); 357e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = new ActivityDisplay(displayId); 3581a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner if (activityDisplay.mDisplay == null) { 3591a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner throw new IllegalStateException("Default Display does not exist"); 3601a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner } 361e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplays.put(displayId, activityDisplay); 3624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 364f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner createStackOnDisplay(HOME_STACK_ID, Display.DEFAULT_DISPLAY); 3654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHomeStack = mFocusedStack = mLastFocusedStack = getStack(HOME_STACK_ID); 366ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown 367ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); 36858e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 36958e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima // Initialize this here, now that we can get a valid reference to PackageManager. 37058e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima mLeanbackOnlyDevice = isLeanbackOnlyDevice(); 3714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 372270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 373270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 3748de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi void notifyActivityDrawnForKeyguard() { 3755314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(""); 3768de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mWindowManager.notifyActivityDrawnForKeyguard(); 377270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 378270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 379ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack getFocusedStack() { 3804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return mFocusedStack; 38120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 38220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 383de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack getLastStack() { 3844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return mLastFocusedStack; 3852219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 3862219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 3874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // TODO: Split into two methods isFrontStack for any visible stack and isFrontmostStack for the 3884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // top of all visible stacks. 389de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean isFrontStack(ActivityStack stack) { 390df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner final ActivityRecord parent = stack.mActivityContainer.mParentActivity; 391df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (parent != null) { 392df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner stack = parent.task.stack; 393df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 394e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = stack.mStacks; 3954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stacks != null && !stacks.isEmpty()) { 3964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return stack == stacks.get(stacks.size() - 1); 3974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 39920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 40020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 401299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner void moveHomeStack(boolean toFront, String reason) { 402e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mHomeStack.mStacks; 403de313753d0fd0173d0558518d9a410fdc0127c76Craig Mautner final int topNdx = stacks.size() - 1; 4044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (topNdx <= 0) { 4054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return; 4064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 4074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStack topStack = stacks.get(topNdx); 4084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final boolean homeInFront = topStack == mHomeStack; 4094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (homeInFront != toFront) { 4104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mLastFocusedStack = topStack; 4114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.remove(mHomeStack); 4124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.add(toFront ? topNdx : 0, mHomeStack); 4134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mFocusedStack = stacks.get(topNdx); 4144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: topStack old=" + topStack + " new=" 4154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner + mFocusedStack); 416de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 417de313753d0fd0173d0558518d9a410fdc0127c76Craig Mautner EventLog.writeEvent(EventLogTags.AM_HOME_STACK_MOVED, 418de313753d0fd0173d0558518d9a410fdc0127c76Craig Mautner mCurrentUser, toFront ? 1 : 0, stacks.get(topNdx).getStackId(), 419299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner mFocusedStack == null ? -1 : mFocusedStack.getStackId(), reason); 420de313753d0fd0173d0558518d9a410fdc0127c76Craig Mautner 421f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner if (mService.mBooting || !mService.mBooted) { 422f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner final ActivityRecord r = topRunningActivityLocked(); 423f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner if (r != null && r.idle) { 424f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner checkFinishBootingLocked(); 425f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner } 426f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner } 427de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 428de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 429299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner void moveHomeStackTaskToTop(int homeStackTaskType, String reason) { 43084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { 43184984faf530e525b066e28710d0f9beb32142ec5Craig Mautner mWindowManager.showRecentApps(); 43284984faf530e525b066e28710d0f9beb32142ec5Craig Mautner return; 43384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner } 434299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner moveHomeStack(true, reason); 43584984faf530e525b066e28710d0f9beb32142ec5Craig Mautner mHomeStack.moveHomeStackTaskToTop(homeStackTaskType); 4368e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner } 4378e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner 438299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev, String reason) { 4397622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn if (!mService.mBooting && !mService.mBooted) { 4407622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn // Not ready yet! 4417622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn return false; 4427622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn } 4437622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn 44484984faf530e525b066e28710d0f9beb32142ec5Craig Mautner if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { 44584984faf530e525b066e28710d0f9beb32142ec5Craig Mautner mWindowManager.showRecentApps(); 44684984faf530e525b066e28710d0f9beb32142ec5Craig Mautner return false; 44784984faf530e525b066e28710d0f9beb32142ec5Craig Mautner } 448299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner moveHomeStackTaskToTop(homeStackTaskType, reason); 44969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner if (prev != null) { 45084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE); 45169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 45284984faf530e525b066e28710d0f9beb32142ec5Craig Mautner 453a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner ActivityRecord r = mHomeStack.topRunningActivityLocked(null); 45484984faf530e525b066e28710d0f9beb32142ec5Craig Mautner // if (r != null && (r.isHomeActivity() || r.isRecentsActivity())) { 455719e621186adc1ba5a365bddea01cbe73bb26b02Craig Mautner if (r != null && r.isHomeActivity()) { 456299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner mService.setFocusedActivityLocked(r, reason); 45705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return resumeTopActivitiesLocked(mHomeStack, prev, null); 45869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 459299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner return mService.startHomeActivityLocked(mCurrentUser, reason); 46069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 46169ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner 4628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord anyTaskForIdLocked(int id) { 463e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner int numDisplays = mActivityDisplays.size(); 4644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 465e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 4664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 4674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStack stack = stacks.get(stackNdx); 4684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner TaskRecord task = stack.taskForIdLocked(id); 4694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (task != null) { 4704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return task; 4714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 4728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4747de0535701351d76b634ab18577269e8130749eaWale Ogunwale 4757de0535701351d76b634ab18577269e8130749eaWale Ogunwale // Don't give up! Look in recents. 4767de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (DEBUG_RECENTS) Slog.v(TAG, "Looking for task id=" + id + " in recents"); 4777de0535701351d76b634ab18577269e8130749eaWale Ogunwale TaskRecord task = mService.recentTaskForIdLocked(id); 4787de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (task == null) { 4797de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (DEBUG_RECENTS) Slog.d(TAG, "\tDidn't find task id=" + id + " in recents"); 4807de0535701351d76b634ab18577269e8130749eaWale Ogunwale return null; 4817de0535701351d76b634ab18577269e8130749eaWale Ogunwale } 4827de0535701351d76b634ab18577269e8130749eaWale Ogunwale 4837de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (!restoreRecentTaskLocked(task)) { 4847de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (DEBUG_RECENTS) Slog.w(TAG, "Couldn't restore task id=" + id + " found in recents"); 4857de0535701351d76b634ab18577269e8130749eaWale Ogunwale return null; 4867de0535701351d76b634ab18577269e8130749eaWale Ogunwale } 4877de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (DEBUG_RECENTS) Slog.w(TAG, "Restored task id=" + id + " from in recents"); 4887de0535701351d76b634ab18577269e8130749eaWale Ogunwale return task; 4898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 4916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord isInAnyStackLocked(IBinder token) { 492e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner int numDisplays = mActivityDisplays.size(); 4934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 494e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 4954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 4964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stacks.get(stackNdx).isInStackLocked(token); 4974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null) { 4984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return r; 4994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 5006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 5016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 5026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return null; 5036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 5046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 505ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner void setNextTaskId(int taskId) { 506ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (taskId > mCurTaskId) { 507ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner mCurTaskId = taskId; 508ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 509ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 510ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 5118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner int getNextTaskId() { 5128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner do { 5138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId++; 5148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (mCurTaskId <= 0) { 5158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId = 1; 5168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 5178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } while (anyTaskForIdLocked(mCurTaskId) != null); 5188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return mCurTaskId; 5198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 5208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 521de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord resumedAppLocked() { 522ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack stack = getFocusedStack(); 523ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (stack == null) { 524ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return null; 525ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 526de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord resumedActivity = stack.mResumedActivity; 527de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (resumedActivity == null || resumedActivity.app == null) { 528de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resumedActivity = stack.mPausingActivity; 529de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (resumedActivity == null || resumedActivity.app == null) { 530de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resumedActivity = stack.topRunningActivityLocked(null); 531de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 532de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 533de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return resumedActivity; 534de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 535de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 536ff072725e39b8c6928d6ca2d7e263d7d081a2288Dianne Hackborn boolean attachApplicationLocked(ProcessRecord app) throws RemoteException { 53720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final String processName = app.processName; 5384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner boolean didSomething = false; 539e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 540e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 5414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 5434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (!isFrontStack(stack)) { 5444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner continue; 5454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 5464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityRecord hr = stack.topRunningActivityLocked(null); 5474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (hr != null) { 5484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (hr.app == null && app.uid == hr.info.applicationInfo.uid 5494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner && processName.equals(hr.processName)) { 5504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner try { 5512c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount if (realStartActivityLocked(hr, app, true, true)) { 5524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner didSomething = true; 5534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 554ff072725e39b8c6928d6ca2d7e263d7d081a2288Dianne Hackborn } catch (RemoteException e) { 5554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner Slog.w(TAG, "Exception in new application when starting activity " 5564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner + hr.intent.getComponent().flattenToShortString(), e); 5574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner throw e; 55820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 55920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 56020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 56120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 56220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 563b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (!didSomething) { 564b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner ensureActivitiesVisibleLocked(null, 0); 565b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner } 56620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return didSomething; 56720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 56820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 56920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean allResumedActivitiesIdle() { 570e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 571e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 5724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 57434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (!isFrontStack(stack) || stack.numActivities() == 0) { 5754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner continue; 5764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 5774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord resumedActivity = stack.mResumedActivity; 5784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (resumedActivity == null || !resumedActivity.idle) { 57934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STATES) Slog.d(TAG, "allResumedActivitiesIdle: stack=" 58034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner + stack.mStackId + " " + resumedActivity + " not idle"); 5814a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 5824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 58320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 58420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 58520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return true; 58620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 58720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 588de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allResumedActivitiesComplete() { 589e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 590e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 5914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 5934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 5944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stack.mResumedActivity; 5954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null && r.state != ActivityState.RESUMED) { 5964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 5974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 598de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 599de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 600de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 601de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // TODO: Not sure if this should check if all Paused are complete too. 6024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STACK) Slog.d(TAG, 6034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner "allResumedActivitiesComplete: mLastFocusedStack changing from=" + 6044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mLastFocusedStack + " to=" + mFocusedStack); 6054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mLastFocusedStack = mFocusedStack; 606de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return true; 607de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 608de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 609de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allResumedActivitiesVisible() { 610e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 611e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 6124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 6134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 6144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stack.mResumedActivity; 6154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null && (!r.nowVisible || r.waitingVisible)) { 6164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 6174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 618de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 619de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 620de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return true; 621de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 622de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 6232acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner /** 6242acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner * Pause all activities in either all of the stacks or just the back stacks. 6252acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving(). 6262acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner * @return true if any activity was paused as a result of this call. 6272acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner */ 628a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn boolean pauseBackStacks(boolean userLeaving, boolean resuming, boolean dontWait) { 629cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner boolean someActivityPaused = false; 630e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 631e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 6324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 6334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 6344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (!isFrontStack(stack) && stack.mResumedActivity != null) { 6354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack + 6364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mResumedActivity=" + stack.mResumedActivity); 637a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn someActivityPaused |= stack.startPausingLocked(userLeaving, false, resuming, 638a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn dontWait); 6394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 640cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 641cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 642cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner return someActivityPaused; 643cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 644cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 645de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allPausedActivitiesComplete() { 646ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner boolean pausing = true; 647e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 648e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 6494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 6504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 6514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stack.mPausingActivity; 6524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null && r.state != ActivityState.PAUSED 6534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner && r.state != ActivityState.STOPPED 6544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner && r.state != ActivityState.STOPPING) { 6554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STATES) { 6564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state); 6574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pausing = false; 6584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } else { 6594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 6604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 661ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 662de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 663de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 664ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return pausing; 665de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 666de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 667a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping, 668a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn boolean resuming, boolean dontWait) { 6698a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock // TODO: Put all stacks in supervisor and iterate through them instead. 670df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 671df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 672df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 673df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner final ActivityStack stack = stacks.get(stackNdx); 674df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (stack.mResumedActivity != null && 675df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner stack.mActivityContainer.mParentActivity == parent) { 676a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn stack.startPausingLocked(userLeaving, uiSleeping, resuming, dontWait); 677df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 678df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 679df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 680df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 681df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 682ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void reportActivityVisibleLocked(ActivityRecord r) { 6836cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn sendWaitingVisibleReportLocked(r); 6846cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 6856cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn 6866cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn void sendWaitingVisibleReportLocked(ActivityRecord r) { 6876cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn boolean changed = false; 688858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) { 689ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner WaitResult w = mWaitingActivityVisible.get(i); 6906cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (w.who == null) { 6916cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn changed = true; 6926cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.timeout = false; 6936cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (r != null) { 6946cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 6956cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 6966cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 6976cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.thisTime = w.totalTime; 698ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 699ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 7006cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (changed) { 7016cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn mService.notifyAll(); 7026cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 703ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 704ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 705ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 706ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner long thisTime, long totalTime) { 7076cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn boolean changed = false; 708ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) { 709c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner WaitResult w = mWaitingActivityLaunched.remove(i); 7106cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (w.who == null) { 7116cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn changed = true; 7126cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.timeout = timeout; 7136cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (r != null) { 7146cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 7156cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 7166cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.thisTime = thisTime; 7176cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.totalTime = totalTime; 718ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 719ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 7206cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (changed) { 7216cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn mService.notifyAll(); 7226cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 723ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 724ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 72529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner ActivityRecord topRunningActivityLocked() { 7261602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner final ActivityStack focusedStack = getFocusedStack(); 7271602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner ActivityRecord r = focusedStack.topRunningActivityLocked(null); 7281602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner if (r != null) { 7291602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner return r; 73029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 7311602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner 7324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // Return to the home stack. 733e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mHomeStack.mStacks; 7344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 7354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 736ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (stack != focusedStack && isFrontStack(stack)) { 73729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner r = stack.topRunningActivityLocked(null); 73829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r != null) { 73929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return r; 74029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 74129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 74229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 74329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return null; 74429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 74529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner 74609233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn void getTasksLocked(int maxNum, List<RunningTaskInfo> list, int callingUid, boolean allowed) { 747c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner // Gather all of the running tasks for each stack into runningTaskLists. 7484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<ArrayList<RunningTaskInfo>> runningTaskLists = 7494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner new ArrayList<ArrayList<RunningTaskInfo>>(); 750e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final int numDisplays = mActivityDisplays.size(); 7514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 752e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 7534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 7544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 7554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>(); 7564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner runningTaskLists.add(stackTaskList); 75709233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn stack.getTasksLocked(stackTaskList, callingUid, allowed); 75820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 75920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 760c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner 761c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner // The lists are already sorted from most recent to oldest. Just pull the most recent off 762c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner // each list and add it to list. Stop when all lists are empty or maxNum reached. 763c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner while (maxNum > 0) { 764c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner long mostRecentActiveTime = Long.MIN_VALUE; 765c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner ArrayList<RunningTaskInfo> selectedStackList = null; 7664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numTaskLists = runningTaskLists.size(); 7674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numTaskLists; ++stackNdx) { 7684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists.get(stackNdx); 769c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner if (!stackTaskList.isEmpty()) { 770c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner final long lastActiveTime = stackTaskList.get(0).lastActiveTime; 771c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner if (lastActiveTime > mostRecentActiveTime) { 772c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner mostRecentActiveTime = lastActiveTime; 773c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner selectedStackList = stackTaskList; 774c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 775c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 776c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 777c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner if (selectedStackList != null) { 778c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner list.add(selectedStackList.remove(0)); 779c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner --maxNum; 780c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } else { 781c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner break; 782c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 783c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 78420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 78520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags, 7871b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ProfilerInfo profilerInfo, int userId) { 78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo; 79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ResolveInfo rInfo = 79223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner AppGlobals.getPackageManager().resolveIntent( 79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent, resolvedType, 79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner PackageManager.MATCH_DEFAULT_ONLY 79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | ActivityManagerService.STOCK_PM_FLAGS, userId); 79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = rInfo != null ? rInfo.activityInfo : null; 79723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (RemoteException e) { 79823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = null; 79923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null) { 80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Store the found target back into the intent, because now that 80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // we have it we never want to do this again. For example, if the 80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // user navigates back to this point in the history, we should 80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // always restart the exact same activity. 80623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent.setComponent(new ComponentName( 80723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo.applicationInfo.packageName, aInfo.name)); 80823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 80923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't debug things in the system process 81023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) { 81123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setDebugApp(aInfo.processName, true, false); 81323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 81423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 81523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 81623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) { 81723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 81823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName); 81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 82023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 8221b012d302b56b4adf950035136d1d191a1936d5aJeff Hao if (profilerInfo != null) { 82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 8241b012d302b56b4adf950035136d1d191a1936d5aJeff Hao mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo); 82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 82723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return aInfo; 82923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 831299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason) { 832299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE, reason); 83395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null, 83495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn 0, 0, 0, null, false, null, null, null); 8358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 8368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final int startActivityMayWait(IApplicationThread caller, int callingUid, 83891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn String callingPackage, Intent intent, String resolvedType, 83991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 8401b012d302b56b4adf950035136d1d191a1936d5aJeff Hao IBinder resultTo, String resultWho, int requestCode, int startFlags, 8411b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ProfilerInfo profilerInfo, WaitResult outResult, Configuration config, 84289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Bundle options, int userId, IActivityContainer iContainer, TaskRecord inTask) { 84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Refuse possible leaked file descriptors 84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent != null && intent.hasFileDescriptors()) { 84523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("File descriptors passed in Intent"); 84623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 84723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner boolean componentSpecified = intent.getComponent() != null; 84823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 84923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't modify the client's object! 85023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = new Intent(intent); 85123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 85223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 85323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags, 8541b012d302b56b4adf950035136d1d191a1936d5aJeff Hao profilerInfo, userId); 85523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 856e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityContainer container = (ActivityContainer)iContainer; 85723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner synchronized (mService) { 85895465200b0f652c48d40ca1028238763dd647900Dianne Hackborn final int realCallingPid = Binder.getCallingPid(); 85995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn final int realCallingUid = Binder.getCallingUid(); 86023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int callingPid; 86123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callingUid >= 0) { 86223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = -1; 86323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (caller == null) { 86495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn callingPid = realCallingPid; 86595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn callingUid = realCallingUid; 86623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 86723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = callingUid = -1; 86823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 86923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 870e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityStack stack; 871e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (container == null || container.mStack.isOnHomeDisplay()) { 872e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner stack = getFocusedStack(); 873e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } else { 874e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner stack = container.mStack; 875e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 876de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stack.mConfigWillChange = config != null 87723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner && mService.mConfiguration.diff(config) != 0; 87823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, 879de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner "Starting activity when config will change = " + stack.mConfigWillChange); 88023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 88123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final long origId = Binder.clearCallingIdentity(); 88223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 88323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null && 88423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 88523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // This may be a heavy-weight process! Check to see if we already 88623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // have another, different heavy-weight process running. 88723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 88823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (mService.mHeavyWeightProcess != null && 88923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 89023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 89195465200b0f652c48d40ca1028238763dd647900Dianne Hackborn int appCallingUid = callingUid; 89223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (caller != null) { 89323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 89423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callerApp != null) { 89595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn appCallingUid = callerApp.info.uid; 89623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 89723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Slog.w(TAG, "Unable to find app for caller " + caller 89876ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner + " (pid=" + callingPid + ") when starting: " 89923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner + intent.toString()); 90023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityOptions.abort(options); 90123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return ActivityManager.START_PERMISSION_DENIED; 90223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 90323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 90423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 90523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner IIntentSender target = mService.getIntentSenderLocked( 90623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityManager.INTENT_SENDER_ACTIVITY, "android", 90795465200b0f652c48d40ca1028238763dd647900Dianne Hackborn appCallingUid, userId, null, null, 0, new Intent[] { intent }, 90823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 90923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | PendingIntent.FLAG_ONE_SHOT, null); 91023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 91123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent newIntent = new Intent(); 91223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (requestCode >= 0) { 91323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Caller is requesting a result. 91423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 91523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 91623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 91723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner new IntentSender(target)); 91823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (mService.mHeavyWeightProcess.activities.size() > 0) { 91923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 92023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 92123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner hist.packageName); 92223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 92323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner hist.task.taskId); 92423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 92523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 92623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo.packageName); 92723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.setFlags(intent.getFlags()); 92823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.setClassName("android", 92923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner HeavyWeightSwitcherActivity.class.getName()); 93023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = newIntent; 93123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner resolvedType = null; 93223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner caller = null; 93323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 93423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 93523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner componentSpecified = true; 93623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 93723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ResolveInfo rInfo = 93823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner AppGlobals.getPackageManager().resolveIntent( 93923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent, null, 94023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner PackageManager.MATCH_DEFAULT_ONLY 94123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | ActivityManagerService.STOCK_PM_FLAGS, userId); 94223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = rInfo != null ? rInfo.activityInfo : null; 94323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = mService.getActivityInfoForUser(aInfo, userId); 94423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (RemoteException e) { 94523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = null; 94623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 94723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 94823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 94923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 95023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 95191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, aInfo, 95291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn voiceSession, voiceInteractor, resultTo, resultWho, 95395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn requestCode, callingPid, callingUid, callingPackage, 95495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn realCallingPid, realCallingUid, startFlags, options, 95589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn componentSpecified, null, container, inTask); 95623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 95785c11a8831ba9572813f122674b3680ae4d14010Craig Mautner Binder.restoreCallingIdentity(origId); 95885c11a8831ba9572813f122674b3680ae4d14010Craig Mautner 959de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stack.mConfigWillChange) { 96023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // If the caller also wants to switch to a new configuration, 96123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // do so now. This allows a clean switch, as we are waiting 96223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // for the current activity to pause (so we will not destroy 96323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // it), and have not yet started the next activity. 96423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 96523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "updateConfiguration()"); 966de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stack.mConfigWillChange = false; 96723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, 96823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "Updating to new configuration after starting activity."); 96923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.updateConfigurationLocked(config, null, false, false); 97023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 97123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 97223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (outResult != null) { 97323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.result = res; 97423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (res == ActivityManager.START_SUCCESS) { 975ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWaitingActivityLaunched.add(outResult); 97623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner do { 97723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 97823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.wait(); 97923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (InterruptedException e) { 98023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 98123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } while (!outResult.timeout && outResult.who == null); 98223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (res == ActivityManager.START_TASK_TO_FRONT) { 983de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord r = stack.topRunningActivityLocked(null); 9846cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (r.nowVisible && r.state == ActivityState.RESUMED) { 98523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.timeout = false; 98623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.who = new ComponentName(r.info.packageName, r.info.name); 98723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.totalTime = 0; 98823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.thisTime = 0; 98923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 99023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.thisTime = SystemClock.uptimeMillis(); 991ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWaitingActivityVisible.add(outResult); 99223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner do { 99323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 99423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.wait(); 99523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (InterruptedException e) { 99623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 99723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } while (!outResult.timeout && outResult.who == null); 99823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 99923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 100023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 100123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 100223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return res; 100323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 100423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 100523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 100623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final int startActivities(IApplicationThread caller, int callingUid, String callingPackage, 100723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent[] intents, String[] resolvedTypes, IBinder resultTo, 100823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Bundle options, int userId) { 100923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intents == null) { 101023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new NullPointerException("intents is null"); 101123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 101223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (resolvedTypes == null) { 101323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new NullPointerException("resolvedTypes is null"); 101423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 101523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intents.length != resolvedTypes.length) { 101623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("intents are length different than resolvedTypes"); 101723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 101823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 101923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 102023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int callingPid; 102123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callingUid >= 0) { 102223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = -1; 102323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (caller == null) { 102423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 102523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 102623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 102723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = callingUid = -1; 102823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 102923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final long origId = Binder.clearCallingIdentity(); 103023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 103123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner synchronized (mService) { 103276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner ActivityRecord[] outActivity = new ActivityRecord[1]; 103323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner for (int i=0; i<intents.length; i++) { 103423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent intent = intents[i]; 103523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent == null) { 103623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner continue; 103723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 103823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 103923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Refuse possible leaked file descriptors 104023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent != null && intent.hasFileDescriptors()) { 104123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("File descriptors passed in Intent"); 104223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 104323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 104423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner boolean componentSpecified = intent.getComponent() != null; 104523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 104623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't modify the client's object! 104723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = new Intent(intent); 104823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 104923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 10501b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 0, null, userId); 105123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // TODO: New, check if this is correct 105223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = mService.getActivityInfoForUser(aInfo, userId); 105323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 105423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null && 105523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE) 105623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner != 0) { 105723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException( 105823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "FLAG_CANT_SAVE_STATE not supported here"); 105923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 106023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 106123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Bundle theseOptions; 106223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (options != null && i == intents.length-1) { 106323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner theseOptions = options; 106423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 106523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner theseOptions = null; 106623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 10676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int res = startActivityLocked(caller, intent, resolvedTypes[i], 106895465200b0f652c48d40ca1028238763dd647900Dianne Hackborn aInfo, null, null, resultTo, null, -1, callingPid, callingUid, 106995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn callingPackage, callingPid, callingUid, 107089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 0, theseOptions, componentSpecified, outActivity, null, null); 107123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (res < 0) { 107223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return res; 107323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 107423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 107523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner resultTo = outActivity[0] != null ? outActivity[0].appToken : null; 107623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 107723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 107823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } finally { 107923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Binder.restoreCallingIdentity(origId); 108023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 108123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 108223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return ActivityManager.START_SUCCESS; 108323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 108423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 10852420ead0326bfd2587da6231be419e758dba1930Craig Mautner final boolean realStartActivityLocked(ActivityRecord r, 10862c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount ProcessRecord app, boolean andResume, boolean checkConfig) 10872420ead0326bfd2587da6231be419e758dba1930Craig Mautner throws RemoteException { 10882420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10892420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.startFreezingScreenLocked(app, 0); 1090a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner if (false) Slog.d(TAG, "realStartActivity: setting app visibility true"); 1091ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.setAppVisibility(r.appToken, true); 10922420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10932420ead0326bfd2587da6231be419e758dba1930Craig Mautner // schedule launch ticks to collect information about slow apps. 10942420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.startLaunchTickingLocked(); 10952420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10962420ead0326bfd2587da6231be419e758dba1930Craig Mautner // Have the window manager re-evaluate the orientation of 10972420ead0326bfd2587da6231be419e758dba1930Craig Mautner // the screen based on the new activity order. Note that 10982420ead0326bfd2587da6231be419e758dba1930Craig Mautner // as a result of this, it can call back into the activity 10992420ead0326bfd2587da6231be419e758dba1930Craig Mautner // manager with a new orientation. We don't care about that, 11002420ead0326bfd2587da6231be419e758dba1930Craig Mautner // because the activity is not currently running so we are 11012420ead0326bfd2587da6231be419e758dba1930Craig Mautner // just restarting it anyway. 11022420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (checkConfig) { 1103ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner Configuration config = mWindowManager.updateOrientationFromAppTokens( 11042420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mConfiguration, 11052420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.mayFreezeScreenLocked(app) ? r.appToken : null); 11062420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.updateConfigurationLocked(config, r, false, false); 11072420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11082420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11092420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.app = app; 11102420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.waitingToKill = null; 11112420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.launchCount++; 11122420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.lastLaunchTime = SystemClock.uptimeMillis(); 11132420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11142420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (localLOGV) Slog.v(TAG, "Launching: " + r); 11152420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11162420ead0326bfd2587da6231be419e758dba1930Craig Mautner int idx = app.activities.indexOf(r); 11172420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (idx < 0) { 11182420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.activities.add(r); 11192420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 1120db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn mService.updateLruProcessLocked(app, true, null); 1121db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn mService.updateOomAdjLocked(); 11222420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11232420ead0326bfd2587da6231be419e758dba1930Craig Mautner final ActivityStack stack = r.task.stack; 11242420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 11252420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.thread == null) { 11262420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw new RemoteException(); 11272420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11282420ead0326bfd2587da6231be419e758dba1930Craig Mautner List<ResultInfo> results = null; 112985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn List<ReferrerIntent> newIntents = null; 11302420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 11312420ead0326bfd2587da6231be419e758dba1930Craig Mautner results = r.results; 11322420ead0326bfd2587da6231be419e758dba1930Craig Mautner newIntents = r.newIntents; 11332420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11342420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 11352420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " icicle=" + r.icicle 11362420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " with results=" + results + " newIntents=" + newIntents 11372420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " andResume=" + andResume); 11382420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 11392420ead0326bfd2587da6231be419e758dba1930Craig Mautner EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 11402420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.userId, System.identityHashCode(r), 11412420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.task.taskId, r.shortComponentName); 11422420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 1143ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (r.isHomeActivity() && r.isNotResolverActivity()) { 11444ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner // Home process is the root process of the task. 11454ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner mService.mHomeProcess = r.task.mActivities.get(0).app; 11462420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11472420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 11482420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.sleeping = false; 11492420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.forceNewConfig = false; 11502420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.showAskCompatModeDialogLocked(r); 11512420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 11522420ead0326bfd2587da6231be419e758dba1930Craig Mautner String profileFile = null; 11532420ead0326bfd2587da6231be419e758dba1930Craig Mautner ParcelFileDescriptor profileFd = null; 11542420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 11552420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileProc == null || mService.mProfileProc == app) { 11562420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mProfileProc = app; 11572420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFile = mService.mProfileFile; 11582420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = mService.mProfileFd; 11592420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11602420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11612420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.hasShownUi = true; 11622420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.pendingUiClean = true; 11632420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 11642420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 11652420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = profileFd.dup(); 11662420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException e) { 11672420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 11682420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 11692420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd.close(); 11702420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException o) { 11712420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11722420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = null; 11732420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11742420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11752420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 1176cfbe9be5b3b701d95fb24fa0f7c8d9be43eec776Adam Powell 11771b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ProfilerInfo profilerInfo = profileFile != null 11781b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ? new ProfilerInfo(profileFile, profileFd, mService.mSamplingInterval, 11791b012d302b56b4adf950035136d1d191a1936d5aJeff Hao mService.mAutoStopProfiler) : null; 1180a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP); 11812420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 11821b012d302b56b4adf950035136d1d191a1936d5aJeff Hao System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration), 118385d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn r.compat, r.launchedFromPackage, r.task.voiceInteractor, app.repProcState, 118485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn r.icicle, r.persistentState, results, newIntents, !andResume, 118585d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn mService.isNextTransitionForward(), profilerInfo); 11862420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11872420ead0326bfd2587da6231be419e758dba1930Craig Mautner if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 11882420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This may be a heavy-weight process! Note that the package 11892420ead0326bfd2587da6231be419e758dba1930Craig Mautner // manager will ensure that only activity can run in the main 11902420ead0326bfd2587da6231be419e758dba1930Craig Mautner // process of the .apk, which is the only thing that will be 11912420ead0326bfd2587da6231be419e758dba1930Craig Mautner // considered heavy-weight. 11922420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.processName.equals(app.info.packageName)) { 11932420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mHeavyWeightProcess != null 11942420ead0326bfd2587da6231be419e758dba1930Craig Mautner && mService.mHeavyWeightProcess != app) { 11952420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Starting new heavy weight process " + app 11962420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " when already running " 11972420ead0326bfd2587da6231be419e758dba1930Craig Mautner + mService.mHeavyWeightProcess); 11982420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11992420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHeavyWeightProcess = app; 12002420ead0326bfd2587da6231be419e758dba1930Craig Mautner Message msg = mService.mHandler.obtainMessage( 12012420ead0326bfd2587da6231be419e758dba1930Craig Mautner ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 12022420ead0326bfd2587da6231be419e758dba1930Craig Mautner msg.obj = r; 12032420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHandler.sendMessage(msg); 12042420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12052420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12062420ead0326bfd2587da6231be419e758dba1930Craig Mautner 12072420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (RemoteException e) { 12082420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (r.launchFailed) { 12092420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the second time we failed -- finish activity 12102420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and give up. 12112420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.e(TAG, "Second failure launching " 12122420ead0326bfd2587da6231be419e758dba1930Craig Mautner + r.intent.getComponent().flattenToShortString() 12132420ead0326bfd2587da6231be419e758dba1930Craig Mautner + ", giving up", e); 12144a8dddbf18fedb33bb2c725db489669a141e1d73Craig Mautner mService.appDiedLocked(app); 12152420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 12162420ead0326bfd2587da6231be419e758dba1930Craig Mautner "2nd-crash", false); 12172420ead0326bfd2587da6231be419e758dba1930Craig Mautner return false; 12182420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12192420ead0326bfd2587da6231be419e758dba1930Craig Mautner 12202420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the first time we failed -- restart process and 12212420ead0326bfd2587da6231be419e758dba1930Craig Mautner // retry. 12222420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.activities.remove(r); 12232420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw e; 12242420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12252420ead0326bfd2587da6231be419e758dba1930Craig Mautner 12262420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.launchFailed = false; 12272420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (stack.updateLRUListLocked(r)) { 12282420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Activity " + r 12292420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " being launched, but already in LRU list"); 12302420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12312420ead0326bfd2587da6231be419e758dba1930Craig Mautner 12322420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 12332420ead0326bfd2587da6231be419e758dba1930Craig Mautner // As part of the process of launching, ActivityThread also performs 12342420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a resume. 12352420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.minimalResumeActivityLocked(r); 12362420ead0326bfd2587da6231be419e758dba1930Craig Mautner } else { 12372420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This activity is not starting in the resumed state... which 12382420ead0326bfd2587da6231be419e758dba1930Craig Mautner // should look like we asked it to pause+stop (but remain visible), 12392420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and it has done so and reported back the current icicle and 12402420ead0326bfd2587da6231be419e758dba1930Craig Mautner // other state. 12412420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 12422420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " (starting in stopped state)"); 12432420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.state = ActivityState.STOPPED; 12442420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.stopped = true; 12452420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12462420ead0326bfd2587da6231be419e758dba1930Craig Mautner 12472420ead0326bfd2587da6231be419e758dba1930Craig Mautner // Launch the new version setup screen if needed. We do this -after- 12482420ead0326bfd2587da6231be419e758dba1930Craig Mautner // launching the initial activity (that is, home), so that it can have 12492420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a chance to initialize itself while in the background, making the 12502420ead0326bfd2587da6231be419e758dba1930Craig Mautner // switch back to it faster and look better. 1251de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (isFrontStack(stack)) { 12522420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.startSetupActivityLocked(); 12532420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12542420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1255465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn // Update any services we are bound to that might care about whether 1256465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn // their client may have activities. 1257465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn mService.mServices.updateServiceConnectionActivitiesLocked(r.app); 1258465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn 12592420ead0326bfd2587da6231be419e758dba1930Craig Mautner return true; 12602420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12612420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1262e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner void startSpecificActivityLocked(ActivityRecord r, 12632c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount boolean andResume, boolean checkConfig) { 1264e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // Is this activity's application already running? 1265e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner ProcessRecord app = mService.getProcessRecordLocked(r.processName, 12663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn r.info.applicationInfo.uid, true); 1267e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1268e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner r.task.stack.setLaunchTime(r); 1269e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1270e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner if (app != null && app.thread != null) { 1271e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner try { 1272237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0 1273237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn || !"android".equals(r.info.packageName)) { 1274237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // Don't add this if it is a platform component that is marked 1275237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // to run in multiple processes, because this is actually 1276237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // part of the framework so doesn't make sense to track as a 1277237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // separate apk in the process. 1278f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode, 1279f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mService.mProcessStats); 1280237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn } 12812c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount realStartActivityLocked(r, app, andResume, checkConfig); 1282e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner return; 1283e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } catch (RemoteException e) { 1284e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner Slog.w(TAG, "Exception when starting activity " 1285e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner + r.intent.getComponent().flattenToShortString(), e); 1286e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1287e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1288e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // If a dead object exception was thrown -- fall through to 1289e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // restart the application. 1290e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1291e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1292e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 12933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn "activity", r.intent.getComponent(), false, false, true); 1294e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1295e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 12966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startActivityLocked(IApplicationThread caller, 129791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Intent intent, String resolvedType, ActivityInfo aInfo, 129891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 129991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IBinder resultTo, String resultWho, int requestCode, 130095465200b0f652c48d40ca1028238763dd647900Dianne Hackborn int callingPid, int callingUid, String callingPackage, 130195465200b0f652c48d40ca1028238763dd647900Dianne Hackborn int realCallingPid, int realCallingUid, int startFlags, Bundle options, 130289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container, 130389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn TaskRecord inTask) { 13046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int err = ActivityManager.START_SUCCESS; 13056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ProcessRecord callerApp = null; 13076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (caller != null) { 13086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callerApp = mService.getRecordForAppLocked(caller); 13096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (callerApp != null) { 13106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingPid = callerApp.pid; 13116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid = callerApp.info.uid; 13126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 13136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, "Unable to find app for caller " + caller 13146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " (pid=" + callingPid + ") when starting: " 13156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + intent.toString()); 13166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_PERMISSION_DENIED; 13176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS) { 13216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; 13226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false) 132302a4aa261c28df2466234106d61282289276b462Craig Mautner + "} from uid " + callingUid 13249ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner + " on display " + (container == null ? (mFocusedStack == null ? 13259ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner Display.DEFAULT_DISPLAY : mFocusedStack.mDisplayId) : 13269ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner (container.mActivityDisplay == null ? Display.DEFAULT_DISPLAY : 13279ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner container.mActivityDisplay.mDisplayId))); 13286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord sourceRecord = null; 13316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord resultRecord = null; 13326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultTo != null) { 13336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord = isInAnyStackLocked(resultTo); 13346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (DEBUG_RESULTS) Slog.v( 13356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner TAG, "Will send result to " + resultTo + " " + sourceRecord); 13366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (sourceRecord != null) { 13376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0 && !sourceRecord.finishing) { 13386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord; 13396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 134391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final int launchFlags = intent.getFlags(); 13446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 134595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) { 13466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Transfer the result target from the source activity to the new 13476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // one being started, including any failures. 13486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0) { 13496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 13506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 13516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord.resultTo; 13536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultWho = sourceRecord.resultWho; 13546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner requestCode = sourceRecord.requestCode; 13556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord.resultTo = null; 13566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 13571b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner resultRecord.removeResultsLocked(sourceRecord, resultWho, requestCode); 13586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13593026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn if (sourceRecord.launchedFromUid == callingUid) { 13603026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // The new activity is being launched from the same uid as the previous 13613026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // activity in the flow, and asking to forward its result back to the 13623026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // previous. In this case the activity is serving as a trampoline between 13633026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // the two, so we also want to update its launchedFromPackage to be the 13643026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // same as the previous activity. Note that this is safe, since we know 13653026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // these two packages come from the same uid; the caller could just as 13663026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // well have supplied that same package name itself. This specifially 13673026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // deals with the case of an intent picker/chooser being launched in the app 13683026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // flow to redirect to an activity picked by the user, where we want the final 13693026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // activity to consider it to have been launched by the previous app activity. 13703026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn callingPackage = sourceRecord.launchedFromPackage; 13713026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn } 13726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { 13756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find a class that can handle the given Intent. 13766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // That's the end of that! 13776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_INTENT_NOT_RESOLVED; 13786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && aInfo == null) { 13816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find the specific class specified in the Intent. 13826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Also the end of the line. 13836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_CLASS_NOT_FOUND; 13846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 138691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (err == ActivityManager.START_SUCCESS && sourceRecord != null 138791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn && sourceRecord.task.voiceSession != null) { 138891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // If this activity is being launched as part of a voice session, we need 138991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // to ensure that it is safe to do so. If the upcoming activity will also 139091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // be part of the voice session, we can only launch it if it has explicitly 139191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // said it supports the VOICE category, or it is a part of the calling app. 1392f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 139391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) { 139491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 139595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn if (!AppGlobals.getPackageManager().activitySupportsIntent( 139695465200b0f652c48d40ca1028238763dd647900Dianne Hackborn intent.getComponent(), intent, resolvedType)) { 139791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 139891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 139991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 140091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 140191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 140291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 140391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 140491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 140591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (err == ActivityManager.START_SUCCESS && voiceSession != null) { 140691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // If the caller is starting a new voice session, just make sure the target 140791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // is actually allowing it to run this way. 140891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 140991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(), 141091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn intent, resolvedType)) { 141191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 141291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 141391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 141491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 141591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 141691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 141791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 1418cd5d198d7e852bc68871a279afbaa1b94e86a023louis_chang final ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack; 1419cd5d198d7e852bc68871a279afbaa1b94e86a023louis_chang 14206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err != ActivityManager.START_SUCCESS) { 14216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 14226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 14236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 14246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 14256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 14276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 14286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 14306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startAnyPerm = mService.checkPermission( 14316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner START_ANY_ACTIVITY, callingPid, callingUid); 14326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid, 14336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid, aInfo.applicationInfo.uid, aInfo.exported); 14346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) { 14356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 14366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 14376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 14386170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 14396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner String msg; 14416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (!aInfo.exported) { 14426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 14436170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 14446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 14456170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " not exported from uid " + aInfo.applicationInfo.uid; 14466170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 14476170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 14486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 14496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 14506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " requires " + aInfo.permission; 14516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, msg); 14536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner throw new SecurityException(msg); 14546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1456dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid, 1457b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver callingPid, resolvedType, aInfo.applicationInfo); 14585e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver 14596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mController != null) { 14606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner try { 14616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // The Intent we give to the watcher has the extra data 14626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // stripped off, since it can contain private information. 14636170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Intent watchIntent = intent.cloneFilter(); 14645e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver abort |= !mService.mController.activityStarting(watchIntent, 14656170f73ed5464491b91685b57e116db033e98d5aCraig Mautner aInfo.applicationInfo.packageName); 14666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } catch (RemoteException e) { 14676170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mController = null; 14686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14695e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver } 14706170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 14715e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (abort) { 14725e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (resultRecord != null) { 14735e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, 14746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 14756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14765e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // We pretend to the caller that it was really started, but 14775e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // they will just get a cancel result. 14785e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver ActivityOptions.abort(options); 14795e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver return ActivityManager.START_SUCCESS; 14806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 14826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage, 1483e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho, 1484233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner requestCode, componentSpecified, this, container, options); 14856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (outActivity != null) { 14866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner outActivity[0] = r; 14876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1489ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = getFocusedStack(); 149091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (voiceSession == null && (stack.mResumedActivity == null 149191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn || stack.mResumedActivity.info.applicationInfo.uid != callingUid)) { 149295465200b0f652c48d40ca1028238763dd647900Dianne Hackborn if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, 149395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn realCallingPid, realCallingUid, "Activity start")) { 14946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner PendingActivityLaunch pal = 1495de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner new PendingActivityLaunch(r, sourceRecord, startFlags, stack); 1496ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner mPendingActivityLaunches.add(pal); 14976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 14986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_SWITCHES_CANCELED; 14996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 15006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 15016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 15026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mDidAppSwitch) { 15036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // This is the second allowed switch since we stopped switches, 15046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // so now just generally allow switches. Use case: user presses 15056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // home (switches disabled, switch to home, mDidAppSwitch now true); 15066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // user taps a home icon (coming from home so allowed, we hit here 15076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // and now allow anyone to switch again). 15086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mAppSwitchesAllowedTime = 0; 15096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 15106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mDidAppSwitch = true; 15116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 15126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1513ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner doPendingActivityLaunchesLocked(false); 15146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 151591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor, 151689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn startFlags, true, options, inTask); 151710385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner 15188de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi if (err < 0) { 151910385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner // If someone asked to have the keyguard dismissed on the next 15206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // activity start, but we are not actually doing an activity 15216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // switch... just dismiss the keyguard now, because we 15226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // probably want to see whatever is behind it. 15238de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi notifyActivityDrawnForKeyguard(); 15246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 15256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 15266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 15276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 15281b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner ActivityStack adjustStackFocus(ActivityRecord r, boolean newTask) { 15291d001b670e34fe887488047f525a5430154626e1Craig Mautner final TaskRecord task = r.task; 153058e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 153158e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima // On leanback only devices we should keep all activities in the same stack. 153258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima if (!mLeanbackOnlyDevice && 153358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima (r.isApplicationActivity() || (task != null && task.isApplicationTask()))) { 1534ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (task != null) { 1535d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner final ActivityStack taskStack = task.stack; 1536e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (taskStack.isOnHomeDisplay()) { 1537e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mFocusedStack != taskStack) { 1538e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: Setting " + 1539e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner "focused stack to r=" + r + " task=" + task); 1540e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mFocusedStack = taskStack; 1541e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } else { 1542e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1543e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner "adjustStackFocus: Focused stack already=" + mFocusedStack); 1544e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 1545858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1546d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner return taskStack; 1547858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1548ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1549e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityContainer container = r.mInitialActivityContainer; 1550e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (container != null) { 1551e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner // The first time put it on the desired stack, after this put on task stack. 1552e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner r.mInitialActivityContainer = null; 1553e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return container.mStack; 1554e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 1555e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner 15561b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner if (mFocusedStack != mHomeStack && (!newTask || 15571b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner mFocusedStack.mActivityContainer.isEligibleForNewTasks())) { 1558ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1559ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Have a focused stack=" + mFocusedStack); 1560ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mFocusedStack; 1561de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1562ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1563e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks; 1564e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) { 1565e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityStack stack = homeDisplayStacks.get(stackNdx); 1566e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (!stack.isHomeStack()) { 1567e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1568e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner "adjustStackFocus: Setting focused stack=" + stack); 1569e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mFocusedStack = stack; 1570e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return mFocusedStack; 1571ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 15721d001b670e34fe887488047f525a5430154626e1Craig Mautner } 1573ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 15744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // Need to create an app stack for this user. 1575f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); 1576ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r + 1577ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner " stackId=" + stackId); 1578ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mFocusedStack = getStack(stackId); 157929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return mFocusedStack; 1580de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1581de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mHomeStack; 1582de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1583de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 1584299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner void setFocusedStack(ActivityRecord r, String reason) { 15854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null) { 158612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner final TaskRecord task = r.task; 158712ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner boolean isHomeActivity = !r.isApplicationActivity(); 158812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (!isHomeActivity && task != null) { 158912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner isHomeActivity = !task.isApplicationTask(); 159012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 159112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (!isHomeActivity && task != null) { 159212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner final ActivityRecord parent = task.stack.mActivityContainer.mParentActivity; 159312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner isHomeActivity = parent != null && parent.isHomeActivity(); 159412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 1595299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner moveHomeStack(isHomeActivity, reason); 159629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 159729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 159829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner 159989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord, 160091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, 160189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn boolean doResume, Bundle options, TaskRecord inTask) { 16028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final Intent intent = r.intent; 16038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final int callingUid = r.launchedFromUid; 16048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 1605d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // In some flows in to this function, we retrieve the task record and hold on to it 1606d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // without a lock before calling back in to here... so the task at this point may 1607d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // not actually be in recents. Check for that, and if it isn't in recents just 1608d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // consider it invalid. 1609d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (inTask != null && !inTask.inRecents) { 1610d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn Slog.w(TAG, "Starting activity in task not in recents: " + inTask); 1611d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn inTask = null; 1612d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 1613d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 1614ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner final boolean launchSingleTop = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP; 1615a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner final boolean launchSingleInstance = r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE; 1616a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner final boolean launchSingleTask = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK; 16178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 1618a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner int launchFlags = intent.getFlags(); 1619f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && 1620a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner (launchSingleInstance || launchSingleTask)) { 1621f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // We have a conflict between the Intent and the Activity manifest, manifest wins. 1622f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " + 1623f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner "\"singleInstance\" or \"singleTask\""); 1624f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags &= 1625f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner ~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 1626f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } else { 1627f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner switch (r.info.documentLaunchMode) { 1628f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner case ActivityInfo.DOCUMENT_LAUNCH_NONE: 1629f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner break; 1630f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING: 1631f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT; 1632f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner break; 1633f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS: 1634f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT; 1635f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner break; 1636f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner case ActivityInfo.DOCUMENT_LAUNCH_NEVER: 1637f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags &= ~Intent.FLAG_ACTIVITY_MULTIPLE_TASK; 1638f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner break; 1639f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } 1640f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } 1641bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner 164289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final boolean launchTaskBehind = r.mLaunchTaskBehind 164389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn && !launchSingleTask && !launchSingleInstance 164489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn && (launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0; 1645f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner 1646f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1647f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // For whatever reason this activity is being launched into a new 1648f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // task... yet the caller has requested a result back. Well, that 1649f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // is pretty messed up, so instead immediately send back a cancel 1650f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // and let the new task continue launched as normal without a 1651f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // dependency on its originator. 1652f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 1653f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, 1654f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner r.resultTo, r.resultWho, r.requestCode, 1655f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner Activity.RESULT_CANCELED, null); 1656f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner r.resultTo = null; 1657f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } 1658f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner 1659f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && r.resultTo == null) { 1660f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1661f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } 1662f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner 166389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // If we are actually going to launch in to a new task, there are some cases where 166489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // we further want to do multiple task. 166589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 166689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (launchTaskBehind 166789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn || r.info.documentLaunchMode == ActivityInfo.DOCUMENT_LAUNCH_ALWAYS) { 166889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_MULTIPLE_TASK; 166989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 167089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 167189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We'll invoke onUserLeaving before onPause only if the launching 16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity did not explicitly state that this is an automated launch. 1674a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner mUserLeaving = (launchFlags & Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 1675de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving); 16768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has asked not to resume at this point, we make note 16788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of this in the record so that we can skip it when trying to find 16798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the top running activity. 16808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!doResume) { 16818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.delayedResume = true; 16828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 1684a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner ActivityRecord notTop = 1685a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner (launchFlags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null; 16868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the onlyIfNeeded flag is set, then we can do this if the activity 16888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being launched is the same as the one making the call... or, as 16898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a special case, if we do not know the caller then we count the 16908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current top activity as the caller. 16918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 16928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord checkedCaller = sourceRecord; 16938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (checkedCaller == null) { 1694ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop); 16958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!checkedCaller.realActivity.equals(r.realActivity)) { 16978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Caller is not the same as launcher, so always needed. 16988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED; 16998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 17018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 17028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean addingToTask = false; 17038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner TaskRecord reuseTask = null; 170489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 170589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // If the caller is not coming from another activity, but has given us an 170689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // explicit task into which they would like us to launch the new activity, 170789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // then let's see about doing that. 1708d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (sourceRecord == null && inTask != null && inTask.stack != null) { 1709d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn final Intent baseIntent = inTask.getBaseIntent(); 1710d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn final ActivityRecord root = inTask.getRootActivity(); 1711d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (baseIntent == null) { 1712d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityOptions.abort(options); 1713d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn throw new IllegalArgumentException("Launching into task without base intent: " 1714d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn + inTask); 1715d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 1716d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 171789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // If this task is empty, then we are adding the first activity -- it 171889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // determines the root, and must be launching as a NEW_TASK. 1719d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (launchSingleInstance || launchSingleTask) { 1720d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (!baseIntent.getComponent().equals(r.intent.getComponent())) { 1721d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityOptions.abort(options); 1722d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn throw new IllegalArgumentException("Trying to launch singleInstance/Task " 1723d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn + r + " into different task " + inTask); 172489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 1725d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (root != null) { 1726d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityOptions.abort(options); 1727d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn throw new IllegalArgumentException("Caller with inTask " + inTask 1728d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn + " has root " + root + " but target is singleInstance/Task"); 1729d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 1730d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 1731d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 1732d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // If task is empty, then adopt the interesting intent launch flags in to the 1733d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // activity being started. 1734d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (root == null) { 1735d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn final int flagsOfInterest = Intent.FLAG_ACTIVITY_NEW_TASK 1736d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn | Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT 1737d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS; 1738d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn launchFlags = (launchFlags&~flagsOfInterest) 1739d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn | (baseIntent.getFlags()&flagsOfInterest); 1740d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn intent.setFlags(launchFlags); 174189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn inTask.setIntent(r); 1742962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn addingToTask = true; 174389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 1744962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // If the task is not empty and the caller is asking to start it as the root 1745962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // of a new task, then we don't actually want to start this on the task. We 1746962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // will bring the task to the front, and possibly give it a new intent. 1747d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } else if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1748962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn addingToTask = false; 1749962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn 1750962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn } else { 1751962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn addingToTask = true; 175289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 1753962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn 175489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn reuseTask = inTask; 175589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else { 175689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn inTask = null; 175789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 175889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 1759a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if (inTask == null) { 1760a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if (sourceRecord == null) { 1761a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // This activity is not being started from another... in this 1762a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // case we -always- start a new task. 1763a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 && inTask == null) { 1764a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Slog.w(TAG, "startActivity called from non-Activity context; forcing " + 1765a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 1766a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1767a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1768a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 1769a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // The original activity who is starting us is running as a single 1770a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // instance... this new activity it is starting must go on its 1771a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // own task. 1772a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1773a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } else if (launchSingleInstance || launchSingleTask) { 1774a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // The activity being started is a single instance... it always 1775a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // gets launched into its own task. 1776a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1777a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1778a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1779a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 1780a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn ActivityInfo newTaskInfo = null; 1781a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Intent newTaskIntent = null; 1782a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn ActivityStack sourceStack; 1783a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if (sourceRecord != null) { 1784a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if (sourceRecord.finishing) { 1785a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // If the source is finishing, we can't further count it as our source. This 1786a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // is because the task it is associated with may now be empty and on its way out, 1787a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // so we don't want to blindly throw it in to that task. Instead we will take 1788a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // the NEW_TASK flow and try to find a task for it. But save the task information 1789a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // so it can be used when creating the new task. 1790a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 1791a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Slog.w(TAG, "startActivity called from finishing " + sourceRecord 1792a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 1793a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1794a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn newTaskInfo = sourceRecord.info; 1795a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn newTaskIntent = sourceRecord.task.intent; 1796a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1797a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn sourceRecord = null; 1798a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn sourceStack = null; 1799a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } else { 1800a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn sourceStack = sourceRecord.task.stack; 1801a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1802a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } else { 1803a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn sourceStack = null; 1804a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1805a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 1806a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn boolean movedHome = false; 1807a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn ActivityStack targetStack; 1808a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 1809a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn intent.setFlags(launchFlags); 1810a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 181189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // We may want to try to place the new activity in to an existing task. We always 181289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // do this if the target activity is singleTask or singleInstance; we will also do 181389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // this if NEW_TASK has been requested, and there is not an additional qualifier telling 181489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // us to still place it in a new task: multi task, always doc mode, or being asked to 181589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // launch this as a new task behind the current one. 1816d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if (((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 1817d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner (launchFlags & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 1818a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner || launchSingleInstance || launchSingleTask) { 1819d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // If bring to front is requested, and no result is requested and we have not 1820d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // been given an explicit task to launch in to, and 18218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we can find a task that was started with this same 18228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // component, then instead of launching bring that one to the front. 1823d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (inTask == null && r.resultTo == null) { 18248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // See if there is a task to bring to the front. If this is 18258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a SINGLE_INSTANCE activity, there can be one and only one 18268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // instance of it in the history, and it is always in its own 18278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // unique task, so we do a special search. 1828a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner ActivityRecord intentActivity = !launchSingleInstance ? 1829a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner findTaskLocked(r) : findActivityLocked(intent, r.info); 18308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity != null) { 1831aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(intentActivity.task)) { 1832a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk showLockTaskToast(); 18330175b882b5e021907c307ab0e455bff014ad8784Craig Mautner Slog.e(TAG, "startActivityUnchecked: Attempt to violate Lock Task Mode"); 1834aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 1835aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 183629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) { 183729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner r.task = intentActivity.task; 183829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 18398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack = intentActivity.task.stack; 18400f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 18412a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack 18422a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + " from " + intentActivity); 1843299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner targetStack.moveToFront("intentActivityFound"); 18448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.task.intent == null) { 18458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This task was started because of movement of 18468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the activity based on affinity... now that we 18478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // are actually launching it, we can assign the 18488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // base intent. 1849fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung intentActivity.task.setIntent(r); 18508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the target task is not in the front, then we need 18528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to bring it to the front... except... well, with 18538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 18548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to have the same behavior as if a new instance was 18558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being started, which means not bringing it to the front 18568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // if the caller is not itself in the front. 1857165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner final ActivityStack lastStack = getLastStack(); 1858165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner ActivityRecord curTop = lastStack == null? 1859165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner null : lastStack.topRunningNonDelayedActivityLocked(notTop); 186044f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi boolean movedToFront = false; 18617504d7b24a07fef05b3447d843f212796e22302fCraig Mautner if (curTop != null && (curTop.task != intentActivity.task || 18627504d7b24a07fef05b3447d843f212796e22302fCraig Mautner curTop.task != lastStack.topTask())) { 18638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 1864d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner if (sourceRecord == null || (sourceStack.topActivity() != null && 1865d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner sourceStack.topActivity().task == sourceRecord.task)) { 18668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We really do want to push this one into the 18678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // user's face, right now. 1868bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner if (launchTaskBehind && sourceRecord != null) { 1869a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner intentActivity.setTaskToAffiliateWith(sourceRecord.task); 1870a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner } 18718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner movedHome = true; 1872299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner targetStack.moveTaskToFrontLocked(intentActivity.task, r, options, 1873299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner "bringingFoundTaskToFront"); 1874de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 187529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) 187629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { 1877e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner // Caller wants to appear on home activity. 187884984faf530e525b066e28710d0f9beb32142ec5Craig Mautner intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 1879de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 18808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner options = null; 188144f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi movedToFront = true; 18828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has requested that the target task be 18858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // reset, then do so. 18868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 18878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r); 18888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 18908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 18918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 18928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! And for paranoia, make 18938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 18948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 189505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(targetStack, null, options); 189644f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi 189744f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi // Make sure to notify Keyguard as well if we are not running an app 189844f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi // transition later. 189944f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi if (!movedToFront) { 190044f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi notifyActivityDrawnForKeyguard(); 190144f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi } 19028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 19038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 19048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 19068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags & 19088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 19098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 19108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The caller has requested to completely replace any 19118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task with its new activity. Well that should 19128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // not be too hard... 19138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask = intentActivity.task; 19148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask.performClearTaskLocked(); 1915fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung reuseTask.setIntent(r); 19168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 1917a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner || launchSingleInstance || launchSingleTask) { 19188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this situation we want to remove all activities 19198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from the task up to the one being started. In most 19208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // cases this means we are resetting the task to its 19218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // initial state. 19228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord top = 19238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.performClearTaskLocked(r, launchFlags); 19248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 19258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.frontOfTask) { 19268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Activity aliases may mean we use different 19278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intents for the top activity, so make sure 19288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the task now has the identity of the new 19298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intent. 1930fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung top.task.setIntent(r); 19318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, 19338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r, top.task); 193485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 19358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 19368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // A special case: we need to 19378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // start the activity because it is not currently 19388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // running, and the caller has asked to clear the 19398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current task to have this activity at the top. 19408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 19418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Now pretend like this activity is being started 19428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // by the top of its task, so it is put in the 19438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // right place. 19448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 19458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (r.realActivity.equals(intentActivity.task.realActivity)) { 19478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case the top activity on the task is the 19488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // same as the one being launched, so we take that 19498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // as a request to bring the task to the foreground. 19508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the top activity in the task is the root 19518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity, deliver this new intent to it if it 19528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // desires. 1953ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 || launchSingleTop) 19548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner && intentActivity.realActivity.equals(r.realActivity)) { 19558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, 19568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task); 19578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.frontOfTask) { 1958fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung intentActivity.task.setIntent(r); 19598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 196085d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn intentActivity.deliverNewIntentLocked(callingUid, r.intent, 196185d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn r.launchedFromPackage); 19628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!r.intent.filterEquals(intentActivity.task.intent)) { 19638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching the root activity 19648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of the task, but with a different intent. We 19658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // should start a new instance on top. 19668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 19678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 19688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 19708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case an activity is being launched in to an 19718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task, without resetting that task. This 19728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is typically the situation of launching an activity 19738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from a notification or shortcut. We want to place 19748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the new activity on top of the current task. 19758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 19768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 19778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!intentActivity.task.rootWasReset) { 19788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching in to an existing task 19798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that has not yet been started from its front door. 19808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The current task has been brought to the front. 19818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Ideally, we'd probably like to place this new task 19828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the bottom of its stack, but that's a little hard 19838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to do with the current organization of the code so 19848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // for now we'll just drop it. 1985fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung intentActivity.task.setIntent(r); 19868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!addingToTask && reuseTask == null) { 19888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We didn't do anything... but it was needed (a.k.a., client 19898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // don't use that intent!) And for paranoia, make 19908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 19918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 1992de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner targetStack.resumeTopActivityLocked(null, options); 199344f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi if (!movedToFront) { 199444f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi // Make sure to notify Keyguard as well if we are not running an app 199544f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi // transition later. 199644f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi notifyActivityDrawnForKeyguard(); 199744f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi } 19988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 19998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 20008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_TASK_TO_FRONT; 20028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20038849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 20078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //String uri = r.intent.toURI(); 20088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Intent intent2 = new Intent(uri); 20098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "Given intent: " + r.intent); 20108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "URI is: " + uri); 20118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "To intent: " + intent2); 20128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 20138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.packageName != null) { 20148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the activity being launched is the same as the one currently 20158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the top, then we need to check if it should only be launched 20168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // once. 2017ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack topStack = getFocusedStack(); 2018de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop); 20198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null && r.resultTo == null) { 20208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 20218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.app != null && top.app.thread != null) { 2022d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 2023ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner || launchSingleTop || launchSingleTask) { 20248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, 20258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.task); 20268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 20278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 20280f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner topStack.mLastPausedActivity = null; 20298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 203005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 20318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 20338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 20348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 20358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 20368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! 20378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 20388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 203985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 20408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 20418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 20468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 20478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo != null) { 2048de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, 2049de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.requestCode, Activity.RESULT_CANCELED, null); 20508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 20528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_CLASS_NOT_FOUND; 20538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 20558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean newTask = false; 20568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean keepCurTransition = false; 20578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 2058bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner TaskRecord taskToAffiliate = launchTaskBehind && sourceRecord != null ? 2059a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner sourceRecord.task : null; 2060a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner 20618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Should this be considered a new task? 2062962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn if (r.resultTo == null && inTask == null && !addingToTask 2063f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 2064aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(reuseTask)) { 2065aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 2066aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 2067aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2068d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn newTask = true; 2069d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn targetStack = adjustStackFocus(r, newTask); 2070bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner if (!launchTaskBehind) { 2071299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner targetStack.moveToFront("startingNewTask"); 2072bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 20738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (reuseTask == null) { 20748862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner r.setTask(targetStack.createTaskRecord(getNextTaskId(), 20758862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner newTaskInfo != null ? newTaskInfo : r.info, 20768862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner newTaskIntent != null ? newTaskIntent : intent, 2077bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner voiceSession, voiceInteractor, !launchTaskBehind /* toTop */), 2078bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner taskToAffiliate); 2079de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " + 2080de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.task); 20818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 2082a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner r.setTask(reuseTask, taskToAffiliate); 20838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!movedHome) { 2085de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 2086de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 2087de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 2088de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // Caller wants to appear on home activity, so before starting 2089de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // their own activity we will bring home to the front. 209084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 2091de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 20928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (sourceRecord != null) { 2094a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner final TaskRecord sourceTask = sourceRecord.task; 2095aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(sourceTask)) { 2096aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 2097aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 2098aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2099525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner targetStack = sourceTask.stack; 2100299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner targetStack.moveToFront("sourceStackToFront"); 2101737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner final TaskRecord topTask = targetStack.topTask(); 2102737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner if (topTask != sourceTask) { 2103299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner targetStack.moveTaskToFrontLocked(sourceTask, r, options, "sourceTaskToFront"); 2104737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner } 2105a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner if (!addingToTask && (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 21068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are adding the activity to an existing 21078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // task, but the caller has asked to clear that task if the 21088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity is already running. 2109525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags); 21108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner keepCurTransition = true; 21118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 21128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 211385d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 21148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 21158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 21160f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 21178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 21188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 21198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 21218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 21228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!addingToTask && 21248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 21258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are launching an activity in our own task 21268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that may already be running somewhere in the history, and 21278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we want to shuffle it to the front of the stack if so. 2128525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r); 21298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 2130de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final TaskRecord task = top.task; 2131de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner task.moveActivityToFrontLocked(top); 2132de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task); 21338849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.updateOptionsLocked(options); 213485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 21350f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 21368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 21378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 21388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 21408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // An existing activity is starting this new activity, so we want 21438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to keep the new one in the same task as the one that is starting 21448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // it. 2145a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner r.setTask(sourceTask, null); 21468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 21472a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + " in existing task " + r.task + " from source " + sourceRecord); 21488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 214989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else if (inTask != null) { 215089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // The calling is asking that the new activity be started in an explicit 215189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // task it has provided to us. 215289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (isLockTaskModeViolation(inTask)) { 215389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 215489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 215589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 215689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn targetStack = inTask.stack; 2157299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner targetStack.moveTaskToFrontLocked(inTask, r, options, "inTaskToFront"); 2158d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 2159d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // Check whether we should actually launch the new activity in to the task, 2160d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // or just reuse the current activity on top. 2161d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityRecord top = inTask.getTopActivity(); 2162d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (top != null && top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 2163d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 2164d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn || launchSingleTop || launchSingleTask) { 2165d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 2166d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 2167d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // We don't need to start a new activity, and 2168d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // the client said not to do anything if that 2169d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // is the case, so this is it! 2170d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn return ActivityManager.START_RETURN_INTENT_TO_CALLER; 2171d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 217285d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 2173d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn return ActivityManager.START_DELIVERED_TO_TOP; 2174d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 2175d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 2176d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 2177962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn if (!addingToTask) { 2178962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // We don't actually want to have this activity added to the task, so just 2179962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // stop here but still tell the caller that we consumed the intent. 2180962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn ActivityOptions.abort(options); 2181962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn return ActivityManager.START_TASK_TO_FRONT; 2182962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn } 2183962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn 218489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn r.setTask(inTask, null); 218589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 218689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn + " in explicit task " + r.task); 218789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 21888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 21898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This not being started from an existing activity, and not part 21908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of a new task... just put it in the top task, though these days 21918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // this case should never happen. 21921b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner targetStack = adjustStackFocus(r, newTask); 2193299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner targetStack.moveToFront("addingToTopTask"); 21941602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner ActivityRecord prev = targetStack.topActivity(); 2195c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner r.setTask(prev != null ? prev.task : targetStack.createTaskRecord(getNextTaskId(), 2196a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner r.info, intent, null, null, true), null); 219795e9daab03d0349a69940625c7f718175f371581Craig Mautner mWindowManager.moveTaskToTop(r.task.taskId); 21988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 21998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner + " in new guessed " + r.task); 22008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 22018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 22028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 2203c6cf95c0f5f7250c65e40c441fe58d8cbfd114c9Nicolas Prevot intent, r.getUriPermissionsLocked(), r.userId); 22048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 220576e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner if (sourceRecord != null && sourceRecord.isRecentsActivity()) { 220676e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner r.task.setTaskToReturnTo(RECENTS_ACTIVITY_TYPE); 220776e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner } 22088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (newTask) { 22098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId); 22108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 22118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 22120f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 22138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options); 2214bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner if (!launchTaskBehind) { 2215bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner // Don't set focus on an activity that's going to the back. 2216299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner mService.setFocusedActivityLocked(r, "startedActivity"); 2217bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 22188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_SUCCESS; 22198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 22208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 2221ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final void doPendingActivityLaunchesLocked(boolean doResume) { 2222ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner while (!mPendingActivityLaunches.isEmpty()) { 2223ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner PendingActivityLaunch pal = mPendingActivityLaunches.remove(0); 2224aa9b0f15753541ff8e4d62e6497c11800c737077Craig Mautner startActivityUncheckedLocked(pal.r, pal.sourceRecord, null, null, pal.startFlags, 222589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn doResume && mPendingActivityLaunches.isEmpty(), null, null); 2226ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2227ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2228ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 22297f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner void removePendingActivityLaunchesLocked(ActivityStack stack) { 2230ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner for (int palNdx = mPendingActivityLaunches.size() - 1; palNdx >= 0; --palNdx) { 2231ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner PendingActivityLaunch pal = mPendingActivityLaunches.get(palNdx); 22327f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner if (pal.stack == stack) { 2233ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner mPendingActivityLaunches.remove(palNdx); 2234ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2235ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2236ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2237ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 22387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner void acquireLaunchWakelock() { 22397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 22407ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 22417ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 22427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.acquire(); 22437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 22447ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // To be safe, don't allow the wake lock to be held for too long. 22457ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 22467ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 22477ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 22487ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 2249f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner /** 2250f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner * Called when the frontmost task is idle. 2251f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner * @return the state of mService.mBooting before this was called. 2252f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner */ 2253f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner private boolean checkFinishBootingLocked() { 2254f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner final boolean booting = mService.mBooting; 2255f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner boolean enableScreen = false; 2256f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner mService.mBooting = false; 2257f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner if (!mService.mBooted) { 2258f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner mService.mBooted = true; 2259f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner enableScreen = true; 2260f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner } 2261f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner if (booting || enableScreen) { 2262f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner mService.postFinishBooting(booting, enableScreen); 2263f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner } 2264f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner return booting; 2265f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner } 2266f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner 2267f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Checked. 2268f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, 2269f333327782e14688e1c198c1192172d51308e90bCraig Mautner Configuration config) { 2270f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 2271f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2272f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> stops = null; 2273f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> finishes = null; 2274f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<UserStartedState> startingUsers = null; 2275f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NS = 0; 2276f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NF = 0; 2277f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean booting = false; 2278f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean activityRemoved = false; 2279f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2280f333327782e14688e1c198c1192172d51308e90bCraig Mautner ActivityRecord r = ActivityRecord.forToken(token); 2281f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r != null) { 2282b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" + 2283b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner Debug.getCallers(4)); 2284f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 2285f333327782e14688e1c198c1192172d51308e90bCraig Mautner r.finishLaunchTickingLocked(); 22867ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (fromTimeout) { 22877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 22887ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 2289f333327782e14688e1c198c1192172d51308e90bCraig Mautner 22907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // This is a hack to semi-deal with a race condition 22917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // in the client where it can be constructed with a 22927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // newer configuration from when we asked it to launch. 22937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We'll update with whatever configuration it now says 22947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // it used to launch. 22957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (config != null) { 22967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.configuration = config; 22977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 2298f333327782e14688e1c198c1192172d51308e90bCraig Mautner 22997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We are now idle. If someone is waiting for a thumbnail from 23007ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // us, we can now deliver. 23017ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.idle = true; 23027ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 23037ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 23049449a6162e275531857464acc2279894d5d6a240Dianne Hackborn if (isFrontStack(r.task.stack) || fromTimeout) { 2305f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner booting = checkFinishBootingLocked(); 23067ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 23077ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 23087ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 23097ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (allResumedActivitiesIdle()) { 23107ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (r != null) { 23117ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.scheduleAppGcsLocked(); 23127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 23137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 23147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 23157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 23167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && 23177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Binder.getCallingUid() != Process.myUid()) { 23187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 2319f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 23207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 2321f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 23227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner ensureActivitiesVisibleLocked(null, 0); 2323f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2324f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2325f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Atomically retrieve all of the other things to do. 2326f333327782e14688e1c198c1192172d51308e90bCraig Mautner stops = processStoppingActivitiesLocked(true); 2327f333327782e14688e1c198c1192172d51308e90bCraig Mautner NS = stops != null ? stops.size() : 0; 2328f333327782e14688e1c198c1192172d51308e90bCraig Mautner if ((NF=mFinishingActivities.size()) > 0) { 2329f333327782e14688e1c198c1192172d51308e90bCraig Mautner finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 2330f333327782e14688e1c198c1192172d51308e90bCraig Mautner mFinishingActivities.clear(); 2331f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2332f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2333f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mStartingUsers.size() > 0) { 2334f333327782e14688e1c198c1192172d51308e90bCraig Mautner startingUsers = new ArrayList<UserStartedState>(mStartingUsers); 2335f333327782e14688e1c198c1192172d51308e90bCraig Mautner mStartingUsers.clear(); 2336f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2337f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2338f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Stop any activities that are scheduled to do so but have been 2339f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 2340f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NS; i++) { 2341f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = stops.get(i); 2342f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityStack stack = r.task.stack; 2343f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r.finishing) { 2344f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false); 2345f333327782e14688e1c198c1192172d51308e90bCraig Mautner } else { 2346f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.stopActivityLocked(r); 2347f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2348f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2349f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2350f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Finish any activities that are scheduled to do so but have been 2351f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 2352f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NF; i++) { 2353f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = finishes.get(i); 2354ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner activityRemoved |= r.task.stack.destroyActivityLocked(r, true, "finish-idle"); 2355f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2356f333327782e14688e1c198c1192172d51308e90bCraig Mautner 23577622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn if (!booting) { 23581a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani // Complete user switch 23591a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani if (startingUsers != null) { 23601a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani for (int i = 0; i < startingUsers.size(); i++) { 23611a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mService.finishUserSwitch(startingUsers.get(i)); 23621a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 23631a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 23641a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani // Complete starting up of background users 23651a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani if (mStartingBackgroundUsers.size() > 0) { 23661a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani startingUsers = new ArrayList<UserStartedState>(mStartingBackgroundUsers); 23671a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mStartingBackgroundUsers.clear(); 23681a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani for (int i = 0; i < startingUsers.size(); i++) { 23691a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mService.finishUserBoot(startingUsers.get(i)); 23701a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 2371f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2372f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2373f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2374f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.trimApplications(); 2375f333327782e14688e1c198c1192172d51308e90bCraig Mautner //dump(); 2376f333327782e14688e1c198c1192172d51308e90bCraig Mautner //mWindowManager.dump(); 2377f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2378f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (activityRemoved) { 237905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 2380f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2381f333327782e14688e1c198c1192172d51308e90bCraig Mautner 23827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return r; 2383f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2384f333327782e14688e1c198c1192172d51308e90bCraig Mautner 23858e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner boolean handleAppDiedLocked(ProcessRecord app) { 23861909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner boolean hasVisibleActivities = false; 2387e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2388e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 23894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 23904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner hasVisibleActivities |= stacks.get(stackNdx).handleAppDiedLocked(app); 23914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 23928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23931909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner return hasVisibleActivities; 23948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 23968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void closeSystemDialogsLocked() { 2397e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2398e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 23994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 24004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.get(stackNdx).closeSystemDialogsLocked(); 24014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 240593529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner void removeUserLocked(int userId) { 24064f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner mUserStackInFront.delete(userId); 240793529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner } 240893529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner 24098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** 24108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * @return true if some activity was finished (or would have finished if doit were true). 24118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner */ 24128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) { 24138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean didSomething = false; 2414e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2415e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 24174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 24184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 24194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) { 24204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner didSomething = true; 24214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return didSomething; 24258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2427a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn void updatePreviousProcessLocked(ActivityRecord r) { 2428a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now that this process has stopped, we may want to consider 2429a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // it to be the previous app to try to keep around in case 2430a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // the user wants to return to it. 2431a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 2432a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // First, found out what is currently the foreground app, so that 2433a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // we don't blow away the previous app if this activity is being 2434a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // hosted by the process that is actually still the foreground. 2435a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn ProcessRecord fgApp = null; 2436e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2437e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 24394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 24404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 24414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stack.mResumedActivity != null) { 24424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner fgApp = stack.mResumedActivity.app; 24434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } else if (stack.mPausingActivity != null) { 24444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner fgApp = stack.mPausingActivity.app; 24454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner break; 2447a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2448a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2449a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2450a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 2451a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now set this one as the previous process, only if that really 2452a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // makes sense to. 2453a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn if (r.app != null && fgApp != null && r.app != fgApp 2454a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn && r.lastVisibleTime > mService.mPreviousProcessVisibleTime 24554ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner && r.app != mService.mHomeProcess) { 2456a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcess = r.app; 2457a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcessVisibleTime = r.lastVisibleTime; 2458a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2459a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2460a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 246105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked() { 246205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return resumeTopActivitiesLocked(null, null, null); 246305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 246405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 246505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, 246605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner Bundle targetOptions) { 246705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner if (targetStack == null) { 246805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner targetStack = getFocusedStack(); 246905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 247012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner // Do targetStack first. 247105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean result = false; 247212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (isFrontStack(targetStack)) { 247312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner result = targetStack.resumeTopActivityLocked(target, targetOptions); 247412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 2475e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2476e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 24784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 247912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (stack == targetStack) { 248012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner // Already started above. 248112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner continue; 248212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 24834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 248412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner stack.resumeTopActivityLocked(null); 248505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 2486f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner } 24878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 248805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return result; 24898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 24918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void finishTopRunningActivityLocked(ProcessRecord app) { 2492e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2493e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 24954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 24964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 24974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.finishTopRunningActivityLocked(app); 24984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 25026ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn void finishVoiceTask(IVoiceInteractionSession session) { 25036ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 25046ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 25056ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn final int numStacks = stacks.size(); 25066ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 25076ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn final ActivityStack stack = stacks.get(stackNdx); 25086ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn stack.finishVoiceTask(session); 25096ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn } 25106ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn } 25116ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn } 25126ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn 2513299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner void findTaskToMoveToFrontLocked(TaskRecord task, int flags, Bundle options, String reason) { 2514aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) { 2515aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mUserLeaving = true; 25168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2517aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) { 2518aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner // Caller wants the home activity moved with it. To accomplish this, 2519aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner // we'll just indicate that this task returns to the home task. 252084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 2521aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2522299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner task.stack.moveTaskToFrontLocked(task, null, options, reason); 2523aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" 2524aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner + task.stack); 25258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2527967212cb542e6eeb308678367b53381bff984c31Craig Mautner ActivityStack getStack(int stackId) { 2528f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer activityContainer = mActivityContainers.get(stackId); 2529f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (activityContainer != null) { 2530f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return activityContainer.mStack; 25318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 25338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2535967212cb542e6eeb308678367b53381bff984c31Craig Mautner ArrayList<ActivityStack> getStacks() { 25364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<ActivityStack> allStacks = new ArrayList<ActivityStack>(); 2537e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2538e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner allStacks.addAll(mActivityDisplays.valueAt(displayNdx).mStacks); 25394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return allStacks; 25414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 25434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner IBinder getHomeActivityToken() { 2544ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner ActivityRecord homeActivity = getHomeActivity(); 2545ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner if (homeActivity != null) { 2546ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return homeActivity.appToken; 2547ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2548ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return null; 2549ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2550ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 2551ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner ActivityRecord getHomeActivity() { 25524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ArrayList<TaskRecord> tasks = mHomeStack.getAllTasks(); 25534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 25544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final TaskRecord task = tasks.get(taskNdx); 25554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (task.isHomeTask()) { 25564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ArrayList<ActivityRecord> activities = task.mActivities; 25574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { 25584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = activities.get(activityNdx); 25594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r.isHomeActivity()) { 2560ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return r; 25614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return null; 25664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 25684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityContainer createActivityContainer(ActivityRecord parentActivity, 25694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner IActivityContainerCallback callback) { 2570d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner ActivityContainer activityContainer = 2571d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner new VirtualActivityContainer(parentActivity, callback); 2572f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityContainers.put(activityContainer.mStackId, activityContainer); 2573d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (DEBUG_CONTAINERS) Slog.d(TAG, "createActivityContainer: " + activityContainer); 2574f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner parentActivity.mChildContainers.add(activityContainer); 2575f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return activityContainer; 25764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 257834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner void removeChildActivityContainers(ActivityRecord parentActivity) { 2579f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers; 2580f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) { 2581f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer container = childStacks.remove(containerNdx); 2582d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (DEBUG_CONTAINERS) Slog.d(TAG, "removeChildActivityContainers: removing " + 2583d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner container); 2584f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner container.release(); 258534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 258634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 258734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner 258895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner void deleteActivityContainer(IActivityContainer container) { 258995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner ActivityContainer activityContainer = (ActivityContainer)container; 259095da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (activityContainer != null) { 2591d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (DEBUG_CONTAINERS) Slog.d(TAG, "deleteActivityContainer: ", 2592d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner new RuntimeException("here").fillInStackTrace()); 259395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner final int stackId = activityContainer.mStackId; 259495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mActivityContainers.remove(stackId); 259595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mWindowManager.removeStack(stackId); 259695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 259795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 259895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner 2599f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private int createStackOnDisplay(int stackId, int displayId) { 2600e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 2601e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay == null) { 26024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return -1; 26034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 26044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 2605f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer activityContainer = new ActivityContainer(stackId); 2606f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityContainers.put(stackId, activityContainer); 2607e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner activityContainer.attachToDisplayLocked(activityDisplay); 26084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return stackId; 2609967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 2610967212cb542e6eeb308678367b53381bff984c31Craig Mautner 26114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int getNextStackId() { 2612858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner while (true) { 2613858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (++mLastStackId <= HOME_STACK_ID) { 2614858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mLastStackId = HOME_STACK_ID + 1; 2615858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 2616858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (getStack(mLastStackId) == null) { 2617858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner break; 26188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 26198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2620858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner return mLastStackId; 26218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 26228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 26237de0535701351d76b634ab18577269e8130749eaWale Ogunwale private boolean restoreRecentTaskLocked(TaskRecord task) { 26247de0535701351d76b634ab18577269e8130749eaWale Ogunwale ActivityStack stack = null; 26257de0535701351d76b634ab18577269e8130749eaWale Ogunwale // Determine stack to restore task to. 26267de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (mLeanbackOnlyDevice) { 26277de0535701351d76b634ab18577269e8130749eaWale Ogunwale // There is only one stack for lean back devices. 26287de0535701351d76b634ab18577269e8130749eaWale Ogunwale stack = mHomeStack; 26297de0535701351d76b634ab18577269e8130749eaWale Ogunwale } else { 26307de0535701351d76b634ab18577269e8130749eaWale Ogunwale // Look for the top stack on the home display that isn't the home stack. 26317de0535701351d76b634ab18577269e8130749eaWale Ogunwale final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks; 26327de0535701351d76b634ab18577269e8130749eaWale Ogunwale for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) { 26337de0535701351d76b634ab18577269e8130749eaWale Ogunwale final ActivityStack tmpStack = homeDisplayStacks.get(stackNdx); 26347de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (!tmpStack.isHomeStack()) { 26357de0535701351d76b634ab18577269e8130749eaWale Ogunwale stack = tmpStack; 26367de0535701351d76b634ab18577269e8130749eaWale Ogunwale break; 26377de0535701351d76b634ab18577269e8130749eaWale Ogunwale } 2638ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 2639ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 26407de0535701351d76b634ab18577269e8130749eaWale Ogunwale 26417de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (stack == null) { 26427de0535701351d76b634ab18577269e8130749eaWale Ogunwale // We couldn't find a stack to restore the task to. Possible if are restoring recents 26437de0535701351d76b634ab18577269e8130749eaWale Ogunwale // before an application stack is created...Go ahead and create one on the default 26447de0535701351d76b634ab18577269e8130749eaWale Ogunwale // display. 26457de0535701351d76b634ab18577269e8130749eaWale Ogunwale stack = getStack(createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY)); 2646f3ea23ad9bcd44bdbc8380c413989fc887b89cc8Craig Mautner // Restore home stack to top. 2647299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner moveHomeStack(true, "restoreRecentTask"); 26487de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (DEBUG_RECENTS) 26497de0535701351d76b634ab18577269e8130749eaWale Ogunwale Slog.v(TAG, "Created stack=" + stack + " for recents restoration."); 26507de0535701351d76b634ab18577269e8130749eaWale Ogunwale } 26517de0535701351d76b634ab18577269e8130749eaWale Ogunwale 26527de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (stack == null) { 26537de0535701351d76b634ab18577269e8130749eaWale Ogunwale // What does this mean??? Not sure how we would get here... 26547de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (DEBUG_RECENTS) 26557de0535701351d76b634ab18577269e8130749eaWale Ogunwale Slog.v(TAG, "Unable to find/create stack to restore recent task=" + task); 26567de0535701351d76b634ab18577269e8130749eaWale Ogunwale return false; 26577de0535701351d76b634ab18577269e8130749eaWale Ogunwale } 26587de0535701351d76b634ab18577269e8130749eaWale Ogunwale 26597de0535701351d76b634ab18577269e8130749eaWale Ogunwale stack.addTask(task, false, false); 26607de0535701351d76b634ab18577269e8130749eaWale Ogunwale if (DEBUG_RECENTS) 26617de0535701351d76b634ab18577269e8130749eaWale Ogunwale Slog.v(TAG, "Added restored task=" + task + " to stack=" + stack); 26627de0535701351d76b634ab18577269e8130749eaWale Ogunwale final ArrayList<ActivityRecord> activities = task.mActivities; 26637de0535701351d76b634ab18577269e8130749eaWale Ogunwale for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { 26647de0535701351d76b634ab18577269e8130749eaWale Ogunwale final ActivityRecord r = activities.get(activityNdx); 26657de0535701351d76b634ab18577269e8130749eaWale Ogunwale mWindowManager.addAppToken(0, r.appToken, task.taskId, stack.mStackId, 26667de0535701351d76b634ab18577269e8130749eaWale Ogunwale r.info.screenOrientation, r.fullscreen, 26677de0535701351d76b634ab18577269e8130749eaWale Ogunwale (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0, 26687de0535701351d76b634ab18577269e8130749eaWale Ogunwale r.userId, r.info.configChanges, task.voiceSession != null, 26697de0535701351d76b634ab18577269e8130749eaWale Ogunwale r.mLaunchTaskBehind); 26707de0535701351d76b634ab18577269e8130749eaWale Ogunwale } 26717de0535701351d76b634ab18577269e8130749eaWale Ogunwale return true; 2672ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 2673ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 2674299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner void moveTaskToStackLocked(int taskId, int stackId, boolean toTop) { 2675b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner final TaskRecord task = anyTaskForIdLocked(taskId); 2676b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (task == null) { 2677b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner return; 2678b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner } 26798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = getStack(stackId); 26808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack == null) { 26818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); 26828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return; 26838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2684299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner task.stack.removeTask(task, "moveTaskToStack"); 2685c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn stack.addTask(task, toTop, true); 2686b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner mWindowManager.addTask(taskId, stackId, toTop); 268705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 26888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 26898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2690ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityRecord findTaskLocked(ActivityRecord r) { 26912a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r); 2692e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2693e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 26944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 26954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 26964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (!r.isApplicationActivity() && !stack.isHomeStack()) { 26971b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (home activity) " + stack); 26981b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner continue; 26991b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner } 27001b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner if (!stack.mActivityContainer.isEligibleForNewTasks()) { 27011b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (new task not allowed) " + 27021b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner stack); 27034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner continue; 27044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord ar = stack.findTaskLocked(r); 27064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (ar != null) { 27074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return ar; 27084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 27108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 27112a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "No task found"); 27128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 27138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 27148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 27158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 2716e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2717e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 27184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 27194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord ar = stacks.get(stackNdx).findActivityLocked(intent, info); 27204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (ar != null) { 27214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return ar; 27224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 27248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 27258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 27268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 27278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 27288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void goingToSleepLocked() { 27290eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleSleepTimeout(); 27300eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mGoingToSleep.isHeld()) { 27310eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.acquire(); 27327ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 27337ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 27347ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 27350eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 27377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 27380eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2740ce15e157a6cf56fc73961ccb8c5ab18b1bf70280Amith Yamasani checkReadyForSleepLocked(); 27418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 27438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean shutdownLocked(int timeout) { 27440eea92c67b292b005c152641a12b920fe145826cCraig Mautner goingToSleepLocked(); 27450eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2746f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner boolean timedout = false; 27470eea92c67b292b005c152641a12b920fe145826cCraig Mautner final long endTime = System.currentTimeMillis() + timeout; 27480eea92c67b292b005c152641a12b920fe145826cCraig Mautner while (true) { 27490eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean cantShutdown = false; 2750e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2751e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 27524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 27534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner cantShutdown |= stacks.get(stackNdx).checkReadyForSleepLocked(); 27544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27550eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27560eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (cantShutdown) { 27570eea92c67b292b005c152641a12b920fe145826cCraig Mautner long timeRemaining = endTime - System.currentTimeMillis(); 27580eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (timeRemaining > 0) { 27598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 27600eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.wait(timeRemaining); 27618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (InterruptedException e) { 27628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27630eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 27640eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Activity manager shutdown timed out"); 27650eea92c67b292b005c152641a12b920fe145826cCraig Mautner timedout = true; 27660eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 27678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27680eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 27690eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 27708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27720eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27730eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Force checkReadyForSleep to complete. 27740eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 27750eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 27760eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return timedout; 27788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 27808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void comeOutOfSleepIfNeededLocked() { 27810eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 27820eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 27830eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 27840eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 2785e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2786e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 27874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 27884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 27894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.awakeFromSleepingLocked(); 27904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 27914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner resumeTopActivitiesLocked(); 27924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27935314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner } 27948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27950eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.clear(); 27960eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27970eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27980eea92c67b292b005c152641a12b920fe145826cCraig Mautner void activitySleptLocked(ActivityRecord r) { 27990eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.remove(r); 28000eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 28010eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28020eea92c67b292b005c152641a12b920fe145826cCraig Mautner 28030eea92c67b292b005c152641a12b920fe145826cCraig Mautner void checkReadyForSleepLocked() { 28040eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mService.isSleepingOrShuttingDown()) { 28050eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Do not care. 28060eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 28070eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28080eea92c67b292b005c152641a12b920fe145826cCraig Mautner 28090eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mSleepTimeout) { 28100eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean dontSleep = false; 2811e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2812e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 28134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 28144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner dontSleep |= stacks.get(stackNdx).checkReadyForSleepLocked(); 28154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28160eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28170eea92c67b292b005c152641a12b920fe145826cCraig Mautner 28180eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mStoppingActivities.size() > 0) { 28190eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to stop; can't sleep yet. 28200eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 28210eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mStoppingActivities.size() + " activities"); 28220eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleIdleLocked(); 28230eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 28240eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28250eea92c67b292b005c152641a12b920fe145826cCraig Mautner 28260eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleepActivities.size() > 0) { 28270eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to sleep; can't sleep yet. 28280eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 28290eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mGoingToSleepActivities.size() + " activities"); 28300eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 28310eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28320eea92c67b292b005c152641a12b920fe145826cCraig Mautner 28330eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (dontSleep) { 28340eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 28350eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28360eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28370eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2838e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2839e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 28404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 28414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.get(stackNdx).goToSleep(); 28424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28430eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28440eea92c67b292b005c152641a12b920fe145826cCraig Mautner 28450eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 28460eea92c67b292b005c152641a12b920fe145826cCraig Mautner 28470eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 28480eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 28490eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28500eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.mShuttingDown) { 28510eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.notifyAll(); 28520eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 28538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2855ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner boolean reportResumedActivityLocked(ActivityRecord r) { 2856ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = r.task.stack; 2857ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (isFrontStack(stack)) { 28585782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey mService.updateUsageStats(r, true); 2859ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2860ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (allResumedActivitiesComplete()) { 2861ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ensureActivitiesVisibleLocked(null, 0); 2862ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.executeAppTransition(); 2863ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return true; 2864ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2865ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return false; 2866ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2867ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 28688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void handleAppCrashLocked(ProcessRecord app) { 2869e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2870e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 28714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 28724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 28734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 28744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.handleAppCrashLocked(app); 28754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 28794b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima boolean requestVisibleBehindLocked(ActivityRecord r, boolean visible) { 2880ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner final ActivityStack stack = r.task.stack; 2881ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner if (stack == null) { 28824b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: r=" + r + " visible=" + 28834b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima visible + " stack is null"); 2884ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return false; 2885ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 28864b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima final boolean isVisible = stack.hasVisibleBehindActivity(); 28874b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind r=" + r + " visible=" + 28884b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima visible + " isVisible=" + isVisible); 2889ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 2890ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner final ActivityRecord top = topRunningActivityLocked(); 28914b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (top == null || top == r || (visible == isVisible)) { 28924b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: quick return"); 28934b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima stack.setVisibleBehindActivity(visible ? r : null); 2894ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return true; 2895ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2896ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 2897ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner // A non-top activity is reporting a visibility change. 2898aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner if (visible && top.fullscreen) { 2899aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner // Let the caller know that it can't be seen. 29004b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: returning top.fullscreen=" 290134ff492978d30569e694f7427be430dce66cac06Jose Lima + top.fullscreen + " top.state=" + top.state + " top.app=" + top.app + 2902ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner " top.app.thread=" + top.app.thread); 2903ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return false; 290434ff492978d30569e694f7427be430dce66cac06Jose Lima } else if (!visible && stack.getVisibleBehindActivity() != r) { 290534ff492978d30569e694f7427be430dce66cac06Jose Lima // Only the activity set as currently visible behind should actively reset its 290634ff492978d30569e694f7427be430dce66cac06Jose Lima // visible behind state. 290734ff492978d30569e694f7427be430dce66cac06Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: returning visible=" 290834ff492978d30569e694f7427be430dce66cac06Jose Lima + visible + " stack.getVisibleBehindActivity()=" + 290934ff492978d30569e694f7427be430dce66cac06Jose Lima stack.getVisibleBehindActivity() + " r=" + r); 291034ff492978d30569e694f7427be430dce66cac06Jose Lima return false; 2911ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2912ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 29134b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima stack.setVisibleBehindActivity(visible ? r : null); 29144b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (!visible) { 2915fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner // Make the activity immediately above r opaque. 2916fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner final ActivityRecord next = stack.findNextTranslucentActivity(r); 2917fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner if (next != null) { 2918fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner mService.convertFromTranslucent(next.appToken); 2919fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner } 2920fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner } 2921aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner if (top.app != null && top.app.thread != null) { 2922aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner // Notify the top app of the change. 2923aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner try { 2924aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner top.app.thread.scheduleBackgroundVisibleBehindChanged(top.appToken, visible); 2925aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner } catch (RemoteException e) { 2926aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner } 2927ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2928ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return true; 2929ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2930ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 2931bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner // Called when WindowManager has finished animating the launchingBehind activity to the back. 2932bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner void handleLaunchTaskBehindCompleteLocked(ActivityRecord r) { 2933bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner r.mLaunchTaskBehind = false; 2934bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner final TaskRecord task = r.task; 2935bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner task.setLastThumbnail(task.stack.screenshotActivities(r)); 2936bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner mService.addRecentTaskLocked(task); 2937740c3ac782675d190941b2ab1905e56f246c1b11Winson Chung mService.notifyTaskStackChangedLocked(); 2938bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner mWindowManager.setAppVisibility(r.appToken, false); 2939bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 2940bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner 2941bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner void scheduleLaunchTaskBehindComplete(IBinder token) { 2942bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner mHandler.obtainMessage(LAUNCH_TASK_BEHIND_COMPLETE, token).sendToTarget(); 2943bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 2944bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner 2945de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) { 2946580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner // First the front stacks. In case any are not fullscreen and are in front of home. 2947e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2948e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 29494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int topStackNdx = stacks.size() - 1; 29504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) { 29514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 2952729cb2391f8eedbab9af1d0ef62febb0b56292ccJose Lima stack.ensureActivitiesVisibleLocked(starting, configChanges); 2953580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner } 29548d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 29558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 29568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 29578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void scheduleDestroyAllActivities(ProcessRecord app, String reason) { 2958e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2959e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 29604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 29614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 29624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 2963ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner stack.scheduleDestroyActivities(app, reason); 29644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 29668d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 29678d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 296889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn void releaseSomeActivitiesLocked(ProcessRecord app, String reason) { 296989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Examine all activities currently running in the process. 297089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn TaskRecord firstTask = null; 297189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Tasks is non-null only if two or more tasks are found. 297289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ArraySet<TaskRecord> tasks = null; 297389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Trying to release some activities in " + app); 297489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn for (int i=0; i<app.activities.size(); i++) { 297589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityRecord r = app.activities.get(i); 297689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // First, if we find an activity that is in the process of being destroyed, 297789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // then we just aren't going to do anything for now; we want things to settle 297889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // down before we try to prune more activities. 297989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (r.finishing || r.state == ActivityState.DESTROYING 298089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn || r.state == ActivityState.DESTROYED) { 298189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Abort release; already destroying: " + r); 298289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return; 298389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 298489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Don't consider any activies that are currently not in a state where they 298589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // can be destroyed. 298689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (r.visible || !r.stopped || !r.haveState 298789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn || r.state == ActivityState.RESUMED || r.state == ActivityState.PAUSING 298889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn || r.state == ActivityState.PAUSED || r.state == ActivityState.STOPPING) { 298989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Not releasing in-use activity: " + r); 299089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn continue; 299189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 299289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (r.task != null) { 299389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Collecting release task " + r.task 299489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn + " from " + r); 299589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (firstTask == null) { 299689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn firstTask = r.task; 299789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else if (firstTask != r.task) { 299889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (tasks == null) { 299989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn tasks = new ArraySet<>(); 300089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn tasks.add(firstTask); 300189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 300289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn tasks.add(r.task); 300389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 300489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 300589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 300689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (tasks == null) { 300789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Didn't find two or more tasks to release"); 300889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return; 300989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 301089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // If we have activities in multiple tasks that are in a position to be destroyed, 301189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // let's iterate through the tasks and release the oldest one. 301289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final int numDisplays = mActivityDisplays.size(); 301389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 301489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 301589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Step through all stacks starting from behind, to hit the oldest things first. 301689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn for (int stackNdx = 0; stackNdx < stacks.size(); stackNdx++) { 301789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final ActivityStack stack = stacks.get(stackNdx); 301889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Try to release activities in this stack; if we manage to, we are done. 301989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (stack.releaseSomeActivitiesLocked(app, tasks, reason) > 0) { 302089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return; 302189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 302289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 302389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 302489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 302589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 30268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean switchUserLocked(int userId, UserStartedState uss) { 30274f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId()); 30284f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID); 30292420ead0326bfd2587da6231be419e758dba1930Craig Mautner mCurrentUser = userId; 3030ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 3031858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mStartingUsers.add(uss); 3032e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3033e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 30344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3035e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityStack stack = stacks.get(stackNdx); 3036e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner stack.switchUserLocked(userId); 3037dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina TaskRecord task = stack.topTask(); 3038dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina if (task != null) { 3039dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina mWindowManager.moveTaskToTop(task.taskId); 3040dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina } 30414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3042ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 3043858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 30444f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner ActivityStack stack = getStack(restoreStackId); 30454f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner if (stack == null) { 30464f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner stack = mHomeStack; 30474f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner } 30484f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner final boolean homeInFront = stack.isHomeStack(); 3049e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (stack.isOnHomeDisplay()) { 3050299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner moveHomeStack(homeInFront, "switchUserOnHomeDisplay"); 3051dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina TaskRecord task = stack.topTask(); 3052dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina if (task != null) { 3053dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina mWindowManager.moveTaskToTop(task.taskId); 3054dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina } 3055e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } else { 3056e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner // Stack was moved to another display while user was swapped out. 3057299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner resumeHomeStackTask(HOME_ACTIVITY_TYPE, null, "switchUserOnOtherDisplay"); 3058e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 305993529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner return homeInFront; 30602219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 30612219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 30621a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani /** 30631a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani * Add background users to send boot completed events to. 30641a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani * @param userId The user being started in the background 30651a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani * @param uss The state object for the user. 30661a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani */ 30671a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani public void startBackgroundUserLocked(int userId, UserStartedState uss) { 30681a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mStartingBackgroundUsers.add(uss); 30691a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 30701a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani 3071de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) { 3072de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner int N = mStoppingActivities.size(); 3073de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (N <= 0) return null; 3074de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 3075de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ArrayList<ActivityRecord> stops = null; 3076de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 3077de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final boolean nowVisible = allResumedActivitiesVisible(); 3078de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int i=0; i<N; i++) { 3079de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord s = mStoppingActivities.get(i); 3080a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 3081de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + nowVisible + " waitingVisible=" + s.waitingVisible 3082de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + " finishing=" + s.finishing); 3083de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.waitingVisible && nowVisible) { 3084de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mWaitingVisibleActivities.remove(s); 3085de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner s.waitingVisible = false; 3086de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.finishing) { 3087de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // If this activity is finishing, it is sitting on top of 3088de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // everyone else but we now know it is no longer needed... 3089de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // so get rid of it. Otherwise, we need to go through the 3090de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // normal flow and hide it once we determine that it is 3091de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // hidden by the activities in front of it. 3092de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 3093ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.setAppVisibility(s.appToken, false); 3094de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3095de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3096de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) { 3097de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 3098de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stops == null) { 3099de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops = new ArrayList<ActivityRecord>(); 3100de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3101de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops.add(s); 3102de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStoppingActivities.remove(i); 3103de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner N--; 3104de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner i--; 3105de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3106de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3107de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 3108de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return stops; 3109de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3110de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 3111cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner void validateTopActivitiesLocked() { 31124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // FIXME 31134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner/* for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 31144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 3115cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner final ActivityRecord r = stack.topRunningActivityLocked(null); 3116f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityState state = r == null ? ActivityState.DESTROYED : r.state; 3117cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (isFrontStack(stack)) { 3118cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (r == null) { 3119cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: null top activity, stack=" + stack); 3120cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 3121f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord pausing = stack.mPausingActivity; 3122f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (pausing != null && pausing == r) { 3123cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r + 3124f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 3125cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3126f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) { 3127cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r + 3128f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 3129cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3130cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3131cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 3132f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord resumed = stack.mResumedActivity; 3133f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (resumed != null && resumed == r) { 3134cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r + 3135f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 3136cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3137f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (r != null && (state == ActivityState.INITIALIZING 3138f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner || state == ActivityState.RESUMED)) { 3139cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in back resumed r=" + r + 3140f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 3141cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3142cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3143cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 31444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner*/ 314576ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner } 314676ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner 3147270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner public void dump(PrintWriter pw, String prefix) { 3148d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack); 31494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pw.print(" mLastFocusedStack="); pw.println(mLastFocusedStack); 3150d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout); 3151d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId); 3152d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront); 315395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers); 3154270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 31558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 315620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { 3157ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return getFocusedStack().getDumpActivitiesLocked(name); 315820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 315920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 3160390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage, 3161390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean needSep, String prefix) { 3162390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (activity != null) { 3163390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (dumpPackage == null || dumpPackage.equals(activity.packageName)) { 3164390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (needSep) { 3165390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(); 3166390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 3167390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.print(prefix); 3168390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(activity); 31697ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return true; 3170390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 3171390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 31727ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return false; 3173390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 3174390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn 31758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 31768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpClient, String dumpPackage) { 31777ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean printed = false; 31787ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean needSep = false; 3179e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { 3180e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx); 3181ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner pw.print("Display #"); pw.print(activityDisplay.mDisplayId); 3182737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner pw.println(" (activities from top to bottom):"); 3183e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = activityDisplay.mStacks; 3184737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 31854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 31864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StringBuilder stackHeader = new StringBuilder(128); 31874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stackHeader.append(" Stack #"); 31884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stackHeader.append(stack.mStackId); 31894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stackHeader.append(":"); 31904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, 31914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep, stackHeader.toString()); 31924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, " ", "Run", false, 31934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner !dumpAll, false, dumpPackage, true, 31944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " Running activities (most recent first):", null); 31954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 31964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = printed; 31974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep, 31984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mPausingActivity: "); 31994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (pr) { 32004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed = true; 32014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = false; 32024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 32034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep, 32044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mResumedActivity: "); 32057ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (pr) { 32067ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed = true; 32074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = false; 32084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 32094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (dumpAll) { 32104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep, 32114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mLastPausedActivity: "); 32124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (pr) { 32134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed = true; 32144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = true; 32154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 32164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage, 32174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep, " mLastNoHistoryActivity: "); 32187ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 32194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = printed; 32208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 32237ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mFinishingActivities, " ", "Fin", false, !dumpAll, 32247ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to finish:", null); 32257ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mStoppingActivities, " ", "Stop", false, !dumpAll, 32267ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to stop:", null); 32277ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, " ", "Wait", false, !dumpAll, 32287ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting for another to become visible:", 32297ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn null); 32307ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 32317ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 32327ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 32337ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 3234de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 32357ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return printed; 32368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3238390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, 32398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner String prefix, String label, boolean complete, boolean brief, boolean client, 32407ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn String dumpPackage, boolean needNL, String header1, String header2) { 32418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord lastTask = null; 3242390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String innerPrefix = null; 3243390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String[] args = null; 3244390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean printed = false; 32458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int i=list.size()-1; i>=0; i--) { 32468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityRecord r = list.get(i); 32478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpPackage != null && !dumpPackage.equals(r.packageName)) { 32488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner continue; 32498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3250390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (innerPrefix == null) { 3251390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn innerPrefix = prefix + " "; 3252390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn args = new String[0]; 3253390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 3254390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn printed = true; 32558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final boolean full = !brief && (complete || !r.isInHistory()); 32568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (needNL) { 3257390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(""); 32588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = false; 32598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header1 != null) { 32617ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header1); 32627ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header1 = null; 32637ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 32647ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header2 != null) { 32657ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header2); 32667ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header2 = null; 3267390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 32688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask != r.task) { 32698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask = r.task; 32708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); 32718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(full ? "* " : " "); 32728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask); 32738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 32748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask.dump(pw, prefix + " "); 32758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 32768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 32778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask.intent != null) { 32788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(" "); 32798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask.intent.toInsecureStringWithClip()); 32808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(full ? " * " : " "); pw.print(label); 32848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(" #"); pw.print(i); pw.print(": "); 32858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(r); 32868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 32878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.dump(pw, innerPrefix); 32888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 32898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 32908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.intent.toInsecureString()); 32918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (r.app != null) { 32928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.app); 32938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (client && r.app != null && r.app.thread != null) { 32968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // flush anything that is already in the PrintWriter since the thread is going 32978d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // to write to the file descriptor directly 32988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.flush(); 32998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 33008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TransferPipe tp = new TransferPipe(); 33018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 33028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(), 33038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.appToken, innerPrefix, args); 33048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Short timeout, since blocking here can 33058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // deadlock with the application. 33068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.go(fd, 2000); 33078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } finally { 33088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.kill(); 33098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 33108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (IOException e) { 33118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Failure while dumping the activity: " + e); 33128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (RemoteException e) { 33138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Got a RemoteException while dumping the activity"); 33148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 33158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = true; 33168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 33178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3318390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn return printed; 33198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3320ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 3321f333327782e14688e1c198c1192172d51308e90bCraig Mautner void scheduleIdleTimeoutLocked(ActivityRecord next) { 3322b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4)); 3323c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next); 3324c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 3325f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 3326f333327782e14688e1c198c1192172d51308e90bCraig Mautner 3327f333327782e14688e1c198c1192172d51308e90bCraig Mautner final void scheduleIdleLocked() { 332805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mHandler.sendEmptyMessage(IDLE_NOW_MSG); 3329f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 3330f333327782e14688e1c198c1192172d51308e90bCraig Mautner 3331f333327782e14688e1c198c1192172d51308e90bCraig Mautner void removeTimeoutsForActivityLocked(ActivityRecord r) { 3332b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4)); 3333f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 3334f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 3335f333327782e14688e1c198c1192172d51308e90bCraig Mautner 333605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner final void scheduleResumeTopActivities() { 333734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) { 333834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 333934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 334005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 334105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 33420eea92c67b292b005c152641a12b920fe145826cCraig Mautner void removeSleepTimeouts() { 33430eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = false; 33440eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 33450eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 33460eea92c67b292b005c152641a12b920fe145826cCraig Mautner 33470eea92c67b292b005c152641a12b920fe145826cCraig Mautner final void scheduleSleepTimeout() { 33480eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 33490eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT); 33500eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 33510eea92c67b292b005c152641a12b920fe145826cCraig Mautner 33524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 33534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void onDisplayAdded(int displayId) { 3354d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Slog.v(TAG, "Display added displayId=" + displayId); 33554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0)); 33564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 33594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void onDisplayRemoved(int displayId) { 3360d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Slog.v(TAG, "Display removed displayId=" + displayId); 33614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0)); 33624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 33654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void onDisplayChanged(int displayId) { 3366d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Slog.v(TAG, "Display changed displayId=" + displayId); 33674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0)); 33684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void handleDisplayAddedLocked(int displayId) { 33714504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner boolean newDisplay; 33724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 33734504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner newDisplay = mActivityDisplays.get(displayId) == null; 33744504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner if (newDisplay) { 33754504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner ActivityDisplay activityDisplay = new ActivityDisplay(displayId); 33761a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner if (activityDisplay.mDisplay == null) { 33771a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner Slog.w(TAG, "Display " + displayId + " gone before initialization complete"); 33781a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner return; 33791a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner } 33804504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mActivityDisplays.put(displayId, activityDisplay); 33814504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 33824504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 33834504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner if (newDisplay) { 33844504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mWindowManager.onDisplayAdded(displayId); 33854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void handleDisplayRemovedLocked(int displayId) { 33894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 3390e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 3391e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay != null) { 3392e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = activityDisplay.mStacks; 33934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 339434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner stacks.get(stackNdx).mActivityContainer.detachLocked(); 33954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3396e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplays.remove(displayId); 33974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager.onDisplayRemoved(displayId); 34004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 34024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void handleDisplayChangedLocked(int displayId) { 34034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 3404e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 3405e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay != null) { 34064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // TODO: Update the bounds. 34074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager.onDisplayChanged(displayId); 34104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 34124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StackInfo getStackInfo(ActivityStack stack) { 34134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StackInfo info = new StackInfo(); 34144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager.getStackBounds(stack.mStackId, info.bounds); 34154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.displayId = Display.DEFAULT_DISPLAY; 34164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.stackId = stack.mStackId; 34174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 34184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<TaskRecord> tasks = stack.getAllTasks(); 34194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numTasks = tasks.size(); 34204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int[] taskIds = new int[numTasks]; 34214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner String[] taskNames = new String[numTasks]; 34224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int i = 0; i < numTasks; ++i) { 34234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final TaskRecord task = tasks.get(i); 34244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner taskIds[i] = task.taskId; 34254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner taskNames[i] = task.origActivity != null ? task.origActivity.flattenToString() 34264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner : task.realActivity != null ? task.realActivity.flattenToString() 34274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner : task.getTopActivity() != null ? task.getTopActivity().packageName 34284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner : "unknown"; 34294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.taskIds = taskIds; 34314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.taskNames = taskNames; 34324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return info; 34334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 34354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StackInfo getStackInfoLocked(int stackId) { 34364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStack stack = getStack(stackId); 34374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stack != null) { 34384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return getStackInfo(stack); 34394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return null; 34414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 34434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<StackInfo> getAllStackInfosLocked() { 34444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<StackInfo> list = new ArrayList<StackInfo>(); 3445e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { 3446e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 34474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int ndx = stacks.size() - 1; ndx >= 0; --ndx) { 34484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner list.add(getStackInfo(stacks.get(ndx))); 34494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return list; 34524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 34534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3454a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk void showLockTaskToast() { 3455a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk mLockTaskNotify.showToast(mLockTaskIsLocked); 3456a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk } 3457a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk 3458299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner void setLockTaskModeLocked(TaskRecord task, boolean isLocked, String reason) { 3459aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (task == null) { 34603bd90617ec07a1093139de39591a624b21468e46Christopher Tate // Take out of lock task mode if necessary 34613bd90617ec07a1093139de39591a624b21468e46Christopher Tate if (mLockTaskModeTask != null) { 34623bd90617ec07a1093139de39591a624b21468e46Christopher Tate final Message lockTaskMsg = Message.obtain(); 34633bd90617ec07a1093139de39591a624b21468e46Christopher Tate lockTaskMsg.arg1 = mLockTaskModeTask.userId; 34643bd90617ec07a1093139de39591a624b21468e46Christopher Tate lockTaskMsg.what = LOCK_TASK_END_MSG; 34653bd90617ec07a1093139de39591a624b21468e46Christopher Tate mLockTaskModeTask = null; 34663bd90617ec07a1093139de39591a624b21468e46Christopher Tate mHandler.sendMessage(lockTaskMsg); 34673bd90617ec07a1093139de39591a624b21468e46Christopher Tate } 3468aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return; 3469aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3470aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(task)) { 3471aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "setLockTaskMode: Attempt to start a second Lock Task Mode task."); 3472aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return; 3473aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3474aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mLockTaskModeTask = task; 3475299f960e5e5837da44cd81692388f3cbd5d2c362Craig Mautner findTaskToMoveToFrontLocked(task, 0, null, reason); 3476aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner resumeTopActivitiesLocked(); 34773bd90617ec07a1093139de39591a624b21468e46Christopher Tate 34783bd90617ec07a1093139de39591a624b21468e46Christopher Tate final Message lockTaskMsg = Message.obtain(); 347935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk lockTaskMsg.obj = mLockTaskModeTask.intent.getComponent().getPackageName(); 348035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk lockTaskMsg.arg1 = mLockTaskModeTask.userId; 34815286d3ff47135976d66d67888cadca52ef2ab244justinzhang lockTaskMsg.what = LOCK_TASK_START_MSG; 3482a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk lockTaskMsg.arg2 = !isLocked ? 1 : 0; 34835286d3ff47135976d66d67888cadca52ef2ab244justinzhang mHandler.sendMessage(lockTaskMsg); 3484aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3485aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 3486aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner boolean isLockTaskModeViolation(TaskRecord task) { 3487aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return mLockTaskModeTask != null && mLockTaskModeTask != task; 3488aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3489aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 3490aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner void endLockTaskModeIfTaskEnding(TaskRecord task) { 3491aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (mLockTaskModeTask != null && mLockTaskModeTask == task) { 3492835495c1175cd159635997ecff4281eb51e72fe6Jason Monk final Message lockTaskMsg = Message.obtain(); 3493835495c1175cd159635997ecff4281eb51e72fe6Jason Monk lockTaskMsg.arg1 = mLockTaskModeTask.userId; 3494835495c1175cd159635997ecff4281eb51e72fe6Jason Monk lockTaskMsg.what = LOCK_TASK_END_MSG; 3495aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mLockTaskModeTask = null; 3496835495c1175cd159635997ecff4281eb51e72fe6Jason Monk mHandler.sendMessage(lockTaskMsg); 3497aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3498aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3499aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 3500aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner boolean isInLockTaskMode() { 3501aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return mLockTaskModeTask != null; 3502aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3503aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 3504ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner private final class ActivityStackSupervisorHandler extends Handler { 3505f333327782e14688e1c198c1192172d51308e90bCraig Mautner 3506ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public ActivityStackSupervisorHandler(Looper looper) { 3507ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner super(looper); 3508ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3509ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 3510f333327782e14688e1c198c1192172d51308e90bCraig Mautner void activityIdleInternal(ActivityRecord r) { 3511f333327782e14688e1c198c1192172d51308e90bCraig Mautner synchronized (mService) { 3512f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternalLocked(r != null ? r.appToken : null, true, null); 3513f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 35147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 35157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 3516ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner @Override 3517ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public void handleMessage(Message msg) { 3518ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner switch (msg.what) { 3519f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_TIMEOUT_MSG: { 35205eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj); 3521f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mService.mDidDexOpt) { 3522f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.mDidDexOpt = false; 3523f333327782e14688e1c198c1192172d51308e90bCraig Mautner Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 3524f333327782e14688e1c198c1192172d51308e90bCraig Mautner nmsg.obj = msg.obj; 3525f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 3526f333327782e14688e1c198c1192172d51308e90bCraig Mautner return; 3527f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 3528f333327782e14688e1c198c1192172d51308e90bCraig Mautner // We don't at this point know if the activity is fullscreen, 3529f333327782e14688e1c198c1192172d51308e90bCraig Mautner // so we need to be conservative and assume it isn't. 3530f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 3531f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 3532f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_NOW_MSG: { 35335eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj); 3534f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 3535f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 353605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner case RESUME_TOP_ACTIVITY_MSG: { 353705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner synchronized (mService) { 353805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 353905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 354005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } break; 35410eea92c67b292b005c152641a12b920fe145826cCraig Mautner case SLEEP_TIMEOUT_MSG: { 35420eea92c67b292b005c152641a12b920fe145826cCraig Mautner synchronized (mService) { 35430eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.isSleepingOrShuttingDown()) { 35440eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Sleep timeout! Sleeping now."); 35450eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 35460eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 35470eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 35480eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 35490eea92c67b292b005c152641a12b920fe145826cCraig Mautner } break; 35507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner case LAUNCH_TIMEOUT_MSG: { 35517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mService.mDidDexOpt) { 35527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mDidDexOpt = false; 35537ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 35547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return; 35557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 35567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner synchronized (mService) { 35577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 35587ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 35597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER 35607ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner && Binder.getCallingUid() != Process.myUid()) { 35617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 35627ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 35637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 35647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 35657ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 35667ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } break; 35674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner case HANDLE_DISPLAY_ADDED: { 35684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner handleDisplayAddedLocked(msg.arg1); 35694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } break; 35704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner case HANDLE_DISPLAY_CHANGED: { 35714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner handleDisplayChangedLocked(msg.arg1); 35724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } break; 35734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner case HANDLE_DISPLAY_REMOVED: { 35744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner handleDisplayRemovedLocked(msg.arg1); 35754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } break; 3576e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner case CONTAINER_CALLBACK_VISIBILITY: { 3577e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner final ActivityContainer container = (ActivityContainer) msg.obj; 3578d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner final IActivityContainerCallback callback = container.mCallback; 3579d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner if (callback != null) { 3580d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner try { 3581d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner callback.setVisible(container.asBinder(), msg.arg1 == 1); 3582d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } catch (RemoteException e) { 3583d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } 3584e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3585d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } break; 35865286d3ff47135976d66d67888cadca52ef2ab244justinzhang case LOCK_TASK_START_MSG: { 35875286d3ff47135976d66d67888cadca52ef2ab244justinzhang // When lock task starts, we disable the status bars. 35885286d3ff47135976d66d67888cadca52ef2ab244justinzhang try { 358962515beee67307d8859beec521b7baedfa54b2b5Jason Monk if (mLockTaskNotify == null) { 359062515beee67307d8859beec521b7baedfa54b2b5Jason Monk mLockTaskNotify = new LockTaskNotify(mService.mContext); 359162515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 359262515beee67307d8859beec521b7baedfa54b2b5Jason Monk mLockTaskNotify.show(true); 35932961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk mLockTaskIsLocked = msg.arg2 == 0; 35945286d3ff47135976d66d67888cadca52ef2ab244justinzhang if (getStatusBarService() != null) { 359562515beee67307d8859beec521b7baedfa54b2b5Jason Monk int flags = 359662515beee67307d8859beec521b7baedfa54b2b5Jason Monk StatusBarManager.DISABLE_MASK ^ StatusBarManager.DISABLE_BACK; 35972961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk if (!mLockTaskIsLocked) { 359862515beee67307d8859beec521b7baedfa54b2b5Jason Monk flags ^= StatusBarManager.DISABLE_HOME 359962515beee67307d8859beec521b7baedfa54b2b5Jason Monk | StatusBarManager.DISABLE_RECENT; 360062515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 360162515beee67307d8859beec521b7baedfa54b2b5Jason Monk getStatusBarService().disable(flags, mToken, 360262515beee67307d8859beec521b7baedfa54b2b5Jason Monk mService.mContext.getPackageName()); 36035286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 360462515beee67307d8859beec521b7baedfa54b2b5Jason Monk mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG); 360535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk if (getDevicePolicyManager() != null) { 360635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk getDevicePolicyManager().notifyLockTaskModeChanged(true, 360762515beee67307d8859beec521b7baedfa54b2b5Jason Monk (String)msg.obj, msg.arg1); 360835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 36095286d3ff47135976d66d67888cadca52ef2ab244justinzhang } catch (RemoteException ex) { 36105286d3ff47135976d66d67888cadca52ef2ab244justinzhang throw new RuntimeException(ex); 36115286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3612b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner } break; 36135286d3ff47135976d66d67888cadca52ef2ab244justinzhang case LOCK_TASK_END_MSG: { 36145286d3ff47135976d66d67888cadca52ef2ab244justinzhang // When lock task ends, we enable the status bars. 36155286d3ff47135976d66d67888cadca52ef2ab244justinzhang try { 361662515beee67307d8859beec521b7baedfa54b2b5Jason Monk if (getStatusBarService() != null) { 361762515beee67307d8859beec521b7baedfa54b2b5Jason Monk getStatusBarService().disable(StatusBarManager.DISABLE_NONE, mToken, 361862515beee67307d8859beec521b7baedfa54b2b5Jason Monk mService.mContext.getPackageName()); 361962515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 362062515beee67307d8859beec521b7baedfa54b2b5Jason Monk mWindowManager.reenableKeyguard(mToken); 362135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk if (getDevicePolicyManager() != null) { 362235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk getDevicePolicyManager().notifyLockTaskModeChanged(false, null, 362335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk msg.arg1); 362435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 362562515beee67307d8859beec521b7baedfa54b2b5Jason Monk if (mLockTaskNotify == null) { 362662515beee67307d8859beec521b7baedfa54b2b5Jason Monk mLockTaskNotify = new LockTaskNotify(mService.mContext); 362762515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 362862515beee67307d8859beec521b7baedfa54b2b5Jason Monk mLockTaskNotify.show(false); 362962515beee67307d8859beec521b7baedfa54b2b5Jason Monk try { 363094cfd9d7c42287c18bde29aa1ae34944eb448f45Jason Monk boolean shouldLockKeyguard = Settings.Secure.getInt( 363162515beee67307d8859beec521b7baedfa54b2b5Jason Monk mService.mContext.getContentResolver(), 363294cfd9d7c42287c18bde29aa1ae34944eb448f45Jason Monk Settings.Secure.LOCK_TO_APP_EXIT_LOCKED) != 0; 36332961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk if (!mLockTaskIsLocked && shouldLockKeyguard) { 363462515beee67307d8859beec521b7baedfa54b2b5Jason Monk mWindowManager.lockNow(null); 36357779bf1ce8243d9f856c05db3cc5a37a8227a970Jason Monk mWindowManager.dismissKeyguard(); 3636e069779dea07c77fb858a403c42020e39b3d9c60Jason Monk new LockPatternUtils(mService.mContext) 3637e069779dea07c77fb858a403c42020e39b3d9c60Jason Monk .requireCredentialEntry(UserHandle.USER_ALL); 363862515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 363962515beee67307d8859beec521b7baedfa54b2b5Jason Monk } catch (SettingNotFoundException e) { 364062515beee67307d8859beec521b7baedfa54b2b5Jason Monk // No setting, don't lock. 364162515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 36425286d3ff47135976d66d67888cadca52ef2ab244justinzhang } catch (RemoteException ex) { 36435286d3ff47135976d66d67888cadca52ef2ab244justinzhang throw new RuntimeException(ex); 36445286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3645b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner } break; 3646d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner case CONTAINER_CALLBACK_TASK_LIST_EMPTY: { 3647d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner final ActivityContainer container = (ActivityContainer) msg.obj; 3648d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner final IActivityContainerCallback callback = container.mCallback; 3649d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner if (callback != null) { 3650d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner try { 3651d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner callback.onAllActivitiesComplete(container.asBinder()); 3652d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } catch (RemoteException e) { 3653d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } 3654d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } 3655d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } break; 3656d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner case CONTAINER_TASK_LIST_EMPTY_TIMEOUT: { 3657d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3658d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Slog.w(TAG, "Timeout waiting for all activities in task to finish. " + 3659d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner msg.obj); 3660ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ActivityContainer container = (ActivityContainer) msg.obj; 3661ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner container.mStack.finishAllActivitiesLocked(true); 3662ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner container.onTaskListEmptyLocked(); 3663d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3664d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } break; 3665bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner case LAUNCH_TASK_BEHIND_COMPLETE: { 3666bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner synchronized (mService) { 3667bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner ActivityRecord r = ActivityRecord.forToken((IBinder) msg.obj); 3668bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner if (r != null) { 3669bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner handleLaunchTaskBehindCompleteLocked(r); 3670bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 3671bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 3672bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } break; 3673ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3674ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3675ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3676ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3677b081a59a0fdec88dd9b0f68b45c2f625f751d625Ying Wang class ActivityContainer extends android.app.IActivityContainer.Stub { 36787f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner final static int FORCE_NEW_TASK_FLAGS = Intent.FLAG_ACTIVITY_NEW_TASK | 3679e6d80f4ce433e16dc72ea3291801169eb507a695Craig Mautner Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION; 36804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int mStackId; 3681f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner IActivityContainerCallback mCallback = null; 36824a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack mStack; 3683f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityRecord mParentActivity = null; 3684f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner String mIdString; 3685ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3686e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner boolean mVisible = true; 3687e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner 36884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Display this ActivityStack is currently on. Null if not attached to a Display. */ 3689e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay mActivityDisplay; 36904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3691f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final static int CONTAINER_STATE_HAS_SURFACE = 0; 3692f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final static int CONTAINER_STATE_NO_SURFACE = 1; 3693f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final static int CONTAINER_STATE_FINISHING = 2; 3694f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner int mContainerState = CONTAINER_STATE_HAS_SURFACE; 3695f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3696f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer(int stackId) { 36974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 36984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mStackId = stackId; 36994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mStack = new ActivityStack(this); 3700f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mIdString = "ActivtyContainer{" + mStackId + "}"; 370134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "Creating " + this); 37024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3703ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 3704ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3705e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner void attachToDisplayLocked(ActivityDisplay activityDisplay) { 370634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "attachToDisplayLocked: " + this 370734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner + " to display=" + activityDisplay); 3708e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay = activityDisplay; 3709e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mDisplayId = activityDisplay.mDisplayId; 3710e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mStacks = activityDisplay.mStacks; 3711e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner 3712e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner activityDisplay.attachActivities(mStack); 3713df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mWindowManager.attachStack(mStackId, activityDisplay.mDisplayId); 37144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 37164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3717ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown public void attachToDisplay(int displayId) { 37184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 3719e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 3720e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay == null) { 37214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return; 37224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3723e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner attachToDisplayLocked(activityDisplay); 37244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 37274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3728ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown public int getDisplayId() { 3729d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3730d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (mActivityDisplay != null) { 3731d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner return mActivityDisplay.mDisplayId; 3732d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3733e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 3734e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return -1; 37354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3737ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown @Override 3738ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown public boolean injectEvent(InputEvent event) { 3739ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown final long origId = Binder.clearCallingIdentity(); 3740ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown try { 3741d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3742d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (mActivityDisplay != null) { 3743d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner return mInputManagerInternal.injectInputEvent(event, 3744d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mActivityDisplay.mDisplayId, 3745d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); 3746d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3747ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } 3748ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown return false; 3749ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } finally { 3750ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown Binder.restoreCallingIdentity(origId); 3751ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } 3752ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } 3753ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown 3754f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 3755f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public void release() { 3756d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3757d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (mContainerState == CONTAINER_STATE_FINISHING) { 3758d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner return; 3759d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3760d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mContainerState = CONTAINER_STATE_FINISHING; 3761d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner 3762d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner final Message msg = 3763d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mHandler.obtainMessage(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this); 3764ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner mHandler.sendMessageDelayed(msg, 2000); 3765d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner 3766d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner long origId = Binder.clearCallingIdentity(); 3767d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner try { 3768ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner mStack.finishAllActivitiesLocked(false); 37697f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner removePendingActivityLaunchesLocked(mStack); 3770d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } finally { 3771d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Binder.restoreCallingIdentity(origId); 3772d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3773d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3774f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3775f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 37766025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner protected void detachLocked() { 377734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display=" 377834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner + mActivityDisplay + " Callers=" + Debug.getCallers(2)); 3779e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mActivityDisplay != null) { 3780e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay.detachActivitiesLocked(mStack); 3781e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay = null; 3782e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mDisplayId = -1; 3783e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mStacks = null; 3784df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mWindowManager.detachStack(mStackId); 37854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 37884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3789e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner public final int startActivity(Intent intent) { 3790df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mService.enforceNotIsolatedCaller("ActivityContainer.startActivity"); 3791e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner int userId = mService.handleIncomingUser(Binder.getCallingPid(), 3792409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn Binder.getCallingUid(), mCurrentUser, false, 3793409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null); 3794e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner // TODO: Switch to user app stacks here. 37957f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner intent.addFlags(FORCE_NEW_TASK_FLAGS); 3796e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner String mimeType = intent.getType(); 3797e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mimeType == null && intent.getData() != null 3798e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner && "content".equals(intent.getData().getScheme())) { 3799e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mimeType = mService.getProviderMimeType(intent.getData(), userId); 3800e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 38011b012d302b56b4adf950035136d1d191a1936d5aJeff Hao return startActivityMayWait(null, -1, null, intent, mimeType, null, null, null, null, 0, 38021b012d302b56b4adf950035136d1d191a1936d5aJeff Hao 0, null, null, null, null, userId, this, null); 38034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 38044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 38054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3806df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner public final int startActivityIntentSender(IIntentSender intentSender) { 3807df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender"); 3808df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 3809df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (!(intentSender instanceof PendingIntentRecord)) { 3810df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner throw new IllegalArgumentException("Bad PendingIntent object"); 3811df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 3812df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 3813df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner return ((PendingIntentRecord)intentSender).sendInner(0, null, null, null, null, null, 38147f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner null, 0, FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this); 3815df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 3816df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 3817247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner private void checkEmbeddedAllowedInner(Intent intent, String resolvedType) { 3818247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner int userId = mService.handleIncomingUser(Binder.getCallingPid(), 3819409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn Binder.getCallingUid(), mCurrentUser, false, 3820409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null); 3821247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner if (resolvedType == null) { 3822247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner resolvedType = intent.getType(); 3823247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner if (resolvedType == null && intent.getData() != null 3824247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner && "content".equals(intent.getData().getScheme())) { 3825247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner resolvedType = mService.getProviderMimeType(intent.getData(), userId); 3826247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3827247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 38281b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId); 382905678d5a3136a747a2e7eaccca0ad148c52a2d00Craig Mautner if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) { 3830247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner throw new SecurityException( 3831247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner "Attempt to embed activity that has not set allowEmbedded=\"true\""); 3832247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3833247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3834247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner 3835247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner /** Throw a SecurityException if allowEmbedded is not true */ 3836247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner @Override 3837247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner public final void checkEmbeddedAllowed(Intent intent) { 3838247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner checkEmbeddedAllowedInner(intent, null); 3839247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3840247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner 3841247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner /** Throw a SecurityException if allowEmbedded is not true */ 3842247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner @Override 3843247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner public final void checkEmbeddedAllowedIntentSender(IIntentSender intentSender) { 3844247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner if (!(intentSender instanceof PendingIntentRecord)) { 3845247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner throw new IllegalArgumentException("Bad PendingIntent object"); 3846247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3847247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender; 3848247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner checkEmbeddedAllowedInner(pendingIntent.key.requestIntent, 3849247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner pendingIntent.key.requestResolvedType); 3850247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3851247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner 3852df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner @Override 38534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public IBinder asBinder() { 38544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return this; 38554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 38564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 38574504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner @Override 3858f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public void setSurface(Surface surface, int width, int height, int density) { 3859df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface"); 38604504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 38614504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner 38624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStackSupervisor getOuter() { 38634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return ActivityStackSupervisor.this; 38644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 38654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3866d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner boolean isAttachedLocked() { 3867e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return mActivityDisplay != null; 38684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 38694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 38704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner void getBounds(Point outBounds) { 3871d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3872d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (mActivityDisplay != null) { 3873d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mActivityDisplay.getBounds(outBounds); 3874d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } else { 3875d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner outBounds.set(0, 0); 3876d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 38774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3878ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 387934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner 38806985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner // TODO: Make sure every change to ActivityRecord.visible results in a call to this. 3881e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner void setVisible(boolean visible) { 3882e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner if (mVisible != visible) { 3883e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner mVisible = visible; 3884e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner if (mCallback != null) { 3885e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0, 3886e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner 0 /* unused */, this).sendToTarget(); 3887e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3888e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3889e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3890e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner 38916985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner void setDrawn() { 38926985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 38936985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 38941b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner // You can always start a new task on a regular ActivityStack. 38951b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner boolean isEligibleForNewTasks() { 38961b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner return true; 38971b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner } 38981b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner 3899d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner void onTaskListEmptyLocked() { 3900d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } 3901d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner 390234b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner @Override 390334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner public String toString() { 390434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner return mIdString + (mActivityDisplay == null ? "N" : "A"); 390534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 3906ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 3907ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3908f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private class VirtualActivityContainer extends ActivityContainer { 3909f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner Surface mSurface; 39106985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner boolean mDrawn = false; 3911f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3912f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) { 3913f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner super(getNextStackId()); 3914f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mParentActivity = parent; 3915f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mCallback = callback; 3916f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mContainerState = CONTAINER_STATE_NO_SURFACE; 3917d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}"; 3918f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3919f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3920f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 3921f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public void setSurface(Surface surface, int width, int height, int density) { 3922f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner super.setSurface(surface, width, height, density); 3923f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3924f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner synchronized (mService) { 3925f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final long origId = Binder.clearCallingIdentity(); 3926f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner try { 3927f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner setSurfaceLocked(surface, width, height, density); 3928f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } finally { 3929f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner Binder.restoreCallingIdentity(origId); 3930f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3931f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3932f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3933f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3934f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private void setSurfaceLocked(Surface surface, int width, int height, int density) { 3935f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mContainerState == CONTAINER_STATE_FINISHING) { 3936f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return; 3937f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3938f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner VirtualActivityDisplay virtualActivityDisplay = 3939f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner (VirtualActivityDisplay) mActivityDisplay; 3940f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (virtualActivityDisplay == null) { 3941f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner virtualActivityDisplay = 39426985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner new VirtualActivityDisplay(width, height, density); 3943f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityDisplay = virtualActivityDisplay; 3944f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay); 3945f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner attachToDisplayLocked(virtualActivityDisplay); 3946f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3947f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3948f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mSurface != null) { 3949f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mSurface.release(); 3950f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3951f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 39526985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner mSurface = surface; 3953f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (surface != null) { 3954f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mStack.resumeTopActivityLocked(null); 3955f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } else { 3956f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mContainerState = CONTAINER_STATE_NO_SURFACE; 39576985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner ((VirtualActivityDisplay) mActivityDisplay).setSurface(null); 3958d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) { 3959a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn mStack.startPausingLocked(false, true, false, false); 3960d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner } 3961f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 39626985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 3963d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner setSurfaceIfReadyLocked(); 39646985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 3965f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display=" 3966f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner + virtualActivityDisplay); 39676985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 3968f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 39696985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner @Override 3970d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner boolean isAttachedLocked() { 3971d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner return mSurface != null && super.isAttachedLocked(); 3972d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner } 3973d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner 3974d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner @Override 39756985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner void setDrawn() { 39766985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner synchronized (mService) { 39776985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner mDrawn = true; 3978d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner setSurfaceIfReadyLocked(); 39796985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 39806985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 39816985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 39821b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner // Never start a new task on an ActivityView if it isn't explicitly specified. 39831b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner @Override 39841b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner boolean isEligibleForNewTasks() { 39851b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner return false; 39861b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner } 39871b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner 39886025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner void onTaskListEmptyLocked() { 39896025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner mHandler.removeMessages(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this); 39906025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner detachLocked(); 39916025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner deleteActivityContainer(this); 39926025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget(); 39936025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner } 39946025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner 3995d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner private void setSurfaceIfReadyLocked() { 3996d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn + 39976985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner " mContainerState=" + mContainerState + " mSurface=" + mSurface); 39986985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) { 39996985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface); 40006985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner mContainerState = CONTAINER_STATE_HAS_SURFACE; 40016985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 4002f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4003f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4004f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 40054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Exactly one of these classes per Display in the system. Capable of holding zero or more 40064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner * attached {@link ActivityStack}s */ 4007f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner class ActivityDisplay { 40084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Actual Display this object tracks. */ 400934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner int mDisplayId; 401034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner Display mDisplay; 401134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner DisplayInfo mDisplayInfo = new DisplayInfo(); 40124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 40134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** All of the stacks on this display. Order matters, topmost stack is in front of all other 40144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner * stacks, bottommost behind. Accessed directly by ActivityManager package classes */ 4015e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); 40164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 40174b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima ActivityRecord mVisibleBehindActivity; 4018ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 4019f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityDisplay() { 4020f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 40214504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner 40221a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner // After instantiation, check that mDisplay is not null before using this. The alternative 40231a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner // is for this to throw an exception if mDisplayManager.getDisplay() returns null. 4024e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay(int displayId) { 40251a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner final Display display = mDisplayManager.getDisplay(displayId); 40261a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner if (display == null) { 40271a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner return; 40281a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner } 40291a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner init(display); 40304504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 40314504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner 4032f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner void init(Display display) { 40334504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mDisplay = display; 40344504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mDisplayId = display.getDisplayId(); 40354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplay.getDisplayInfo(mDisplayInfo); 40364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 40374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 40384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner void attachActivities(ActivityStack stack) { 4039e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_STACK) Slog.v(TAG, "attachActivities: attaching " + stack + " to displayId=" 4040e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner + mDisplayId); 4041e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStacks.add(stack); 40424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 40434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 4044e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner void detachActivitiesLocked(ActivityStack stack) { 404534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.v(TAG, "detachActivitiesLocked: detaching " + stack 4046e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner + " from displayId=" + mDisplayId); 4047e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStacks.remove(stack); 40484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 40494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 40504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner void getBounds(Point bounds) { 40514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplay.getDisplayInfo(mDisplayInfo); 40524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner bounds.x = mDisplayInfo.appWidth; 40534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner bounds.y = mDisplayInfo.appHeight; 4054ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 405534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner 40564b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima void setVisibleBehindActivity(ActivityRecord r) { 40574b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima mVisibleBehindActivity = r; 4058ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 4059ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 40604b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima boolean hasVisibleBehindActivity() { 40614b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima return mVisibleBehindActivity != null; 4062ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 4063ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 406434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner @Override 406534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner public String toString() { 4066f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}"; 4067f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4068f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4069f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4070f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner class VirtualActivityDisplay extends ActivityDisplay { 4071f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner VirtualDisplay mVirtualDisplay; 4072f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 40736985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner VirtualActivityDisplay(int width, int height, int density) { 4074f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); 4075c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, null, 4076c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright VIRTUAL_DISPLAY_BASE_NAME, width, height, density, null, 4077c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | 4078c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, null, null); 4079f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4080f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner init(mVirtualDisplay.getDisplay()); 4081f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4082f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mWindowManager.handleDisplayAdded(mDisplayId); 4083f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4084f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4085f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner void setSurface(Surface surface) { 4086f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mVirtualDisplay != null) { 4087f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay.setSurface(surface); 4088f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4089f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4090f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4091f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 4092f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner void detachActivitiesLocked(ActivityStack stack) { 4093f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner super.detachActivitiesLocked(stack); 4094f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mVirtualDisplay != null) { 4095f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay.release(); 4096f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay = null; 4097f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4098f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4099f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4100f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 4101f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public String toString() { 4102f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return "VirtualActivityDisplay={" + mDisplayId + "}"; 410334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 4104ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 410558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 410658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima private boolean isLeanbackOnlyDevice() { 410758e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima boolean onLeanbackOnly = false; 410858e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima try { 410958e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima onLeanbackOnly = AppGlobals.getPackageManager().hasSystemFeature( 411058e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima PackageManager.FEATURE_LEANBACK_ONLY); 411158e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima } catch (RemoteException e) { 411258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima // noop 411358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima } 411458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 411558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima return onLeanbackOnly; 411658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima } 4117270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner} 4118