ActivityStackSupervisor.java revision 30bd3bb77b8bd1ac70723bcf7f1017fc40ea89b2
1270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner/* 2270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Copyright (C) 2013 The Android Open Source Project 3270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * 4270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License"); 5270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * you may not use this file except in compliance with the License. 6270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * You may obtain a copy of the License at 7270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * 8270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * http://www.apache.org/licenses/LICENSE-2.0 9270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * 10270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * Unless required by applicable law or agreed to in writing, software 11270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS, 12270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * See the License for the specific language governing permissions and 14270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner * limitations under the License. 15270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner */ 16270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 17270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerpackage com.android.server.am; 18270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 196170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.Manifest.permission.START_ANY_ACTIVITY; 2029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautnerimport static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; 2129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautnerimport static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME; 226170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static android.content.pm.PackageManager.PERMISSION_GRANTED; 232420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.localLOGV; 2423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_CONFIGURATION; 25e7c58b6d7d761b93e785b0a399e5b00fdb82f4ceCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_FOCUS; 260eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_PAUSE; 276170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_RESULTS; 280eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_STACK; 292420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_SWITCH; 308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_TASKS; 318849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautnerimport static com.android.server.am.ActivityManagerService.DEBUG_USER_LEAVING; 3205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautnerimport static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG; 338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport static com.android.server.am.ActivityManagerService.TAG; 3484984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE; 3584984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE; 3684984faf530e525b066e28710d0f9beb32142ec5Craig Mautnerimport static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE; 378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 382420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.Activity; 3923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityManager; 40ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.app.ActivityManager.StackInfo; 4123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.ActivityOptions; 4223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.AppGlobals; 434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainer; 444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.app.IActivityContainerCallback; 45ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.app.IActivityManager; 4623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IApplicationThread; 4723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.PendingIntent; 481b012d302b56b4adf950035136d1d191a1936d5aJeff Haoimport android.app.ProfilerInfo; 4920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautnerimport android.app.ActivityManager.RunningTaskInfo; 5023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.app.IActivityManager.WaitResult; 512420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.app.ResultInfo; 525286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport android.app.StatusBarManager; 5335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monkimport android.app.admin.IDevicePolicyManager; 5423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.ComponentName; 552219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Context; 5623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IIntentSender; 572219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.Intent; 5823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.IntentSender; 592219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.content.pm.ActivityInfo; 6023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ApplicationInfo; 6123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.PackageManager; 6223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.pm.ResolveInfo; 6323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.content.res.Configuration; 644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.graphics.Point; 654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager; 664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.hardware.display.DisplayManager.DisplayListener; 674504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.DisplayManagerGlobal; 684504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.hardware.display.VirtualDisplay; 69ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManager; 70ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.hardware.input.InputManagerInternal; 7123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.Binder; 728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.Bundle; 73b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautnerimport android.os.Debug; 74ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport android.os.Handler; 7523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.IBinder; 762219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport android.os.Looper; 772420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.os.Message; 7823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.ParcelFileDescriptor; 790eea92c67b292b005c152641a12b920fe145826cCraig Mautnerimport android.os.PowerManager; 807ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautnerimport android.os.Process; 818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.os.RemoteException; 825286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport android.os.ServiceManager; 8323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport android.os.SystemClock; 846170f73ed5464491b91685b57e116db033e98d5aCraig Mautnerimport android.os.UserHandle; 8562515beee67307d8859beec521b7baedfa54b2b5Jason Monkimport android.provider.Settings; 8662515beee67307d8859beec521b7baedfa54b2b5Jason Monkimport android.provider.Settings.SettingNotFoundException; 8791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport android.service.voice.IVoiceInteractionSession; 8889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackbornimport android.util.ArraySet; 892420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport android.util.EventLog; 908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport android.util.Slog; 914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseArray; 922219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.util.SparseIntArray; 94ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautnerimport android.view.Display; 954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerimport android.view.DisplayInfo; 96ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport android.view.InputEvent; 974504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautnerimport android.view.Surface; 9823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautnerimport com.android.internal.app.HeavyWeightSwitcherActivity; 9991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackbornimport com.android.internal.app.IVoiceInteractor; 10085d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackbornimport com.android.internal.content.ReferrerIntent; 101cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport com.android.internal.os.TransferPipe; 1025286d3ff47135976d66d67888cadca52ef2ab244justinzhangimport com.android.internal.statusbar.IStatusBarService; 103e069779dea07c77fb858a403c42020e39b3d9c60Jason Monkimport com.android.internal.widget.LockPatternUtils; 104ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brownimport com.android.server.LocalServices; 1052420ead0326bfd2587da6231be419e758dba1930Craig Mautnerimport com.android.server.am.ActivityStack.ActivityState; 106ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautnerimport com.android.server.wm.WindowManagerService; 10723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 1085286d3ff47135976d66d67888cadca52ef2ab244justinzhang 1098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.FileDescriptor; 1108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.io.IOException; 111270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautnerimport java.io.PrintWriter; 1122219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautnerimport java.util.ArrayList; 1138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautnerimport java.util.List; 114270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 1154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautnerpublic final class ActivityStackSupervisor implements DisplayListener { 116de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG = ActivityManagerService.DEBUG || false; 117de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG_ADD_REMOVE = DEBUG || false; 118de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner static final boolean DEBUG_APP = DEBUG || false; 119d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner static final boolean DEBUG_CONTAINERS = DEBUG || false; 120b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner static final boolean DEBUG_IDLE = DEBUG || false; 12189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn static final boolean DEBUG_RELEASE = DEBUG || false; 122d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner static final boolean DEBUG_SAVED_STATE = DEBUG || false; 123cc12f28e5dc6bd027971c995c7aab63dadcc0d35Winson Chung static final boolean DEBUG_SCREENSHOTS = DEBUG || false; 12430bd3bb77b8bd1ac70723bcf7f1017fc40ea89b2Craig Mautner static final boolean DEBUG_STATES = DEBUG || false; 12589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn static final boolean DEBUG_VISIBLE_BEHIND = DEBUG || false; 1262420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1272219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner public static final int HOME_STACK_ID = 0; 128270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 129f333327782e14688e1c198c1192172d51308e90bCraig Mautner /** How long we wait until giving up on the last activity telling us it is idle. */ 130f333327782e14688e1c198c1192172d51308e90bCraig Mautner static final int IDLE_TIMEOUT = 10*1000; 131f333327782e14688e1c198c1192172d51308e90bCraig Mautner 1320eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** How long we can hold the sleep wake lock before giving up. */ 1330eea92c67b292b005c152641a12b920fe145826cCraig Mautner static final int SLEEP_TIMEOUT = 5*1000; 1340eea92c67b292b005c152641a12b920fe145826cCraig Mautner 1357ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // How long we can hold the launch wake lock before giving up. 1367ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner static final int LAUNCH_TIMEOUT = 10*1000; 1377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 13805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG; 13905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1; 14005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2; 1410eea92c67b292b005c152641a12b920fe145826cCraig Mautner static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3; 1427ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4; 1434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5; 1444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6; 1454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7; 146e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8; 1475286d3ff47135976d66d67888cadca52ef2ab244justinzhang static final int LOCK_TASK_START_MSG = FIRST_SUPERVISOR_STACK_MSG + 9; 1485286d3ff47135976d66d67888cadca52ef2ab244justinzhang static final int LOCK_TASK_END_MSG = FIRST_SUPERVISOR_STACK_MSG + 10; 149b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 11; 1504c07d0246fb37e6a77be2c5cdcdf55a989b90f75Craig Mautner static final int CONTAINER_TASK_LIST_EMPTY_TIMEOUT = FIRST_SUPERVISOR_STACK_MSG + 12; 151bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_STACK_MSG + 13; 1524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 1534504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay"; 1547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 15562515beee67307d8859beec521b7baedfa54b2b5Jason Monk private static final String LOCK_TASK_TAG = "Lock-to-App"; 15662515beee67307d8859beec521b7baedfa54b2b5Jason Monk 1575286d3ff47135976d66d67888cadca52ef2ab244justinzhang /** Status Bar Service **/ 1585286d3ff47135976d66d67888cadca52ef2ab244justinzhang private IBinder mToken = new Binder(); 1595286d3ff47135976d66d67888cadca52ef2ab244justinzhang private IStatusBarService mStatusBarService; 16035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk private IDevicePolicyManager mDevicePolicyManager; 1615286d3ff47135976d66d67888cadca52ef2ab244justinzhang 1627ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // For debugging to make sure the caller when acquiring/releasing our 1637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // wake lock is the system process. 1647ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner static final boolean VALIDATE_WAKE_LOCK_CALLER = false; 165f333327782e14688e1c198c1192172d51308e90bCraig Mautner 166270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner final ActivityManagerService mService; 167270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 168ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStackSupervisorHandler mHandler; 169ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 170ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner /** Short cut */ 171ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner WindowManagerService mWindowManager; 1724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner DisplayManager mDisplayManager; 173ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 1748d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** Identifier counter for all ActivityStacks */ 175d5d5d0f4b8c75c9ed4fea320b4f31740b88dd37eCraig Mautner private int mLastStackId = HOME_STACK_ID; 1768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** Task identifier that activities are currently being started in. Incremented each time a 1788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * new task is created. */ 1798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner private int mCurTaskId = 0; 1808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1812420ead0326bfd2587da6231be419e758dba1930Craig Mautner /** The current user */ 1822420ead0326bfd2587da6231be419e758dba1930Craig Mautner private int mCurrentUser; 1832420ead0326bfd2587da6231be419e758dba1930Craig Mautner 184e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner /** The stack containing the launcher app. Assumed to always be attached to 185e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner * Display.DEFAULT_DISPLAY. */ 1862219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner private ActivityStack mHomeStack; 18720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 188e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner /** The stack currently receiving input or launching the next activity. */ 18929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner private ActivityStack mFocusedStack; 1908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 1914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** If this is the same as mFocusedStack then the activity on the top of the focused stack has 1924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner * been resumed. If stacks are changing position this will hold the old stack until the new 193e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner * stack becomes resumed after which it will be set to mFocusedStack. */ 1944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner private ActivityStack mLastFocusedStack; 195de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 196de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner /** List of activities that are waiting for a new activity to become visible before completing 197de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner * whatever operation they are supposed to do. */ 198de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<ActivityRecord>(); 199de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 200ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner /** List of processes waiting to find out about the next visible activity. */ 201ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible = 202ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner new ArrayList<IActivityManager.WaitResult>(); 203ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 204ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner /** List of processes waiting to find out about the next launched activity. */ 205ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched = 206ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner new ArrayList<IActivityManager.WaitResult>(); 207ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 208de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner /** List of activities that are ready to be stopped, but waiting for the next activity to 209de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner * settle down before doing so. */ 210de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<ActivityRecord>(); 211de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 212f333327782e14688e1c198c1192172d51308e90bCraig Mautner /** List of activities that are ready to be finished, but waiting for the previous activity to 213f333327782e14688e1c198c1192172d51308e90bCraig Mautner * settle down before doing so. It contains ActivityRecord objects. */ 214f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<ActivityRecord>(); 215f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2160eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** List of activities that are in the process of going to sleep. */ 2170eea92c67b292b005c152641a12b920fe145826cCraig Mautner final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<ActivityRecord>(); 2180eea92c67b292b005c152641a12b920fe145826cCraig Mautner 219f333327782e14688e1c198c1192172d51308e90bCraig Mautner /** Used on user changes */ 220f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ArrayList<UserStartedState> mStartingUsers = new ArrayList<UserStartedState>(); 221f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2221a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani /** Used to queue up any background users being started */ 2231a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani final ArrayList<UserStartedState> mStartingBackgroundUsers = new ArrayList<UserStartedState>(); 2241a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani 225de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity 226de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner * is being brought in front of us. */ 227de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean mUserLeaving = false; 228de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 2290eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** Set when we have taken too long waiting to go to sleep. */ 2300eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean mSleepTimeout = false; 2310eea92c67b292b005c152641a12b920fe145826cCraig Mautner 23258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima /** Indicates if we are running on a Leanback-only (TV) device. Only initialized after 23358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima * setWindowManager is called. **/ 23458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima private boolean mLeanbackOnlyDevice; 23558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 2360eea92c67b292b005c152641a12b920fe145826cCraig Mautner /** 2377ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * We don't want to allow the device to go to sleep while in the process 2387ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * of launching an activity. This is primarily to allow alarm intent 2397ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * receivers to launch an activity and get that to run before the device 2407ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner * goes back to sleep. 2417ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner */ 2422c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown PowerManager.WakeLock mLaunchingActivity; 2437ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 2447ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner /** 2450eea92c67b292b005c152641a12b920fe145826cCraig Mautner * Set when the system is going to sleep, until we have 2460eea92c67b292b005c152641a12b920fe145826cCraig Mautner * successfully paused the current activity and released our wake lock. 2470eea92c67b292b005c152641a12b920fe145826cCraig Mautner * At that point the system is allowed to actually sleep. 2480eea92c67b292b005c152641a12b920fe145826cCraig Mautner */ 2492c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown PowerManager.WakeLock mGoingToSleep; 2500eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2514f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner /** Stack id of the front stack when user switched, indexed by userId. */ 2524f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner SparseIntArray mUserStackInFront = new SparseIntArray(2); 25393529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner 2544504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner // TODO: Add listener for removal of references. 2554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */ 256d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<ActivityContainer>(); 2574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 2584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Mapping from displayId to display current state */ 259f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private final SparseArray<ActivityDisplay> mActivityDisplays = 260f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner new SparseArray<ActivityDisplay>(); 2614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 262ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown InputManagerInternal mInputManagerInternal; 263ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown 264aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner /** If non-null then the task specified remains in front and no other tasks may be started 265aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner * until the task exits or #stopLockTaskMode() is called. */ 266d7b8621bde44857ebb07130693a00f5f777887d4Jason Monk TaskRecord mLockTaskModeTask; 267a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk /** Whether lock task has been entered by an authorized app and cannot 268a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk * be exited. */ 269a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk private boolean mLockTaskIsLocked; 27062515beee67307d8859beec521b7baedfa54b2b5Jason Monk /** 27162515beee67307d8859beec521b7baedfa54b2b5Jason Monk * Notifies the user when entering/exiting lock-task. 27262515beee67307d8859beec521b7baedfa54b2b5Jason Monk */ 27362515beee67307d8859beec521b7baedfa54b2b5Jason Monk private LockTaskNotify mLockTaskNotify; 274aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 275ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ArrayList<PendingActivityLaunch> mPendingActivityLaunches 276ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner = new ArrayList<PendingActivityLaunch>(); 277ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 27842d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner /** Used to keep resumeTopActivityLocked() from being entered recursively */ 27942d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner boolean inResumeTopActivity; 28042d04db459e5a510c8c815c38e17e419c3e3b404Craig Mautner 281ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner /** 282ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner * Description of a request to start a new activity, which has been held 283ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner * due to app switches being disabled. 284ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner */ 285ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner static class PendingActivityLaunch { 286ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ActivityRecord r; 287ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ActivityRecord sourceRecord; 288ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final int startFlags; 289ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ActivityStack stack; 290ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 291ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord, 292ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner int _startFlags, ActivityStack _stack) { 293ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner r = _r; 294ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner sourceRecord = _sourceRecord; 295ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner startFlags = _startFlags; 296ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner stack = _stack; 297ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 298ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 299ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 3004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public ActivityStackSupervisor(ActivityManagerService service) { 301270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner mService = service; 3022c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper()); 3032c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 3042c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 3052c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown /** 3062c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * At the time when the constructor runs, the power manager has not yet been 3072c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * initialized. So we initialize our wakelocks afterwards. 3082c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown */ 3092c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown void initPowerManagement() { 3104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE); 3110eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 3127ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity = 3137ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Launch"); 3147ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.setReferenceCounted(false); 3152219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 3162219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 3175286d3ff47135976d66d67888cadca52ef2ab244justinzhang // This function returns a IStatusBarService. The value is from ServiceManager. 3185286d3ff47135976d66d67888cadca52ef2ab244justinzhang // getService and is cached. 3195286d3ff47135976d66d67888cadca52ef2ab244justinzhang private IStatusBarService getStatusBarService() { 3205286d3ff47135976d66d67888cadca52ef2ab244justinzhang synchronized (mService) { 3215286d3ff47135976d66d67888cadca52ef2ab244justinzhang if (mStatusBarService == null) { 3225286d3ff47135976d66d67888cadca52ef2ab244justinzhang mStatusBarService = IStatusBarService.Stub.asInterface( 3235286d3ff47135976d66d67888cadca52ef2ab244justinzhang ServiceManager.checkService(Context.STATUS_BAR_SERVICE)); 3245286d3ff47135976d66d67888cadca52ef2ab244justinzhang if (mStatusBarService == null) { 3255286d3ff47135976d66d67888cadca52ef2ab244justinzhang Slog.w("StatusBarManager", "warning: no STATUS_BAR_SERVICE"); 3265286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3275286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3285286d3ff47135976d66d67888cadca52ef2ab244justinzhang return mStatusBarService; 3295286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3305286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3315286d3ff47135976d66d67888cadca52ef2ab244justinzhang 33235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk private IDevicePolicyManager getDevicePolicyManager() { 33335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk synchronized (mService) { 33435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk if (mDevicePolicyManager == null) { 33535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk mDevicePolicyManager = IDevicePolicyManager.Stub.asInterface( 33635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk ServiceManager.checkService(Context.DEVICE_POLICY_SERVICE)); 33735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk if (mDevicePolicyManager == null) { 33835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk Slog.w(TAG, "warning: no DEVICE_POLICY_SERVICE"); 33935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 34035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 34135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk return mDevicePolicyManager; 34235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 34335c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 34435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk 345ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void setWindowManager(WindowManagerService wm) { 3464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 3474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager = wm; 3484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplayManager = 3504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner (DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE); 3514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplayManager.registerDisplayListener(this, null); 3524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner Display[] displays = mDisplayManager.getDisplays(); 3544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) { 3554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int displayId = displays[displayNdx].getDisplayId(); 356e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = new ActivityDisplay(displayId); 3571a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner if (activityDisplay.mDisplay == null) { 3581a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner throw new IllegalStateException("Default Display does not exist"); 3591a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner } 360e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplays.put(displayId, activityDisplay); 3614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 363f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner createStackOnDisplay(HOME_STACK_ID, Display.DEFAULT_DISPLAY); 3644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHomeStack = mFocusedStack = mLastFocusedStack = getStack(HOME_STACK_ID); 365ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown 366ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); 36758e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 36858e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima // Initialize this here, now that we can get a valid reference to PackageManager. 36958e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima mLeanbackOnlyDevice = isLeanbackOnlyDevice(); 3704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 371270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 372270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 3738de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi void notifyActivityDrawnForKeyguard() { 3745314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner if (ActivityManagerService.DEBUG_LOCKSCREEN) mService.logLockScreen(""); 3758de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi mWindowManager.notifyActivityDrawnForKeyguard(); 376270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 377270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner 378ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack getFocusedStack() { 3794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return mFocusedStack; 38020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 38120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 382de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack getLastStack() { 3834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return mLastFocusedStack; 3842219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 3852219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 3864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // TODO: Split into two methods isFrontStack for any visible stack and isFrontmostStack for the 3874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // top of all visible stacks. 388de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean isFrontStack(ActivityStack stack) { 389df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner final ActivityRecord parent = stack.mActivityContainer.mParentActivity; 390df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (parent != null) { 391df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner stack = parent.task.stack; 392df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 393e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = stack.mStacks; 3944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stacks != null && !stacks.isEmpty()) { 3954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return stack == stacks.get(stacks.size() - 1); 3964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 39820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 39920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 400de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner void moveHomeStack(boolean toFront) { 401e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mHomeStack.mStacks; 4024a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int topNdx = stacks.size() - 1; 4034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (topNdx <= 0) { 4044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return; 4054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 4064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStack topStack = stacks.get(topNdx); 4074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final boolean homeInFront = topStack == mHomeStack; 4084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (homeInFront != toFront) { 4094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mLastFocusedStack = topStack; 4104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.remove(mHomeStack); 4114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.add(toFront ? topNdx : 0, mHomeStack); 4124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mFocusedStack = stacks.get(topNdx); 4134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "moveHomeTask: topStack old=" + topStack + " new=" 4144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner + mFocusedStack); 415de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 416de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 417de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 41884984faf530e525b066e28710d0f9beb32142ec5Craig Mautner void moveHomeStackTaskToTop(int homeStackTaskType) { 41984984faf530e525b066e28710d0f9beb32142ec5Craig Mautner if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { 42084984faf530e525b066e28710d0f9beb32142ec5Craig Mautner mWindowManager.showRecentApps(); 42184984faf530e525b066e28710d0f9beb32142ec5Craig Mautner return; 42284984faf530e525b066e28710d0f9beb32142ec5Craig Mautner } 42369ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner moveHomeStack(true); 42484984faf530e525b066e28710d0f9beb32142ec5Craig Mautner mHomeStack.moveHomeStackTaskToTop(homeStackTaskType); 4258e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner } 4268e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner 42784984faf530e525b066e28710d0f9beb32142ec5Craig Mautner boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev) { 4287622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn if (!mService.mBooting && !mService.mBooted) { 4297622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn // Not ready yet! 4307622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn return false; 4317622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn } 4327622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn 43384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { 43484984faf530e525b066e28710d0f9beb32142ec5Craig Mautner mWindowManager.showRecentApps(); 43584984faf530e525b066e28710d0f9beb32142ec5Craig Mautner return false; 43684984faf530e525b066e28710d0f9beb32142ec5Craig Mautner } 43784984faf530e525b066e28710d0f9beb32142ec5Craig Mautner moveHomeStackTaskToTop(homeStackTaskType); 43869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner if (prev != null) { 43984984faf530e525b066e28710d0f9beb32142ec5Craig Mautner prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE); 44069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 44184984faf530e525b066e28710d0f9beb32142ec5Craig Mautner 442a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner ActivityRecord r = mHomeStack.topRunningActivityLocked(null); 44384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner // if (r != null && (r.isHomeActivity() || r.isRecentsActivity())) { 444719e621186adc1ba5a365bddea01cbe73bb26b02Craig Mautner if (r != null && r.isHomeActivity()) { 445a8a90e0f528c5c3f595383953d8ffd64e5c6f758Craig Mautner mService.setFocusedActivityLocked(r); 44605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return resumeTopActivitiesLocked(mHomeStack, prev, null); 44769ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 44869ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner return mService.startHomeActivityLocked(mCurrentUser); 44969ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner } 45069ada558f5f3b4cd1d7930e53902dba19c023cfdCraig Mautner 4518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord anyTaskForIdLocked(int id) { 452e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner int numDisplays = mActivityDisplays.size(); 4534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 454e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 4554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 4564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStack stack = stacks.get(stackNdx); 4574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner TaskRecord task = stack.taskForIdLocked(id); 4584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (task != null) { 4594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return task; 4604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 4618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 4648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 4666170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord isInAnyStackLocked(IBinder token) { 467e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner int numDisplays = mActivityDisplays.size(); 4684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 469e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 4704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 4714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stacks.get(stackNdx).isInStackLocked(token); 4724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null) { 4734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return r; 4744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 4756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 4766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 4776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return null; 4786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 4796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 480ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner void setNextTaskId(int taskId) { 481ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner if (taskId > mCurTaskId) { 482ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner mCurTaskId = taskId; 483ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 484ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 485ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 4868d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner int getNextTaskId() { 4878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner do { 4888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId++; 4898d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (mCurTaskId <= 0) { 4908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner mCurTaskId = 1; 4918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } while (anyTaskForIdLocked(mCurTaskId) != null); 4938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return mCurTaskId; 4948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 4958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 496de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord resumedAppLocked() { 497ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack stack = getFocusedStack(); 498ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (stack == null) { 499ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return null; 500ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 501de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord resumedActivity = stack.mResumedActivity; 502de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (resumedActivity == null || resumedActivity.app == null) { 503de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resumedActivity = stack.mPausingActivity; 504de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (resumedActivity == null || resumedActivity.app == null) { 505de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner resumedActivity = stack.topRunningActivityLocked(null); 506de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 507de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 508de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return resumedActivity; 509de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 510de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 511ff072725e39b8c6928d6ca2d7e263d7d081a2288Dianne Hackborn boolean attachApplicationLocked(ProcessRecord app) throws RemoteException { 51220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner final String processName = app.processName; 5134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner boolean didSomething = false; 514e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 515e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 5164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5174a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 5184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (!isFrontStack(stack)) { 5194a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner continue; 5204a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 5214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityRecord hr = stack.topRunningActivityLocked(null); 5224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (hr != null) { 5234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (hr.app == null && app.uid == hr.info.applicationInfo.uid 5244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner && processName.equals(hr.processName)) { 5254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner try { 5262c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount if (realStartActivityLocked(hr, app, true, true)) { 5274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner didSomething = true; 5284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 529ff072725e39b8c6928d6ca2d7e263d7d081a2288Dianne Hackborn } catch (RemoteException e) { 5304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner Slog.w(TAG, "Exception in new application when starting activity " 5314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner + hr.intent.getComponent().flattenToShortString(), e); 5324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner throw e; 53320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 53420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 53520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 53620e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 53720e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 538b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (!didSomething) { 539b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner ensureActivitiesVisibleLocked(null, 0); 540b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner } 54120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return didSomething; 54220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 54320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 54420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner boolean allResumedActivitiesIdle() { 545e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 546e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 5474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 54934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (!isFrontStack(stack) || stack.numActivities() == 0) { 5504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner continue; 5514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 5524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord resumedActivity = stack.mResumedActivity; 5534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (resumedActivity == null || !resumedActivity.idle) { 55434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STATES) Slog.d(TAG, "allResumedActivitiesIdle: stack=" 55534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner + stack.mStackId + " " + resumedActivity + " not idle"); 5564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 5574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 55820e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 55920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 56020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner return true; 56120e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 56220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 563de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allResumedActivitiesComplete() { 564e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 565e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 5664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 5684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 5694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stack.mResumedActivity; 5704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null && r.state != ActivityState.RESUMED) { 5714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 5724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 573de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 574de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 575de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 576de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // TODO: Not sure if this should check if all Paused are complete too. 5774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STACK) Slog.d(TAG, 5784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner "allResumedActivitiesComplete: mLastFocusedStack changing from=" + 5794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mLastFocusedStack + " to=" + mFocusedStack); 5804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mLastFocusedStack = mFocusedStack; 581de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return true; 582de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 583de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 584de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allResumedActivitiesVisible() { 585e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 586e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 5874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 5884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 5894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stack.mResumedActivity; 5904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null && (!r.nowVisible || r.waitingVisible)) { 5914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 5924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 593de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 594de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 595de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return true; 596de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 597de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 5982acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner /** 5992acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner * Pause all activities in either all of the stacks or just the back stacks. 6002acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving(). 6012acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner * @return true if any activity was paused as a result of this call. 6022acc389d6197f8b099e7d72ea944ccbf14065761Craig Mautner */ 603a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn boolean pauseBackStacks(boolean userLeaving, boolean resuming, boolean dontWait) { 604cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner boolean someActivityPaused = false; 605e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 606e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 6074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 6084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 6094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (!isFrontStack(stack) && stack.mResumedActivity != null) { 6104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STATES) Slog.d(TAG, "pauseBackStacks: stack=" + stack + 6114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mResumedActivity=" + stack.mResumedActivity); 612a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn someActivityPaused |= stack.startPausingLocked(userLeaving, false, resuming, 613a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn dontWait); 6144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 615cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 616cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 617cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner return someActivityPaused; 618cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 619cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner 620de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner boolean allPausedActivitiesComplete() { 621ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner boolean pausing = true; 622e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 623e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 6244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 6254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 6264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = stack.mPausingActivity; 6274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null && r.state != ActivityState.PAUSED 6284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner && r.state != ActivityState.STOPPED 6294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner && r.state != ActivityState.STOPPING) { 6304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (DEBUG_STATES) { 6314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner Slog.d(TAG, "allPausedActivitiesComplete: r=" + r + " state=" + r.state); 6324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pausing = false; 6334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } else { 6344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return false; 6354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 636ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 637de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 638de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 639ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return pausing; 640de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 641de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 642a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping, 643a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn boolean resuming, boolean dontWait) { 6448a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock // TODO: Put all stacks in supervisor and iterate through them instead. 645df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 646df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 647df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 648df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner final ActivityStack stack = stacks.get(stackNdx); 649df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (stack.mResumedActivity != null && 650df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner stack.mActivityContainer.mParentActivity == parent) { 651a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn stack.startPausingLocked(userLeaving, uiSleeping, resuming, dontWait); 652df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 653df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 654df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 655df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 656df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 657ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void reportActivityVisibleLocked(ActivityRecord r) { 6586cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn sendWaitingVisibleReportLocked(r); 6596cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 6606cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn 6616cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn void sendWaitingVisibleReportLocked(ActivityRecord r) { 6626cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn boolean changed = false; 663858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) { 664ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner WaitResult w = mWaitingActivityVisible.get(i); 6656cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (w.who == null) { 6666cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn changed = true; 6676cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.timeout = false; 6686cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (r != null) { 6696cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 6706cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 6716cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 6726cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.thisTime = w.totalTime; 673ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 674ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 6756cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (changed) { 6766cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn mService.notifyAll(); 6776cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 678ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 679ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 680ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 681ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner long thisTime, long totalTime) { 6826cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn boolean changed = false; 683ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) { 684c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner WaitResult w = mWaitingActivityLaunched.remove(i); 6856cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (w.who == null) { 6866cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn changed = true; 6876cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.timeout = timeout; 6886cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (r != null) { 6896cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.who = new ComponentName(r.info.packageName, r.info.name); 6906cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 6916cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.thisTime = thisTime; 6926cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn w.totalTime = totalTime; 693ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 694ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 6956cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (changed) { 6966cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn mService.notifyAll(); 6976cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn } 698ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 699ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 70029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner ActivityRecord topRunningActivityLocked() { 7011602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner final ActivityStack focusedStack = getFocusedStack(); 7021602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner ActivityRecord r = focusedStack.topRunningActivityLocked(null); 7031602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner if (r != null) { 7041602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner return r; 70529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 7061602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner 7074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // Return to the home stack. 708e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mHomeStack.mStacks; 7094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 7104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 711ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (stack != focusedStack && isFrontStack(stack)) { 71229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner r = stack.topRunningActivityLocked(null); 71329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r != null) { 71429219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return r; 71529219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 71629219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 71729219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 71829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return null; 71929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 72029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner 72109233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn void getTasksLocked(int maxNum, List<RunningTaskInfo> list, int callingUid, boolean allowed) { 722c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner // Gather all of the running tasks for each stack into runningTaskLists. 7234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<ArrayList<RunningTaskInfo>> runningTaskLists = 7244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner new ArrayList<ArrayList<RunningTaskInfo>>(); 725e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final int numDisplays = mActivityDisplays.size(); 7264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 727e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 7284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 7294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 7304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<RunningTaskInfo>(); 7314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner runningTaskLists.add(stackTaskList); 73209233289624a85093b1d99e4a6a149bf09059d8dDianne Hackborn stack.getTasksLocked(stackTaskList, callingUid, allowed); 73320e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 73420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 735c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner 736c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner // The lists are already sorted from most recent to oldest. Just pull the most recent off 737c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner // each list and add it to list. Stop when all lists are empty or maxNum reached. 738c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner while (maxNum > 0) { 739c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner long mostRecentActiveTime = Long.MIN_VALUE; 740c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner ArrayList<RunningTaskInfo> selectedStackList = null; 7414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numTaskLists = runningTaskLists.size(); 7424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numTaskLists; ++stackNdx) { 7434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists.get(stackNdx); 744c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner if (!stackTaskList.isEmpty()) { 745c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner final long lastActiveTime = stackTaskList.get(0).lastActiveTime; 746c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner if (lastActiveTime > mostRecentActiveTime) { 747c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner mostRecentActiveTime = lastActiveTime; 748c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner selectedStackList = stackTaskList; 749c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 750c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 751c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 752c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner if (selectedStackList != null) { 753c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner list.add(selectedStackList.remove(0)); 754c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner --maxNum; 755c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } else { 756c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner break; 757c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 758c0fd8052349976fe0e9422f702e30e5030a0addeCraig Mautner } 75920e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 76020e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 76123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags, 7621b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ProfilerInfo profilerInfo, int userId) { 76323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 76423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo; 76523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 76623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ResolveInfo rInfo = 76723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner AppGlobals.getPackageManager().resolveIntent( 76823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent, resolvedType, 76923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner PackageManager.MATCH_DEFAULT_ONLY 77023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | ActivityManagerService.STOCK_PM_FLAGS, userId); 77123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = rInfo != null ? rInfo.activityInfo : null; 77223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (RemoteException e) { 77323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = null; 77423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 77523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 77623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null) { 77723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Store the found target back into the intent, because now that 77823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // we have it we never want to do this again. For example, if the 77923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // user navigates back to this point in the history, we should 78023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // always restart the exact same activity. 78123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent.setComponent(new ComponentName( 78223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo.applicationInfo.packageName, aInfo.name)); 78323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 78423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't debug things in the system process 78523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) { 78623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 78723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setDebugApp(aInfo.processName, true, false); 78823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 78923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 79023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 79123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) { 79223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 79323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName); 79423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 79523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 79623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 7971b012d302b56b4adf950035136d1d191a1936d5aJeff Hao if (profilerInfo != null) { 79823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (!aInfo.processName.equals("system")) { 7991b012d302b56b4adf950035136d1d191a1936d5aJeff Hao mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo); 80023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 80123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 80223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 80323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return aInfo; 80423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 80523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 8062219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner void startHomeActivity(Intent intent, ActivityInfo aInfo) { 80784984faf530e525b066e28710d0f9beb32142ec5Craig Mautner moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE); 80895465200b0f652c48d40ca1028238763dd647900Dianne Hackborn startActivityLocked(null, intent, null, aInfo, null, null, null, null, 0, 0, 0, null, 80995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn 0, 0, 0, null, false, null, null, null); 8108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 8118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 81223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final int startActivityMayWait(IApplicationThread caller, int callingUid, 81391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn String callingPackage, Intent intent, String resolvedType, 81491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 8151b012d302b56b4adf950035136d1d191a1936d5aJeff Hao IBinder resultTo, String resultWho, int requestCode, int startFlags, 8161b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ProfilerInfo profilerInfo, WaitResult outResult, Configuration config, 81789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Bundle options, int userId, IActivityContainer iContainer, TaskRecord inTask) { 81823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Refuse possible leaked file descriptors 81923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent != null && intent.hasFileDescriptors()) { 82023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("File descriptors passed in Intent"); 82123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 82223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner boolean componentSpecified = intent.getComponent() != null; 82323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 82423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't modify the client's object! 82523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = new Intent(intent); 82623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 82723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 82823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityInfo aInfo = resolveActivity(intent, resolvedType, startFlags, 8291b012d302b56b4adf950035136d1d191a1936d5aJeff Hao profilerInfo, userId); 83023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 831e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityContainer container = (ActivityContainer)iContainer; 83223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner synchronized (mService) { 83395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn final int realCallingPid = Binder.getCallingPid(); 83495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn final int realCallingUid = Binder.getCallingUid(); 83523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int callingPid; 83623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callingUid >= 0) { 83723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = -1; 83823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (caller == null) { 83995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn callingPid = realCallingPid; 84095465200b0f652c48d40ca1028238763dd647900Dianne Hackborn callingUid = realCallingUid; 84123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 84223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = callingUid = -1; 84323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 84423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 845e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityStack stack; 846e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (container == null || container.mStack.isOnHomeDisplay()) { 847e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner stack = getFocusedStack(); 848e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } else { 849e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner stack = container.mStack; 850e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 851de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stack.mConfigWillChange = config != null 85223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner && mService.mConfiguration.diff(config) != 0; 85323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, 854de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner "Starting activity when config will change = " + stack.mConfigWillChange); 85523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 85623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final long origId = Binder.clearCallingIdentity(); 85723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 85823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null && 85923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (aInfo.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 86023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // This may be a heavy-weight process! Check to see if we already 86123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // have another, different heavy-weight process running. 86223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 86323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (mService.mHeavyWeightProcess != null && 86423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 86523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 86695465200b0f652c48d40ca1028238763dd647900Dianne Hackborn int appCallingUid = callingUid; 86723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (caller != null) { 86823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 86923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callerApp != null) { 87095465200b0f652c48d40ca1028238763dd647900Dianne Hackborn appCallingUid = callerApp.info.uid; 87123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 87223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Slog.w(TAG, "Unable to find app for caller " + caller 87376ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner + " (pid=" + callingPid + ") when starting: " 87423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner + intent.toString()); 87523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityOptions.abort(options); 87623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return ActivityManager.START_PERMISSION_DENIED; 87723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 87823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 87923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 88023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner IIntentSender target = mService.getIntentSenderLocked( 88123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityManager.INTENT_SENDER_ACTIVITY, "android", 88295465200b0f652c48d40ca1028238763dd647900Dianne Hackborn appCallingUid, userId, null, null, 0, new Intent[] { intent }, 88323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 88423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | PendingIntent.FLAG_ONE_SHOT, null); 88523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 88623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent newIntent = new Intent(); 88723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (requestCode >= 0) { 88823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Caller is requesting a result. 88923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 89023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 89123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 89223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner new IntentSender(target)); 89323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (mService.mHeavyWeightProcess.activities.size() > 0) { 89423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 89523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 89623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner hist.packageName); 89723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 89823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner hist.task.taskId); 89923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 90023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 90123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo.packageName); 90223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.setFlags(intent.getFlags()); 90323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner newIntent.setClassName("android", 90423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner HeavyWeightSwitcherActivity.class.getName()); 90523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = newIntent; 90623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner resolvedType = null; 90723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner caller = null; 90823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 90923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 91023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner componentSpecified = true; 91123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 91223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner ResolveInfo rInfo = 91323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner AppGlobals.getPackageManager().resolveIntent( 91423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent, null, 91523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner PackageManager.MATCH_DEFAULT_ONLY 91623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner | ActivityManagerService.STOCK_PM_FLAGS, userId); 91723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = rInfo != null ? rInfo.activityInfo : null; 91823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = mService.getActivityInfoForUser(aInfo, userId); 91923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (RemoteException e) { 92023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = null; 92123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 92223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 92323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 92423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 92523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 92691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn int res = startActivityLocked(caller, intent, resolvedType, aInfo, 92791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn voiceSession, voiceInteractor, resultTo, resultWho, 92895465200b0f652c48d40ca1028238763dd647900Dianne Hackborn requestCode, callingPid, callingUid, callingPackage, 92995465200b0f652c48d40ca1028238763dd647900Dianne Hackborn realCallingPid, realCallingUid, startFlags, options, 93089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn componentSpecified, null, container, inTask); 93123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 93285c11a8831ba9572813f122674b3680ae4d14010Craig Mautner Binder.restoreCallingIdentity(origId); 93385c11a8831ba9572813f122674b3680ae4d14010Craig Mautner 934de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stack.mConfigWillChange) { 93523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // If the caller also wants to switch to a new configuration, 93623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // do so now. This allows a clean switch, as we are waiting 93723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // for the current activity to pause (so we will not destroy 93823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // it), and have not yet started the next activity. 93923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 94023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "updateConfiguration()"); 941de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stack.mConfigWillChange = false; 94223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (DEBUG_CONFIGURATION) Slog.v(TAG, 94323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "Updating to new configuration after starting activity."); 94423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.updateConfigurationLocked(config, null, false, false); 94523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 94623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 94723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (outResult != null) { 94823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.result = res; 94923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (res == ActivityManager.START_SUCCESS) { 950ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWaitingActivityLaunched.add(outResult); 95123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner do { 95223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 95323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.wait(); 95423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (InterruptedException e) { 95523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 95623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } while (!outResult.timeout && outResult.who == null); 95723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (res == ActivityManager.START_TASK_TO_FRONT) { 958de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord r = stack.topRunningActivityLocked(null); 9596cfbb718905210d146fbe8fb18c8e124f24845ecDianne Hackborn if (r.nowVisible && r.state == ActivityState.RESUMED) { 96023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.timeout = false; 96123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.who = new ComponentName(r.info.packageName, r.info.name); 96223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.totalTime = 0; 96323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.thisTime = 0; 96423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 96523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner outResult.thisTime = SystemClock.uptimeMillis(); 966ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWaitingActivityVisible.add(outResult); 96723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner do { 96823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 96923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner mService.wait(); 97023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } catch (InterruptedException e) { 97123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 97223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } while (!outResult.timeout && outResult.who == null); 97323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 97423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 97523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 97623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 97723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return res; 97823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 97923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 98023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 98123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final int startActivities(IApplicationThread caller, int callingUid, String callingPackage, 98223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent[] intents, String[] resolvedTypes, IBinder resultTo, 98323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Bundle options, int userId) { 98423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intents == null) { 98523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new NullPointerException("intents is null"); 98623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 98723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (resolvedTypes == null) { 98823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new NullPointerException("resolvedTypes is null"); 98923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 99023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intents.length != resolvedTypes.length) { 99123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("intents are length different than resolvedTypes"); 99223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 99323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 99423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 99523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner int callingPid; 99623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (callingUid >= 0) { 99723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = -1; 99823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else if (caller == null) { 99923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = Binder.getCallingPid(); 100023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingUid = Binder.getCallingUid(); 100123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 100223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner callingPid = callingUid = -1; 100323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 100423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner final long origId = Binder.clearCallingIdentity(); 100523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner try { 100623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner synchronized (mService) { 100776ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner ActivityRecord[] outActivity = new ActivityRecord[1]; 100823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner for (int i=0; i<intents.length; i++) { 100923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Intent intent = intents[i]; 101023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent == null) { 101123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner continue; 101223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 101323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 101423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Refuse possible leaked file descriptors 101523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (intent != null && intent.hasFileDescriptors()) { 101623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException("File descriptors passed in Intent"); 101723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 101823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 101923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner boolean componentSpecified = intent.getComponent() != null; 102023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 102123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Don't modify the client's object! 102223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner intent = new Intent(intent); 102323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 102423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // Collect information about the target of the Intent. 10251b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 0, null, userId); 102623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner // TODO: New, check if this is correct 102723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner aInfo = mService.getActivityInfoForUser(aInfo, userId); 102823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 102923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (aInfo != null && 103023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner (aInfo.applicationInfo.flags & ApplicationInfo.FLAG_CANT_SAVE_STATE) 103123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner != 0) { 103223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner throw new IllegalArgumentException( 103323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner "FLAG_CANT_SAVE_STATE not supported here"); 103423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 103523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 103623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Bundle theseOptions; 103723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (options != null && i == intents.length-1) { 103823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner theseOptions = options; 103923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } else { 104023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner theseOptions = null; 104123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 10426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int res = startActivityLocked(caller, intent, resolvedTypes[i], 104395465200b0f652c48d40ca1028238763dd647900Dianne Hackborn aInfo, null, null, resultTo, null, -1, callingPid, callingUid, 104495465200b0f652c48d40ca1028238763dd647900Dianne Hackborn callingPackage, callingPid, callingUid, 104589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 0, theseOptions, componentSpecified, outActivity, null, null); 104623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner if (res < 0) { 104723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return res; 104823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 104923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 105023ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner resultTo = outActivity[0] != null ? outActivity[0].appToken : null; 105123ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 105223ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 105323ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } finally { 105423ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner Binder.restoreCallingIdentity(origId); 105523ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 105623ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 105723ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner return ActivityManager.START_SUCCESS; 105823ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner } 105923ac33bb85de7e840dd3c35c21c05ead5bc39b03Craig Mautner 10602420ead0326bfd2587da6231be419e758dba1930Craig Mautner final boolean realStartActivityLocked(ActivityRecord r, 10612c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount ProcessRecord app, boolean andResume, boolean checkConfig) 10622420ead0326bfd2587da6231be419e758dba1930Craig Mautner throws RemoteException { 10632420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10642420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.startFreezingScreenLocked(app, 0); 1065a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner if (false) Slog.d(TAG, "realStartActivity: setting app visibility true"); 1066ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.setAppVisibility(r.appToken, true); 10672420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10682420ead0326bfd2587da6231be419e758dba1930Craig Mautner // schedule launch ticks to collect information about slow apps. 10692420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.startLaunchTickingLocked(); 10702420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10712420ead0326bfd2587da6231be419e758dba1930Craig Mautner // Have the window manager re-evaluate the orientation of 10722420ead0326bfd2587da6231be419e758dba1930Craig Mautner // the screen based on the new activity order. Note that 10732420ead0326bfd2587da6231be419e758dba1930Craig Mautner // as a result of this, it can call back into the activity 10742420ead0326bfd2587da6231be419e758dba1930Craig Mautner // manager with a new orientation. We don't care about that, 10752420ead0326bfd2587da6231be419e758dba1930Craig Mautner // because the activity is not currently running so we are 10762420ead0326bfd2587da6231be419e758dba1930Craig Mautner // just restarting it anyway. 10772420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (checkConfig) { 1078ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner Configuration config = mWindowManager.updateOrientationFromAppTokens( 10792420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mConfiguration, 10802420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.mayFreezeScreenLocked(app) ? r.appToken : null); 10812420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.updateConfigurationLocked(config, r, false, false); 10822420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 10832420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10842420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.app = app; 10852420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.waitingToKill = null; 10862420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.launchCount++; 10872420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.lastLaunchTime = SystemClock.uptimeMillis(); 10882420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10892420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (localLOGV) Slog.v(TAG, "Launching: " + r); 10902420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10912420ead0326bfd2587da6231be419e758dba1930Craig Mautner int idx = app.activities.indexOf(r); 10922420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (idx < 0) { 10932420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.activities.add(r); 10942420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 1095db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn mService.updateLruProcessLocked(app, true, null); 1096db92608de9b4acccee1e3232264c9830ad300c4fDianne Hackborn mService.updateOomAdjLocked(); 10972420ead0326bfd2587da6231be419e758dba1930Craig Mautner 10982420ead0326bfd2587da6231be419e758dba1930Craig Mautner final ActivityStack stack = r.task.stack; 10992420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 11002420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.thread == null) { 11012420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw new RemoteException(); 11022420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11032420ead0326bfd2587da6231be419e758dba1930Craig Mautner List<ResultInfo> results = null; 110485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn List<ReferrerIntent> newIntents = null; 11052420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 11062420ead0326bfd2587da6231be419e758dba1930Craig Mautner results = r.results; 11072420ead0326bfd2587da6231be419e758dba1930Craig Mautner newIntents = r.newIntents; 11082420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11092420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_SWITCH) Slog.v(TAG, "Launching: " + r 11102420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " icicle=" + r.icicle 11112420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " with results=" + results + " newIntents=" + newIntents 11122420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " andResume=" + andResume); 11132420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 11142420ead0326bfd2587da6231be419e758dba1930Craig Mautner EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 11152420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.userId, System.identityHashCode(r), 11162420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.task.taskId, r.shortComponentName); 11172420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 1118ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (r.isHomeActivity() && r.isNotResolverActivity()) { 11194ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner // Home process is the root process of the task. 11204ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner mService.mHomeProcess = r.task.mActivities.get(0).app; 11212420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11222420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 11232420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.sleeping = false; 11242420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.forceNewConfig = false; 11252420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.showAskCompatModeDialogLocked(r); 11262420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 11272420ead0326bfd2587da6231be419e758dba1930Craig Mautner String profileFile = null; 11282420ead0326bfd2587da6231be419e758dba1930Craig Mautner ParcelFileDescriptor profileFd = null; 11292420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 11302420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mProfileProc == null || mService.mProfileProc == app) { 11312420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mProfileProc = app; 11322420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFile = mService.mProfileFile; 11332420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = mService.mProfileFd; 11342420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11352420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11362420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.hasShownUi = true; 11372420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.pendingUiClean = true; 11382420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 11392420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 11402420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = profileFd.dup(); 11412420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException e) { 11422420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (profileFd != null) { 11432420ead0326bfd2587da6231be419e758dba1930Craig Mautner try { 11442420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd.close(); 11452420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (IOException o) { 11462420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11472420ead0326bfd2587da6231be419e758dba1930Craig Mautner profileFd = null; 11482420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11492420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11502420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 1151cfbe9be5b3b701d95fb24fa0f7c8d9be43eec776Adam Powell 11521b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ProfilerInfo profilerInfo = profileFile != null 11531b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ? new ProfilerInfo(profileFile, profileFd, mService.mSamplingInterval, 11541b012d302b56b4adf950035136d1d191a1936d5aJeff Hao mService.mAutoStopProfiler) : null; 1155a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn app.forceProcessStateUpTo(ActivityManager.PROCESS_STATE_TOP); 11562420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 11571b012d302b56b4adf950035136d1d191a1936d5aJeff Hao System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration), 115885d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn r.compat, r.launchedFromPackage, r.task.voiceInteractor, app.repProcState, 115985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn r.icicle, r.persistentState, results, newIntents, !andResume, 116085d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn mService.isNextTransitionForward(), profilerInfo); 11612420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11622420ead0326bfd2587da6231be419e758dba1930Craig Mautner if ((app.info.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 11632420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This may be a heavy-weight process! Note that the package 11642420ead0326bfd2587da6231be419e758dba1930Craig Mautner // manager will ensure that only activity can run in the main 11652420ead0326bfd2587da6231be419e758dba1930Craig Mautner // process of the .apk, which is the only thing that will be 11662420ead0326bfd2587da6231be419e758dba1930Craig Mautner // considered heavy-weight. 11672420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (app.processName.equals(app.info.packageName)) { 11682420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (mService.mHeavyWeightProcess != null 11692420ead0326bfd2587da6231be419e758dba1930Craig Mautner && mService.mHeavyWeightProcess != app) { 11702420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Starting new heavy weight process " + app 11712420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " when already running " 11722420ead0326bfd2587da6231be419e758dba1930Craig Mautner + mService.mHeavyWeightProcess); 11732420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11742420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHeavyWeightProcess = app; 11752420ead0326bfd2587da6231be419e758dba1930Craig Mautner Message msg = mService.mHandler.obtainMessage( 11762420ead0326bfd2587da6231be419e758dba1930Craig Mautner ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 11772420ead0326bfd2587da6231be419e758dba1930Craig Mautner msg.obj = r; 11782420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.mHandler.sendMessage(msg); 11792420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11802420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11812420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11822420ead0326bfd2587da6231be419e758dba1930Craig Mautner } catch (RemoteException e) { 11832420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (r.launchFailed) { 11842420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the second time we failed -- finish activity 11852420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and give up. 11862420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.e(TAG, "Second failure launching " 11872420ead0326bfd2587da6231be419e758dba1930Craig Mautner + r.intent.getComponent().flattenToShortString() 11882420ead0326bfd2587da6231be419e758dba1930Craig Mautner + ", giving up", e); 11894a8dddbf18fedb33bb2c725db489669a141e1d73Craig Mautner mService.appDiedLocked(app); 11902420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 11912420ead0326bfd2587da6231be419e758dba1930Craig Mautner "2nd-crash", false); 11922420ead0326bfd2587da6231be419e758dba1930Craig Mautner return false; 11932420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 11942420ead0326bfd2587da6231be419e758dba1930Craig Mautner 11952420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This is the first time we failed -- restart process and 11962420ead0326bfd2587da6231be419e758dba1930Craig Mautner // retry. 11972420ead0326bfd2587da6231be419e758dba1930Craig Mautner app.activities.remove(r); 11982420ead0326bfd2587da6231be419e758dba1930Craig Mautner throw e; 11992420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12002420ead0326bfd2587da6231be419e758dba1930Craig Mautner 12012420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.launchFailed = false; 12022420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (stack.updateLRUListLocked(r)) { 12032420ead0326bfd2587da6231be419e758dba1930Craig Mautner Slog.w(TAG, "Activity " + r 12042420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " being launched, but already in LRU list"); 12052420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12062420ead0326bfd2587da6231be419e758dba1930Craig Mautner 12072420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (andResume) { 12082420ead0326bfd2587da6231be419e758dba1930Craig Mautner // As part of the process of launching, ActivityThread also performs 12092420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a resume. 12102420ead0326bfd2587da6231be419e758dba1930Craig Mautner stack.minimalResumeActivityLocked(r); 12112420ead0326bfd2587da6231be419e758dba1930Craig Mautner } else { 12122420ead0326bfd2587da6231be419e758dba1930Craig Mautner // This activity is not starting in the resumed state... which 12132420ead0326bfd2587da6231be419e758dba1930Craig Mautner // should look like we asked it to pause+stop (but remain visible), 12142420ead0326bfd2587da6231be419e758dba1930Craig Mautner // and it has done so and reported back the current icicle and 12152420ead0326bfd2587da6231be419e758dba1930Craig Mautner // other state. 12162420ead0326bfd2587da6231be419e758dba1930Craig Mautner if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r 12172420ead0326bfd2587da6231be419e758dba1930Craig Mautner + " (starting in stopped state)"); 12182420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.state = ActivityState.STOPPED; 12192420ead0326bfd2587da6231be419e758dba1930Craig Mautner r.stopped = true; 12202420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12212420ead0326bfd2587da6231be419e758dba1930Craig Mautner 12222420ead0326bfd2587da6231be419e758dba1930Craig Mautner // Launch the new version setup screen if needed. We do this -after- 12232420ead0326bfd2587da6231be419e758dba1930Craig Mautner // launching the initial activity (that is, home), so that it can have 12242420ead0326bfd2587da6231be419e758dba1930Craig Mautner // a chance to initialize itself while in the background, making the 12252420ead0326bfd2587da6231be419e758dba1930Craig Mautner // switch back to it faster and look better. 1226de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (isFrontStack(stack)) { 12272420ead0326bfd2587da6231be419e758dba1930Craig Mautner mService.startSetupActivityLocked(); 12282420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12292420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1230465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn // Update any services we are bound to that might care about whether 1231465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn // their client may have activities. 1232465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn mService.mServices.updateServiceConnectionActivitiesLocked(r.app); 1233465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn 12342420ead0326bfd2587da6231be419e758dba1930Craig Mautner return true; 12352420ead0326bfd2587da6231be419e758dba1930Craig Mautner } 12362420ead0326bfd2587da6231be419e758dba1930Craig Mautner 1237e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner void startSpecificActivityLocked(ActivityRecord r, 12382c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount boolean andResume, boolean checkConfig) { 1239e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // Is this activity's application already running? 1240e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner ProcessRecord app = mService.getProcessRecordLocked(r.processName, 12413bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn r.info.applicationInfo.uid, true); 1242e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1243e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner r.task.stack.setLaunchTime(r); 1244e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1245e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner if (app != null && app.thread != null) { 1246e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner try { 1247237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0 1248237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn || !"android".equals(r.info.packageName)) { 1249237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // Don't add this if it is a platform component that is marked 1250237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // to run in multiple processes, because this is actually 1251237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // part of the framework so doesn't make sense to track as a 1252237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn // separate apk in the process. 1253f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode, 1254f7097a5b697fedb6976774e55a51471405a23c0eDianne Hackborn mService.mProcessStats); 1255237cefbcee8721e3268ba778297a0ad48e67f079Dianne Hackborn } 12562c92c9700c7b06f3c7dd5ab15d8343dfce68c833George Mount realStartActivityLocked(r, app, andResume, checkConfig); 1257e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner return; 1258e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } catch (RemoteException e) { 1259e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner Slog.w(TAG, "Exception when starting activity " 1260e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner + r.intent.getComponent().flattenToShortString(), e); 1261e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1262e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1263e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // If a dead object exception was thrown -- fall through to 1264e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner // restart the application. 1265e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1266e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 1267e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 12683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn "activity", r.intent.getComponent(), false, false, true); 1269e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner } 1270e79d4268c0ee7971abb6ef99c76c2bd7f7818109Craig Mautner 12716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startActivityLocked(IApplicationThread caller, 127291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn Intent intent, String resolvedType, ActivityInfo aInfo, 127391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 127491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IBinder resultTo, String resultWho, int requestCode, 127595465200b0f652c48d40ca1028238763dd647900Dianne Hackborn int callingPid, int callingUid, String callingPackage, 127695465200b0f652c48d40ca1028238763dd647900Dianne Hackborn int realCallingPid, int realCallingUid, int startFlags, Bundle options, 127789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container, 127889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn TaskRecord inTask) { 12796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner int err = ActivityManager.START_SUCCESS; 12806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ProcessRecord callerApp = null; 12826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (caller != null) { 12836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callerApp = mService.getRecordForAppLocked(caller); 12846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (callerApp != null) { 12856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingPid = callerApp.pid; 12866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid = callerApp.info.uid; 12876170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 12886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, "Unable to find app for caller " + caller 12896170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " (pid=" + callingPid + ") when starting: " 12906170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + intent.toString()); 12916170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_PERMISSION_DENIED; 12926170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12936170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 12946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 12956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS) { 12966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; 12976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false) 129802a4aa261c28df2466234106d61282289276b462Craig Mautner + "} from uid " + callingUid 12999ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner + " on display " + (container == null ? (mFocusedStack == null ? 13009ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner Display.DEFAULT_DISPLAY : mFocusedStack.mDisplayId) : 13019ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner (container.mActivityDisplay == null ? Display.DEFAULT_DISPLAY : 13029ef471f7f2f59de032d7cb9c3c7241486109979eCraig Mautner container.mActivityDisplay.mDisplayId))); 13036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord sourceRecord = null; 13066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord resultRecord = null; 13076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultTo != null) { 13086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord = isInAnyStackLocked(resultTo); 13096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (DEBUG_RESULTS) Slog.v( 13106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner TAG, "Will send result to " + resultTo + " " + sourceRecord); 13116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (sourceRecord != null) { 13126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0 && !sourceRecord.finishing) { 13136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord; 13146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack; 13186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 131991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn final int launchFlags = intent.getFlags(); 13206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 132195465200b0f652c48d40ca1028238763dd647900Dianne Hackborn if ((launchFlags&Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) { 13226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Transfer the result target from the source activity to the new 13236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // one being started, including any failures. 13246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (requestCode >= 0) { 13256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 13266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 13276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord = sourceRecord.resultTo; 13296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultWho = sourceRecord.resultWho; 13306170f73ed5464491b91685b57e116db033e98d5aCraig Mautner requestCode = sourceRecord.requestCode; 13316170f73ed5464491b91685b57e116db033e98d5aCraig Mautner sourceRecord.resultTo = null; 13326170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 13331b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner resultRecord.removeResultsLocked(sourceRecord, resultWho, requestCode); 13346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13353026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn if (sourceRecord.launchedFromUid == callingUid) { 13363026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // The new activity is being launched from the same uid as the previous 13373026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // activity in the flow, and asking to forward its result back to the 13383026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // previous. In this case the activity is serving as a trampoline between 13393026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // the two, so we also want to update its launchedFromPackage to be the 13403026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // same as the previous activity. Note that this is safe, since we know 13413026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // these two packages come from the same uid; the caller could just as 13423026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // well have supplied that same package name itself. This specifially 13433026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // deals with the case of an intent picker/chooser being launched in the app 13443026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // flow to redirect to an activity picked by the user, where we want the final 13453026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn // activity to consider it to have been launched by the previous app activity. 13463026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn callingPackage = sourceRecord.launchedFromPackage; 13473026d0bf0a4d89788cdc29573dcecb2bd72b263cDianne Hackborn } 13486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13506170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { 13516170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find a class that can handle the given Intent. 13526170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // That's the end of that! 13536170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_INTENT_NOT_RESOLVED; 13546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 13566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err == ActivityManager.START_SUCCESS && aInfo == null) { 13576170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // We couldn't find the specific class specified in the Intent. 13586170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // Also the end of the line. 13596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner err = ActivityManager.START_CLASS_NOT_FOUND; 13606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 13616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 136291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (err == ActivityManager.START_SUCCESS && sourceRecord != null 136391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn && sourceRecord.task.voiceSession != null) { 136491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // If this activity is being launched as part of a voice session, we need 136591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // to ensure that it is safe to do so. If the upcoming activity will also 136691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // be part of the voice session, we can only launch it if it has explicitly 136791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // said it supports the VOICE category, or it is a part of the calling app. 1368f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 136991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) { 137091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 137195465200b0f652c48d40ca1028238763dd647900Dianne Hackborn if (!AppGlobals.getPackageManager().activitySupportsIntent( 137295465200b0f652c48d40ca1028238763dd647900Dianne Hackborn intent.getComponent(), intent, resolvedType)) { 137391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 137491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 137591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 137691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 137791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 137891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 137991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 138091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 138191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (err == ActivityManager.START_SUCCESS && voiceSession != null) { 138291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // If the caller is starting a new voice session, just make sure the target 138391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn // is actually allowing it to run this way. 138491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn try { 138591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(), 138691097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn intent, resolvedType)) { 138791097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 138891097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 138991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } catch (RemoteException e) { 139091097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 139191097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 139291097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn } 139391097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn 13946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (err != ActivityManager.START_SUCCESS) { 13956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 13966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 13976170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 13986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 13996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 14016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 14026170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14036170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 14046170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int startAnyPerm = mService.checkPermission( 14056170f73ed5464491b91685b57e116db033e98d5aCraig Mautner START_ANY_ACTIVITY, callingPid, callingUid); 14066170f73ed5464491b91685b57e116db033e98d5aCraig Mautner final int componentPerm = mService.checkComponentPermission(aInfo.permission, callingPid, 14076170f73ed5464491b91685b57e116db033e98d5aCraig Mautner callingUid, aInfo.applicationInfo.uid, aInfo.exported); 14086170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (startAnyPerm != PERMISSION_GRANTED && componentPerm != PERMISSION_GRANTED) { 14096170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (resultRecord != null) { 14106170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultStack.sendActivityResultLocked(-1, 14116170f73ed5464491b91685b57e116db033e98d5aCraig Mautner resultRecord, resultWho, requestCode, 14126170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 14136170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14146170f73ed5464491b91685b57e116db033e98d5aCraig Mautner String msg; 14156170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (!aInfo.exported) { 14166170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 14176170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 14186170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 14196170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " not exported from uid " + aInfo.applicationInfo.uid; 14206170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 14216170f73ed5464491b91685b57e116db033e98d5aCraig Mautner msg = "Permission Denial: starting " + intent.toString() 14226170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " from " + callerApp + " (pid=" + callingPid 14236170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + ", uid=" + callingUid + ")" 14246170f73ed5464491b91685b57e116db033e98d5aCraig Mautner + " requires " + aInfo.permission; 14256170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14266170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Slog.w(TAG, msg); 14276170f73ed5464491b91685b57e116db033e98d5aCraig Mautner throw new SecurityException(msg); 14286170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14296170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1430dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver boolean abort = !mService.mIntentFirewall.checkStartActivity(intent, callingUid, 1431b62237938eb1379980eb80004137d6dcd6ff14f7Ben Gruver callingPid, resolvedType, aInfo.applicationInfo); 14325e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver 14336170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mController != null) { 14346170f73ed5464491b91685b57e116db033e98d5aCraig Mautner try { 14356170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // The Intent we give to the watcher has the extra data 14366170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // stripped off, since it can contain private information. 14376170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Intent watchIntent = intent.cloneFilter(); 14385e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver abort |= !mService.mController.activityStarting(watchIntent, 14396170f73ed5464491b91685b57e116db033e98d5aCraig Mautner aInfo.applicationInfo.packageName); 14406170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } catch (RemoteException e) { 14416170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mController = null; 14426170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14435e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver } 14446170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 14455e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (abort) { 14465e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver if (resultRecord != null) { 14475e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, 14486170f73ed5464491b91685b57e116db033e98d5aCraig Mautner Activity.RESULT_CANCELED, null); 14496170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14505e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // We pretend to the caller that it was really started, but 14515e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver // they will just get a cancel result. 14525e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver ActivityOptions.abort(options); 14535e207331078ee1d43fed6e8451208c9a9bb77b2cBen Gruver return ActivityManager.START_SUCCESS; 14546170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14556170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 14566170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage, 1457e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho, 1458233ceeebab7efe6ad4783371003c4cf29b896436Craig Mautner requestCode, componentSpecified, this, container, options); 14596170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (outActivity != null) { 14606170f73ed5464491b91685b57e116db033e98d5aCraig Mautner outActivity[0] = r; 14616170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14626170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1463ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = getFocusedStack(); 146491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn if (voiceSession == null && (stack.mResumedActivity == null 146591097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn || stack.mResumedActivity.info.applicationInfo.uid != callingUid)) { 146695465200b0f652c48d40ca1028238763dd647900Dianne Hackborn if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, 146795465200b0f652c48d40ca1028238763dd647900Dianne Hackborn realCallingPid, realCallingUid, "Activity start")) { 14686170f73ed5464491b91685b57e116db033e98d5aCraig Mautner PendingActivityLaunch pal = 1469de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner new PendingActivityLaunch(r, sourceRecord, startFlags, stack); 1470ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner mPendingActivityLaunches.add(pal); 14716170f73ed5464491b91685b57e116db033e98d5aCraig Mautner ActivityOptions.abort(options); 14726170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return ActivityManager.START_SWITCHES_CANCELED; 14736170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14746170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14756170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 14766170f73ed5464491b91685b57e116db033e98d5aCraig Mautner if (mService.mDidAppSwitch) { 14776170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // This is the second allowed switch since we stopped switches, 14786170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // so now just generally allow switches. Use case: user presses 14796170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // home (switches disabled, switch to home, mDidAppSwitch now true); 14806170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // user taps a home icon (coming from home so allowed, we hit here 14816170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // and now allow anyone to switch again). 14826170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mAppSwitchesAllowedTime = 0; 14836170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } else { 14846170f73ed5464491b91685b57e116db033e98d5aCraig Mautner mService.mDidAppSwitch = true; 14856170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14866170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 1487ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner doPendingActivityLaunchesLocked(false); 14886170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 148991097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor, 149089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn startFlags, true, options, inTask); 149110385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner 14928de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi if (err < 0) { 149310385a17cb31de6fdf495b50d17a0afbec83e98eCraig Mautner // If someone asked to have the keyguard dismissed on the next 14946170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // activity start, but we are not actually doing an activity 14956170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // switch... just dismiss the keyguard now, because we 14966170f73ed5464491b91685b57e116db033e98d5aCraig Mautner // probably want to see whatever is behind it. 14978de4311c51229efbe2f2d0afbf298982c5cadd96Jorim Jaggi notifyActivityDrawnForKeyguard(); 14986170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 14996170f73ed5464491b91685b57e116db033e98d5aCraig Mautner return err; 15006170f73ed5464491b91685b57e116db033e98d5aCraig Mautner } 15016170f73ed5464491b91685b57e116db033e98d5aCraig Mautner 15021b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner ActivityStack adjustStackFocus(ActivityRecord r, boolean newTask) { 15031d001b670e34fe887488047f525a5430154626e1Craig Mautner final TaskRecord task = r.task; 150458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 150558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima // On leanback only devices we should keep all activities in the same stack. 150658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima if (!mLeanbackOnlyDevice && 150758e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima (r.isApplicationActivity() || (task != null && task.isApplicationTask()))) { 1508ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (task != null) { 1509d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner final ActivityStack taskStack = task.stack; 1510e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (taskStack.isOnHomeDisplay()) { 1511e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mFocusedStack != taskStack) { 1512e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: Setting " + 1513e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner "focused stack to r=" + r + " task=" + task); 1514e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mFocusedStack = taskStack; 1515e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } else { 1516e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1517e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner "adjustStackFocus: Focused stack already=" + mFocusedStack); 1518e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 1519858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1520d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner return taskStack; 1521858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 1522ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1523e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityContainer container = r.mInitialActivityContainer; 1524e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (container != null) { 1525e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner // The first time put it on the desired stack, after this put on task stack. 1526e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner r.mInitialActivityContainer = null; 1527e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return container.mStack; 1528e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 1529e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner 15301b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner if (mFocusedStack != mHomeStack && (!newTask || 15311b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner mFocusedStack.mActivityContainer.isEligibleForNewTasks())) { 1532ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1533ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner "adjustStackFocus: Have a focused stack=" + mFocusedStack); 1534ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner return mFocusedStack; 1535de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1536ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 1537e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks; 1538e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) { 1539e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityStack stack = homeDisplayStacks.get(stackNdx); 1540e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (!stack.isHomeStack()) { 1541e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, 1542e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner "adjustStackFocus: Setting focused stack=" + stack); 1543e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mFocusedStack = stack; 1544e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return mFocusedStack; 1545ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 15461d001b670e34fe887488047f525a5430154626e1Craig Mautner } 1547ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 15484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // Need to create an app stack for this user. 1549f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); 1550ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG, "adjustStackFocus: New stack r=" + r + 1551ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner " stackId=" + stackId); 1552ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner mFocusedStack = getStack(stackId); 155329219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner return mFocusedStack; 1554de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1555de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return mHomeStack; 1556de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 1557de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 155829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner void setFocusedStack(ActivityRecord r) { 15594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r != null) { 156012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner final TaskRecord task = r.task; 156112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner boolean isHomeActivity = !r.isApplicationActivity(); 156212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (!isHomeActivity && task != null) { 156312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner isHomeActivity = !task.isApplicationTask(); 156412ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 156512ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (!isHomeActivity && task != null) { 156612ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner final ActivityRecord parent = task.stack.mActivityContainer.mParentActivity; 156712ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner isHomeActivity = parent != null && parent.isHomeActivity(); 156812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 15694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner moveHomeStack(isHomeActivity); 157029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 157129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 157229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner 157389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final int startActivityUncheckedLocked(ActivityRecord r, ActivityRecord sourceRecord, 157491097de49b0f683b00e26a75dbc0ac6082344137Dianne Hackborn IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, 157589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn boolean doResume, Bundle options, TaskRecord inTask) { 15768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final Intent intent = r.intent; 15778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner final int callingUid = r.launchedFromUid; 15788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 1579d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // In some flows in to this function, we retrieve the task record and hold on to it 1580d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // without a lock before calling back in to here... so the task at this point may 1581d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // not actually be in recents. Check for that, and if it isn't in recents just 1582d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // consider it invalid. 1583d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (inTask != null && !inTask.inRecents) { 1584d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn Slog.w(TAG, "Starting activity in task not in recents: " + inTask); 1585d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn inTask = null; 1586d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 1587d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 1588ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner final boolean launchSingleTop = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP; 1589a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner final boolean launchSingleInstance = r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE; 1590a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner final boolean launchSingleTask = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK; 15918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 1592a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner int launchFlags = intent.getFlags(); 1593f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && 1594a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner (launchSingleInstance || launchSingleTask)) { 1595f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // We have a conflict between the Intent and the Activity manifest, manifest wins. 1596f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " + 1597f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner "\"singleInstance\" or \"singleTask\""); 1598f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags &= 1599f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner ~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 1600f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } else { 1601f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner switch (r.info.documentLaunchMode) { 1602f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner case ActivityInfo.DOCUMENT_LAUNCH_NONE: 1603f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner break; 1604f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING: 1605f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT; 1606f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner break; 1607f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS: 1608f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT; 1609f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner break; 1610f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner case ActivityInfo.DOCUMENT_LAUNCH_NEVER: 1611f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags &= ~Intent.FLAG_ACTIVITY_MULTIPLE_TASK; 1612f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner break; 1613f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } 1614f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } 1615bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner 161689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final boolean launchTaskBehind = r.mLaunchTaskBehind 161789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn && !launchSingleTask && !launchSingleInstance 161889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn && (launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0; 1619f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner 1620f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1621f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // For whatever reason this activity is being launched into a new 1622f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // task... yet the caller has requested a result back. Well, that 1623f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // is pretty messed up, so instead immediately send back a cancel 1624f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // and let the new task continue launched as normal without a 1625f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner // dependency on its originator. 1626f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 1627f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, 1628f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner r.resultTo, r.resultWho, r.requestCode, 1629f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner Activity.RESULT_CANCELED, null); 1630f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner r.resultTo = null; 1631f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } 1632f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner 1633f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && r.resultTo == null) { 1634f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1635f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner } 1636f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner 163789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // If we are actually going to launch in to a new task, there are some cases where 163889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // we further want to do multiple task. 163989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 164089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (launchTaskBehind 164189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn || r.info.documentLaunchMode == ActivityInfo.DOCUMENT_LAUNCH_ALWAYS) { 164289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_MULTIPLE_TASK; 164389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 164489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 164589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 16468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We'll invoke onUserLeaving before onPause only if the launching 16478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity did not explicitly state that this is an automated launch. 1648a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner mUserLeaving = (launchFlags & Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 1649de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_USER_LEAVING) Slog.v(TAG, "startActivity() => mUserLeaving=" + mUserLeaving); 16508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has asked not to resume at this point, we make note 16528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of this in the record so that we can skip it when trying to find 16538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the top running activity. 16548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!doResume) { 16558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.delayedResume = true; 16568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 1658a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner ActivityRecord notTop = 1659a254cd7e0ffd7d3b131f3c7a69c9fa13dbacc0bdCraig Mautner (launchFlags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null; 16608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the onlyIfNeeded flag is set, then we can do this if the activity 16628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being launched is the same as the one making the call... or, as 16638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a special case, if we do not know the caller then we count the 16648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current top activity as the caller. 16658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 16668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord checkedCaller = sourceRecord; 16678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (checkedCaller == null) { 1668ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner checkedCaller = getFocusedStack().topRunningNonDelayedActivityLocked(notTop); 16698849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16708849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!checkedCaller.realActivity.equals(r.realActivity)) { 16718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Caller is not the same as launcher, so always needed. 16728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED; 16738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 16758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 16768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean addingToTask = false; 16778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner TaskRecord reuseTask = null; 167889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 167989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // If the caller is not coming from another activity, but has given us an 168089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // explicit task into which they would like us to launch the new activity, 168189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // then let's see about doing that. 1682d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (sourceRecord == null && inTask != null && inTask.stack != null) { 1683d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn final Intent baseIntent = inTask.getBaseIntent(); 1684d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn final ActivityRecord root = inTask.getRootActivity(); 1685d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (baseIntent == null) { 1686d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityOptions.abort(options); 1687d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn throw new IllegalArgumentException("Launching into task without base intent: " 1688d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn + inTask); 1689d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 1690d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 169189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // If this task is empty, then we are adding the first activity -- it 169289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // determines the root, and must be launching as a NEW_TASK. 1693d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (launchSingleInstance || launchSingleTask) { 1694d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (!baseIntent.getComponent().equals(r.intent.getComponent())) { 1695d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityOptions.abort(options); 1696d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn throw new IllegalArgumentException("Trying to launch singleInstance/Task " 1697d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn + r + " into different task " + inTask); 169889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 1699d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (root != null) { 1700d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityOptions.abort(options); 1701d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn throw new IllegalArgumentException("Caller with inTask " + inTask 1702d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn + " has root " + root + " but target is singleInstance/Task"); 1703d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 1704d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 1705d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 1706d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // If task is empty, then adopt the interesting intent launch flags in to the 1707d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // activity being started. 1708d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (root == null) { 1709d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn final int flagsOfInterest = Intent.FLAG_ACTIVITY_NEW_TASK 1710d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn | Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT 1711d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS; 1712d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn launchFlags = (launchFlags&~flagsOfInterest) 1713d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn | (baseIntent.getFlags()&flagsOfInterest); 1714d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn intent.setFlags(launchFlags); 171589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn inTask.setIntent(r); 1716962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn addingToTask = true; 171789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 1718962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // If the task is not empty and the caller is asking to start it as the root 1719962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // of a new task, then we don't actually want to start this on the task. We 1720962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // will bring the task to the front, and possibly give it a new intent. 1721d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } else if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1722962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn addingToTask = false; 1723962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn 1724962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn } else { 1725962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn addingToTask = true; 172689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 1727962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn 172889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn reuseTask = inTask; 172989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else { 173089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn inTask = null; 173189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 173289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 1733a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if (inTask == null) { 1734a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if (sourceRecord == null) { 1735a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // This activity is not being started from another... in this 1736a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // case we -always- start a new task. 1737a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 && inTask == null) { 1738a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Slog.w(TAG, "startActivity called from non-Activity context; forcing " + 1739a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 1740a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1741a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1742a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 1743a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // The original activity who is starting us is running as a single 1744a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // instance... this new activity it is starting must go on its 1745a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // own task. 1746a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1747a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } else if (launchSingleInstance || launchSingleTask) { 1748a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // The activity being started is a single instance... it always 1749a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // gets launched into its own task. 1750a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1751a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1752a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1753a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 1754a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn ActivityInfo newTaskInfo = null; 1755a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Intent newTaskIntent = null; 1756a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn ActivityStack sourceStack; 1757a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if (sourceRecord != null) { 1758a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if (sourceRecord.finishing) { 1759a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // If the source is finishing, we can't further count it as our source. This 1760a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // is because the task it is associated with may now be empty and on its way out, 1761a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // so we don't want to blindly throw it in to that task. Instead we will take 1762a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // the NEW_TASK flow and try to find a task for it. But save the task information 1763a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn // so it can be used when creating the new task. 1764a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 1765a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn Slog.w(TAG, "startActivity called from finishing " + sourceRecord 1766a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 1767a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1768a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn newTaskInfo = sourceRecord.info; 1769a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn newTaskIntent = sourceRecord.task.intent; 1770a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1771a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn sourceRecord = null; 1772a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn sourceStack = null; 1773a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } else { 1774a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn sourceStack = sourceRecord.task.stack; 1775a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1776a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } else { 1777a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn sourceStack = null; 1778a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn } 1779a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 1780a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn boolean movedHome = false; 1781a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn ActivityStack targetStack; 1782a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 1783a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn intent.setFlags(launchFlags); 1784a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn 178589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // We may want to try to place the new activity in to an existing task. We always 178689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // do this if the target activity is singleTask or singleInstance; we will also do 178789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // this if NEW_TASK has been requested, and there is not an additional qualifier telling 178889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // us to still place it in a new task: multi task, always doc mode, or being asked to 178989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // launch this as a new task behind the current one. 1790d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if (((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 1791d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner (launchFlags & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 1792a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner || launchSingleInstance || launchSingleTask) { 1793d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // If bring to front is requested, and no result is requested and we have not 1794d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // been given an explicit task to launch in to, and 17958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we can find a task that was started with this same 17968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // component, then instead of launching bring that one to the front. 1797d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (inTask == null && r.resultTo == null) { 17988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // See if there is a task to bring to the front. If this is 17998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // a SINGLE_INSTANCE activity, there can be one and only one 18008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // instance of it in the history, and it is always in its own 18018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // unique task, so we do a special search. 1802a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner ActivityRecord intentActivity = !launchSingleInstance ? 1803a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner findTaskLocked(r) : findActivityLocked(intent, r.info); 18048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity != null) { 1805aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(intentActivity.task)) { 1806a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk showLockTaskToast(); 18070175b882b5e021907c307ab0e455bff014ad8784Craig Mautner Slog.e(TAG, "startActivityUnchecked: Attempt to violate Lock Task Mode"); 1808aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 1809aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 181029219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner if (r.task == null) { 181129219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner r.task = intentActivity.task; 181229219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner } 18138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack = intentActivity.task.stack; 18140f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 18152a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "Bring to front target: " + targetStack 18162a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + " from " + intentActivity); 1817e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner targetStack.moveToFront(); 18188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.task.intent == null) { 18198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This task was started because of movement of 18208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the activity based on affinity... now that we 18218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // are actually launching it, we can assign the 18228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // base intent. 1823fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung intentActivity.task.setIntent(r); 18248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the target task is not in the front, then we need 18268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to bring it to the front... except... well, with 18278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 18288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to have the same behavior as if a new instance was 18298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // being started, which means not bringing it to the front 18308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // if the caller is not itself in the front. 1831165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner final ActivityStack lastStack = getLastStack(); 1832165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner ActivityRecord curTop = lastStack == null? 1833165640bbc69c7831ec38d573dc1f85b264db2a5dCraig Mautner null : lastStack.topRunningNonDelayedActivityLocked(notTop); 183444f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi boolean movedToFront = false; 18357504d7b24a07fef05b3447d843f212796e22302fCraig Mautner if (curTop != null && (curTop.task != intentActivity.task || 18367504d7b24a07fef05b3447d843f212796e22302fCraig Mautner curTop.task != lastStack.topTask())) { 18378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 1838d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner if (sourceRecord == null || (sourceStack.topActivity() != null && 1839d0f964f93f100a8a8a2c22df98964a82219dc77fCraig Mautner sourceStack.topActivity().task == sourceRecord.task)) { 18408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We really do want to push this one into the 18418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // user's face, right now. 1842bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner if (launchTaskBehind && sourceRecord != null) { 1843a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner intentActivity.setTaskToAffiliateWith(sourceRecord.task); 1844a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner } 18458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner movedHome = true; 1846b53d97c4571f8ed09e92eee64301969b96ff1e4dCraig Mautner targetStack.moveTaskToFrontLocked(intentActivity.task, r, options); 1847de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 184829219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) 184929219d963d1ec29ddea3e5814eb82c2aeaccc1acCraig Mautner == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { 1850e12a4a68101725eaecefef7d7bd9236991e3f508Craig Mautner // Caller wants to appear on home activity. 185184984faf530e525b066e28710d0f9beb32142ec5Craig Mautner intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 1852de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 18538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner options = null; 185444f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi movedToFront = true; 18558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the caller has requested that the target task be 18588849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // reset, then do so. 18598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 18608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r); 18618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 18638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 18648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 18658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! And for paranoia, make 18668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 18678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 186805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(targetStack, null, options); 186944f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi 187044f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi // Make sure to notify Keyguard as well if we are not running an app 187144f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi // transition later. 187244f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi if (!movedToFront) { 187344f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi notifyActivityDrawnForKeyguard(); 187444f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi } 18758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 18768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 18778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 18798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 18808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((launchFlags & 18818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) 18828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)) { 18838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The caller has requested to completely replace any 18848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task with its new activity. Well that should 18858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // not be too hard... 18868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask = intentActivity.task; 18878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner reuseTask.performClearTaskLocked(); 1888fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung reuseTask.setIntent(r); 18898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0 1890a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner || launchSingleInstance || launchSingleTask) { 18918849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this situation we want to remove all activities 18928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from the task up to the one being started. In most 18938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // cases this means we are resetting the task to its 18948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // initial state. 18958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord top = 18968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task.performClearTaskLocked(r, launchFlags); 18978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 18988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.frontOfTask) { 18998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Activity aliases may mean we use different 19008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intents for the top activity, so make sure 19018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the task now has the identity of the new 19028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // intent. 1903fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung top.task.setIntent(r); 19048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, 19068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner r, top.task); 190785d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 19088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 19098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // A special case: we need to 19108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // start the activity because it is not currently 19118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // running, and the caller has asked to clear the 19128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // current task to have this activity at the top. 19138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 19148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Now pretend like this activity is being started 19158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // by the top of its task, so it is put in the 19168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // right place. 19178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 19188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (r.realActivity.equals(intentActivity.task.realActivity)) { 19208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case the top activity on the task is the 19218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // same as the one being launched, so we take that 19228849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // as a request to bring the task to the foreground. 19238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the top activity in the task is the root 19248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity, deliver this new intent to it if it 19258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // desires. 1926ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 || launchSingleTop) 19278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner && intentActivity.realActivity.equals(r.realActivity)) { 19288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, 19298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner intentActivity.task); 19308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (intentActivity.frontOfTask) { 1931fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung intentActivity.task.setIntent(r); 19328849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 193385d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn intentActivity.deliverNewIntentLocked(callingUid, r.intent, 193485d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn r.launchedFromPackage); 19358849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!r.intent.filterEquals(intentActivity.task.intent)) { 19368849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching the root activity 19378849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of the task, but with a different intent. We 19388849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // should start a new instance on top. 19398849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 19408849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 19418849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19428849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 19438849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case an activity is being launched in to an 19448849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // existing task, without resetting that task. This 19458849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is typically the situation of launching an activity 19468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // from a notification or shortcut. We want to place 19478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the new activity on top of the current task. 19488849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner addingToTask = true; 19498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner sourceRecord = intentActivity; 19508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!intentActivity.task.rootWasReset) { 19518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case we are launching in to an existing task 19528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that has not yet been started from its front door. 19538849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // The current task has been brought to the front. 19548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Ideally, we'd probably like to place this new task 19558849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the bottom of its stack, but that's a little hard 19568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to do with the current organization of the code so 19578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // for now we'll just drop it. 1958fee26771cfed736d207a8ee9c97134c848be1a52Winson Chung intentActivity.task.setIntent(r); 19598849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!addingToTask && reuseTask == null) { 19618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We didn't do anything... but it was needed (a.k.a., client 19628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // don't use that intent!) And for paranoia, make 19638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // sure we have correctly resumed the top activity. 19648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 1965de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner targetStack.resumeTopActivityLocked(null, options); 196644f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi if (!movedToFront) { 196744f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi // Make sure to notify Keyguard as well if we are not running an app 196844f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi // transition later. 196944f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi notifyActivityDrawnForKeyguard(); 197044f60cca7bb31e2f9b4b7bf25bb2e0cfb0e3e1e1Jorim Jaggi } 19718849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 19728849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 19738849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19748849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_TASK_TO_FRONT; 19758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 19798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 19808849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //String uri = r.intent.toURI(); 19818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Intent intent2 = new Intent(uri); 19828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "Given intent: " + r.intent); 19838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "URI is: " + uri); 19848849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner //Slog.i(TAG, "To intent: " + intent2); 19858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 19868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.packageName != null) { 19878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // If the activity being launched is the same as the one currently 19888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // at the top, then we need to check if it should only be launched 19898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // once. 1990ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ActivityStack topStack = getFocusedStack(); 1991de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop); 19928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null && r.resultTo == null) { 19938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 19948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top.app != null && top.app.thread != null) { 1995d00f47402cb886a43a3448128bdcd9dd2f348a2aCraig Mautner if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 1996ad400af809d4f0da7e3747922ddae6c1828a96bbCraig Mautner || launchSingleTop || launchSingleTask) { 19978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, 19988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.task); 19998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 20008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 20010f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner topStack.mLastPausedActivity = null; 20028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 200305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 20048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20058849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 20068849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 20078849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // We don't need to start a new activity, and 20088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // the client said not to do anything if that 20098849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // is the case, so this is it! 20108849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_RETURN_INTENT_TO_CALLER; 20118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 201285d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 20138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 20148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 20198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 20208849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (r.resultTo != null) { 2021de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, 2022de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.requestCode, Activity.RESULT_CANCELED, null); 20238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20248849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 20258849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_CLASS_NOT_FOUND; 20268849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20278849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 20288849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean newTask = false; 20298849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner boolean keepCurTransition = false; 20308849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 2031bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner TaskRecord taskToAffiliate = launchTaskBehind && sourceRecord != null ? 2032a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner sourceRecord.task : null; 2033a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner 20348849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // Should this be considered a new task? 2035962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn if (r.resultTo == null && inTask == null && !addingToTask 2036f357c0ca514d73273a18b3896e565b2272e608adCraig Mautner && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 2037aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(reuseTask)) { 2038aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 2039aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 2040aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2041d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn newTask = true; 2042d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn targetStack = adjustStackFocus(r, newTask); 2043bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner if (!launchTaskBehind) { 2044bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner targetStack.moveToFront(); 2045bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 20468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (reuseTask == null) { 20478862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner r.setTask(targetStack.createTaskRecord(getNextTaskId(), 20488862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner newTaskInfo != null ? newTaskInfo : r.info, 20498862929e2a5ae4936083b6d7ac7e908df256a885Craig Mautner newTaskIntent != null ? newTaskIntent : intent, 2050bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner voiceSession, voiceInteractor, !launchTaskBehind /* toTop */), 2051bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner taskToAffiliate); 2052de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r + " in new task " + 2053de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner r.task); 20548849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 2055a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner r.setTask(reuseTask, taskToAffiliate); 20568849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20578849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (!movedHome) { 2058de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((launchFlags & 2059de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) 2060de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner == (Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_TASK_ON_HOME)) { 2061de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // Caller wants to appear on home activity, so before starting 2062de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // their own activity we will bring home to the front. 206384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 2064de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 20658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (sourceRecord != null) { 2067a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner final TaskRecord sourceTask = sourceRecord.task; 2068aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(sourceTask)) { 2069aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 2070aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 2071aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2072525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner targetStack = sourceTask.stack; 2073dd221b3780800f03900c52bfc4a1ac7d01b72bc2Craig Mautner targetStack.moveToFront(); 2074737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner final TaskRecord topTask = targetStack.topTask(); 2075737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner if (topTask != sourceTask) { 2076737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner targetStack.moveTaskToFrontLocked(sourceTask, r, options); 2077737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner } else { 2078737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner mWindowManager.moveTaskToTop(topTask.taskId); 2079737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner } 2080a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner if (!addingToTask && (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 20818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are adding the activity to an existing 20828849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // task, but the caller has asked to clear that task if the 20838849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // activity is already running. 2084525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags); 20858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner keepCurTransition = true; 20868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 20878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 208885d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 20898849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // For paranoia, make sure we have correctly 20908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // resumed the top activity. 20910f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 20928849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 20938849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 20948849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityOptions.abort(options); 20968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 20978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 20988849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else if (!addingToTask && 20998849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 21008849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // In this case, we are launching an activity in our own task 21018849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // that may already be running somewhere in the history, and 21028849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // we want to shuffle it to the front of the stack if so. 2103525f3d9df632e485d1f75d8336e28a266eb7d96cCraig Mautner final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r); 21048849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (top != null) { 2105de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final TaskRecord task = top.task; 2106de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner task.moveActivityToFrontLocked(top); 2107de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task); 21088849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner top.updateOptionsLocked(options); 210985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 21100f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 21118849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (doResume) { 21128849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.resumeTopActivityLocked(null); 21138849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21148849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_DELIVERED_TO_TOP; 21158849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21168849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21178849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // An existing activity is starting this new activity, so we want 21188849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // to keep the new one in the same task as the one that is starting 21198849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // it. 2120a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner r.setTask(sourceTask, null); 21218849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 21222a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn + " in existing task " + r.task + " from source " + sourceRecord); 21238849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 212489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else if (inTask != null) { 212589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // The calling is asking that the new activity be started in an explicit 212689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // task it has provided to us. 212789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (isLockTaskModeViolation(inTask)) { 212889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 212989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 213089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 213189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn targetStack = inTask.stack; 2132d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn targetStack.moveTaskToFrontLocked(inTask, r, options); 213302a4aa261c28df2466234106d61282289276b462Craig Mautner targetStack.moveToFront(); 21342c924fb2c7dfba69d2913943598cbc61945d4f1dDianne Hackborn mWindowManager.moveTaskToTop(inTask.taskId); 2135d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 2136d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // Check whether we should actually launch the new activity in to the task, 2137d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // or just reuse the current activity on top. 2138d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityRecord top = inTask.getTopActivity(); 2139d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if (top != null && top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 2140d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 2141d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn || launchSingleTop || launchSingleTask) { 2142d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 2143d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 2144d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // We don't need to start a new activity, and 2145d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // the client said not to do anything if that 2146d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn // is the case, so this is it! 2147d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn return ActivityManager.START_RETURN_INTENT_TO_CALLER; 2148d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 214985d558cd486d195aabfc4b43cff8f338126f60a5Dianne Hackborn top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 2150d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn return ActivityManager.START_DELIVERED_TO_TOP; 2151d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 2152d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn } 2153d7c9289f935992f4ae2fc032747f9e04bb86a7d0Dianne Hackborn 2154962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn if (!addingToTask) { 2155962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // We don't actually want to have this activity added to the task, so just 2156962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn // stop here but still tell the caller that we consumed the intent. 2157962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn ActivityOptions.abort(options); 2158962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn return ActivityManager.START_TASK_TO_FRONT; 2159962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn } 2160962d535464eb79b11c346236f6889ad76a966e56Dianne Hackborn 216189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn r.setTask(inTask, null); 216289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 216389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn + " in explicit task " + r.task); 216489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 21658849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } else { 21668849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // This not being started from an existing activity, and not part 21678849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // of a new task... just put it in the top task, though these days 21688849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner // this case should never happen. 21691b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner targetStack = adjustStackFocus(r, newTask); 2170dd221b3780800f03900c52bfc4a1ac7d01b72bc2Craig Mautner targetStack.moveToFront(); 21711602ec21883f73c5eb2304cf69d2278f70b145abCraig Mautner ActivityRecord prev = targetStack.topActivity(); 2172c0ffce5ddd6446f1d46a49cdfaeda4a2ce408e1dCraig Mautner r.setTask(prev != null ? prev.task : targetStack.createTaskRecord(getNextTaskId(), 2173a228ae95ea2f842c0e84f237c64bf032689410ddCraig Mautner r.info, intent, null, null, true), null); 217495e9daab03d0349a69940625c7f718175f371581Craig Mautner mWindowManager.moveTaskToTop(r.task.taskId); 21758849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r 21768849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner + " in new guessed " + r.task); 21778849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21788849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 21798849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 2180c6cf95c0f5f7250c65e40c441fe58d8cbfd114c9Nicolas Prevot intent, r.getUriPermissionsLocked(), r.userId); 21818849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 218276e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner if (sourceRecord != null && sourceRecord.isRecentsActivity()) { 218376e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner r.task.setTaskToReturnTo(RECENTS_ACTIVITY_TYPE); 218476e2a765b495f15a718dc4dfd9d81e9539a7074bCraig Mautner } 21858849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner if (newTask) { 21868849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId); 21878849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21888849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 21890f922749f45ba0717c317a765286f880bb9a1cceCraig Mautner targetStack.mLastPausedActivity = null; 21908849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options); 2191bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner if (!launchTaskBehind) { 2192bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner // Don't set focus on an activity that's going to the back. 2193bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner mService.setFocusedActivityLocked(r); 2194bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 21958849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return ActivityManager.START_SUCCESS; 21968849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 21978849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 2198ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final void doPendingActivityLaunchesLocked(boolean doResume) { 2199ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner while (!mPendingActivityLaunches.isEmpty()) { 2200ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner PendingActivityLaunch pal = mPendingActivityLaunches.remove(0); 2201aa9b0f15753541ff8e4d62e6497c11800c737077Craig Mautner startActivityUncheckedLocked(pal.r, pal.sourceRecord, null, null, pal.startFlags, 220289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn doResume && mPendingActivityLaunches.isEmpty(), null, null); 2203ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2204ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2205ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 22067f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner void removePendingActivityLaunchesLocked(ActivityStack stack) { 2207ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner for (int palNdx = mPendingActivityLaunches.size() - 1; palNdx >= 0; --palNdx) { 2208ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner PendingActivityLaunch pal = mPendingActivityLaunches.get(palNdx); 22097f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner if (pal.stack == stack) { 2210ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner mPendingActivityLaunches.remove(palNdx); 2211ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2212ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2213ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner } 2214ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner 22157ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner void acquireLaunchWakelock() { 22167ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 22177ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 22187ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 22197ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.acquire(); 22207ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 22217ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // To be safe, don't allow the wake lock to be held for too long. 22227ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 22237ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 22247ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 22257ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 2226f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Checked. 2227f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, 2228f333327782e14688e1c198c1192172d51308e90bCraig Mautner Configuration config) { 2229f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (localLOGV) Slog.v(TAG, "Activity idle: " + token); 2230f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2231f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> stops = null; 2232f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<ActivityRecord> finishes = null; 2233f333327782e14688e1c198c1192172d51308e90bCraig Mautner ArrayList<UserStartedState> startingUsers = null; 2234f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NS = 0; 2235f333327782e14688e1c198c1192172d51308e90bCraig Mautner int NF = 0; 2236f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean booting = false; 2237f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean enableScreen = false; 2238f333327782e14688e1c198c1192172d51308e90bCraig Mautner boolean activityRemoved = false; 2239f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2240f333327782e14688e1c198c1192172d51308e90bCraig Mautner ActivityRecord r = ActivityRecord.forToken(token); 2241f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r != null) { 2242b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "activityIdleInternalLocked: Callers=" + 2243b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner Debug.getCallers(4)); 2244f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 2245f333327782e14688e1c198c1192172d51308e90bCraig Mautner r.finishLaunchTickingLocked(); 22467ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (fromTimeout) { 22477ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 22487ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 2249f333327782e14688e1c198c1192172d51308e90bCraig Mautner 22507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // This is a hack to semi-deal with a race condition 22517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // in the client where it can be constructed with a 22527ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // newer configuration from when we asked it to launch. 22537ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We'll update with whatever configuration it now says 22547ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // it used to launch. 22557ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (config != null) { 22567ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.configuration = config; 22577ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 2258f333327782e14688e1c198c1192172d51308e90bCraig Mautner 22597ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // We are now idle. If someone is waiting for a thumbnail from 22607ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner // us, we can now deliver. 22617ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner r.idle = true; 22627ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 22637ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 22649449a6162e275531857464acc2279894d5d6a240Dianne Hackborn if (isFrontStack(r.task.stack) || fromTimeout) { 22659449a6162e275531857464acc2279894d5d6a240Dianne Hackborn booting = mService.mBooting; 22669449a6162e275531857464acc2279894d5d6a240Dianne Hackborn mService.mBooting = false; 22679449a6162e275531857464acc2279894d5d6a240Dianne Hackborn if (!mService.mBooted) { 22689449a6162e275531857464acc2279894d5d6a240Dianne Hackborn mService.mBooted = true; 22699449a6162e275531857464acc2279894d5d6a240Dianne Hackborn enableScreen = true; 22709449a6162e275531857464acc2279894d5d6a240Dianne Hackborn } 22717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 22727ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 22737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 22747ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (allResumedActivitiesIdle()) { 22757ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (r != null) { 22767ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.scheduleAppGcsLocked(); 22777ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 22787ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 22797ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 22807ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 22817ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && 22827ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Binder.getCallingUid() != Process.myUid()) { 22837ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 2284f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 22857ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 2286f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 22877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner ensureActivitiesVisibleLocked(null, 0); 2288f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2289f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2290f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Atomically retrieve all of the other things to do. 2291f333327782e14688e1c198c1192172d51308e90bCraig Mautner stops = processStoppingActivitiesLocked(true); 2292f333327782e14688e1c198c1192172d51308e90bCraig Mautner NS = stops != null ? stops.size() : 0; 2293f333327782e14688e1c198c1192172d51308e90bCraig Mautner if ((NF=mFinishingActivities.size()) > 0) { 2294f333327782e14688e1c198c1192172d51308e90bCraig Mautner finishes = new ArrayList<ActivityRecord>(mFinishingActivities); 2295f333327782e14688e1c198c1192172d51308e90bCraig Mautner mFinishingActivities.clear(); 2296f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2297f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2298f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mStartingUsers.size() > 0) { 2299f333327782e14688e1c198c1192172d51308e90bCraig Mautner startingUsers = new ArrayList<UserStartedState>(mStartingUsers); 2300f333327782e14688e1c198c1192172d51308e90bCraig Mautner mStartingUsers.clear(); 2301f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2302f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2303f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Stop any activities that are scheduled to do so but have been 2304f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 2305f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NS; i++) { 2306f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = stops.get(i); 2307f333327782e14688e1c198c1192172d51308e90bCraig Mautner final ActivityStack stack = r.task.stack; 2308f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (r.finishing) { 2309f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false); 2310f333327782e14688e1c198c1192172d51308e90bCraig Mautner } else { 2311f333327782e14688e1c198c1192172d51308e90bCraig Mautner stack.stopActivityLocked(r); 2312f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2313f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2314f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2315f333327782e14688e1c198c1192172d51308e90bCraig Mautner // Finish any activities that are scheduled to do so but have been 2316f333327782e14688e1c198c1192172d51308e90bCraig Mautner // waiting for the next one to start. 2317f333327782e14688e1c198c1192172d51308e90bCraig Mautner for (int i = 0; i < NF; i++) { 2318f333327782e14688e1c198c1192172d51308e90bCraig Mautner r = finishes.get(i); 2319ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner activityRemoved |= r.task.stack.destroyActivityLocked(r, true, "finish-idle"); 2320f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2321f333327782e14688e1c198c1192172d51308e90bCraig Mautner 23227622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn if (!booting) { 23231a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani // Complete user switch 23241a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani if (startingUsers != null) { 23251a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani for (int i = 0; i < startingUsers.size(); i++) { 23261a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mService.finishUserSwitch(startingUsers.get(i)); 23271a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 23281a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 23291a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani // Complete starting up of background users 23301a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani if (mStartingBackgroundUsers.size() > 0) { 23311a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani startingUsers = new ArrayList<UserStartedState>(mStartingBackgroundUsers); 23321a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mStartingBackgroundUsers.clear(); 23331a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani for (int i = 0; i < startingUsers.size(); i++) { 23341a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mService.finishUserBoot(startingUsers.get(i)); 23351a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 2336f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2337f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2338f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2339f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.trimApplications(); 2340f333327782e14688e1c198c1192172d51308e90bCraig Mautner //dump(); 2341f333327782e14688e1c198c1192172d51308e90bCraig Mautner //mWindowManager.dump(); 2342f333327782e14688e1c198c1192172d51308e90bCraig Mautner 23437622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn if (booting || enableScreen) { 23447622a0f8e4198adf0aae5d4e167ee132b34f4cdbDianne Hackborn mService.postFinishBooting(booting, enableScreen); 2345f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2346f333327782e14688e1c198c1192172d51308e90bCraig Mautner 2347f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (activityRemoved) { 234805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 2349f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2350f333327782e14688e1c198c1192172d51308e90bCraig Mautner 23517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return r; 2352f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 2353f333327782e14688e1c198c1192172d51308e90bCraig Mautner 23548e5695778f736e5fd8a82d7485967f3f21a94cccCraig Mautner boolean handleAppDiedLocked(ProcessRecord app) { 23551909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner boolean hasVisibleActivities = false; 2356e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2357e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 23584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 23594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner hasVisibleActivities |= stacks.get(stackNdx).handleAppDiedLocked(app); 23604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 23618d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23621909125ebab026fff1836a93b9b14ea62f404d22Craig Mautner return hasVisibleActivities; 23638d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23648d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 23658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void closeSystemDialogsLocked() { 2366e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2367e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 23684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 23694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.get(stackNdx).closeSystemDialogsLocked(); 23704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 23718d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 237493529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner void removeUserLocked(int userId) { 23754f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner mUserStackInFront.delete(userId); 237693529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner } 237793529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner 23788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner /** 23798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner * @return true if some activity was finished (or would have finished if doit were true). 23808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner */ 23818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean forceStopPackageLocked(String name, boolean doit, boolean evenPersistent, int userId) { 23828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean didSomething = false; 2383e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2384e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 23854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 23864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 23874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 23884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stack.forceStopPackageLocked(name, doit, evenPersistent, userId)) { 23894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner didSomething = true; 23904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 23918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return didSomething; 23948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 23958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2396a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn void updatePreviousProcessLocked(ActivityRecord r) { 2397a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now that this process has stopped, we may want to consider 2398a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // it to be the previous app to try to keep around in case 2399a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // the user wants to return to it. 2400a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 2401a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // First, found out what is currently the foreground app, so that 2402a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // we don't blow away the previous app if this activity is being 2403a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // hosted by the process that is actually still the foreground. 2404a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn ProcessRecord fgApp = null; 2405e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2406e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 24084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 24094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 24104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stack.mResumedActivity != null) { 24114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner fgApp = stack.mResumedActivity.app; 24124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } else if (stack.mPausingActivity != null) { 24134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner fgApp = stack.mPausingActivity.app; 24144a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24154a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner break; 2416a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2417a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2418a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2419a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 2420a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // Now set this one as the previous process, only if that really 2421a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn // makes sense to. 2422a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn if (r.app != null && fgApp != null && r.app != fgApp 2423a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn && r.lastVisibleTime > mService.mPreviousProcessVisibleTime 24244ef2693a243b308fad775a8a1691963c51ac925eCraig Mautner && r.app != mService.mHomeProcess) { 2425a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcess = r.app; 2426a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn mService.mPreviousProcessVisibleTime = r.lastVisibleTime; 2427a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2428a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn } 2429a413dc06b2193442a2d956571b829aeb5fb97862Dianne Hackborn 243005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked() { 243105d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return resumeTopActivitiesLocked(null, null, null); 243205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 243305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 243405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, 243505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner Bundle targetOptions) { 243605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner if (targetStack == null) { 243705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner targetStack = getFocusedStack(); 243805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 243912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner // Do targetStack first. 244005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner boolean result = false; 244112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (isFrontStack(targetStack)) { 244212ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner result = targetStack.resumeTopActivityLocked(target, targetOptions); 244312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 2444e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2445e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 24474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 244812ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner if (stack == targetStack) { 244912ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner // Already started above. 245012ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner continue; 245112ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner } 24524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 245312ff7391a10fff5107e2734d50ed0b428fb75f67Craig Mautner stack.resumeTopActivityLocked(null); 245405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 2455f88c50f8daee2c813d788c19f7f04b9f365efaafCraig Mautner } 24568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 245705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner return result; 24588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24598d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 24608d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void finishTopRunningActivityLocked(ProcessRecord app) { 2461e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2462e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 24644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 24654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 24664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.finishTopRunningActivityLocked(app); 24674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 24688d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24698d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24708d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 24716ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn void finishVoiceTask(IVoiceInteractionSession session) { 24726ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 24736ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 24746ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn final int numStacks = stacks.size(); 24756ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 24766ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn final ActivityStack stack = stacks.get(stackNdx); 24776ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn stack.finishVoiceTask(session); 24786ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn } 24796ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn } 24806ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn } 24816ea0d0a2592395b8980c24304733daec628e947eDianne Hackborn 2482aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner void findTaskToMoveToFrontLocked(TaskRecord task, int flags, Bundle options) { 2483aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) { 2484aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mUserLeaving = true; 24858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2486aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) { 2487aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner // Caller wants the home activity moved with it. To accomplish this, 2488aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner // we'll just indicate that this task returns to the home task. 248984984faf530e525b066e28710d0f9beb32142ec5Craig Mautner task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 2490aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 2491aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner task.stack.moveTaskToFrontLocked(task, null, options); 2492aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "findTaskToMoveToFront: moved to front of stack=" 2493aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner + task.stack); 24948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 24958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2496967212cb542e6eeb308678367b53381bff984c31Craig Mautner ActivityStack getStack(int stackId) { 2497f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer activityContainer = mActivityContainers.get(stackId); 2498f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (activityContainer != null) { 2499f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return activityContainer.mStack; 25008d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return null; 25028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2504967212cb542e6eeb308678367b53381bff984c31Craig Mautner ArrayList<ActivityStack> getStacks() { 25054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<ActivityStack> allStacks = new ArrayList<ActivityStack>(); 2506e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2507e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner allStacks.addAll(mActivityDisplays.valueAt(displayNdx).mStacks); 25084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return allStacks; 25104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 25124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner IBinder getHomeActivityToken() { 2513ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner ActivityRecord homeActivity = getHomeActivity(); 2514ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner if (homeActivity != null) { 2515ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return homeActivity.appToken; 2516ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2517ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return null; 2518ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2519ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 2520ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner ActivityRecord getHomeActivity() { 25214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ArrayList<TaskRecord> tasks = mHomeStack.getAllTasks(); 25224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 25234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final TaskRecord task = tasks.get(taskNdx); 25244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (task.isHomeTask()) { 25254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ArrayList<ActivityRecord> activities = task.mActivities; 25264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { 25274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord r = activities.get(activityNdx); 25284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (r.isHomeActivity()) { 2529ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return r; 25304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return null; 25354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 25374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityContainer createActivityContainer(ActivityRecord parentActivity, 25384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner IActivityContainerCallback callback) { 2539d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner ActivityContainer activityContainer = 2540d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner new VirtualActivityContainer(parentActivity, callback); 2541f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityContainers.put(activityContainer.mStackId, activityContainer); 2542d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (DEBUG_CONTAINERS) Slog.d(TAG, "createActivityContainer: " + activityContainer); 2543f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner parentActivity.mChildContainers.add(activityContainer); 2544f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return activityContainer; 25454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 254734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner void removeChildActivityContainers(ActivityRecord parentActivity) { 2548f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers; 2549f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) { 2550f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer container = childStacks.remove(containerNdx); 2551d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (DEBUG_CONTAINERS) Slog.d(TAG, "removeChildActivityContainers: removing " + 2552d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner container); 2553f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner container.release(); 255434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 255534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 255634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner 255795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner void deleteActivityContainer(IActivityContainer container) { 255895da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner ActivityContainer activityContainer = (ActivityContainer)container; 255995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner if (activityContainer != null) { 2560d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (DEBUG_CONTAINERS) Slog.d(TAG, "deleteActivityContainer: ", 2561d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner new RuntimeException("here").fillInStackTrace()); 256295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner final int stackId = activityContainer.mStackId; 256395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mActivityContainers.remove(stackId); 256495da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner mWindowManager.removeStack(stackId); 256595da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 256695da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner } 256795da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner 2568f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private int createStackOnDisplay(int stackId, int displayId) { 2569e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 2570e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay == null) { 25714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return -1; 25724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 25734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 2574f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer activityContainer = new ActivityContainer(stackId); 2575f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityContainers.put(stackId, activityContainer); 2576e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner activityContainer.attachToDisplayLocked(activityDisplay); 25774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return stackId; 2578967212cb542e6eeb308678367b53381bff984c31Craig Mautner } 2579967212cb542e6eeb308678367b53381bff984c31Craig Mautner 25804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int getNextStackId() { 2581858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner while (true) { 2582858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (++mLastStackId <= HOME_STACK_ID) { 2583858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mLastStackId = HOME_STACK_ID + 1; 2584858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner } 2585858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner if (getStack(mLastStackId) == null) { 2586858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner break; 25878d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25888d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2589858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner return mLastStackId; 25908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 25918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2592ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner void createStackForRestoredTaskHistory(ArrayList<TaskRecord> tasks) { 2593ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner int stackId = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); 2594ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final ActivityStack stack = getStack(stackId); 2595ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 2596ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final TaskRecord task = tasks.get(taskNdx); 2597ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner stack.addTask(task, false, false); 2598ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final int taskId = task.taskId; 2599ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final ArrayList<ActivityRecord> activities = task.mActivities; 2600ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { 2601ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner final ActivityRecord r = activities.get(activityNdx); 2602ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner mWindowManager.addAppToken(0, r.appToken, taskId, stackId, 2603ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner r.info.screenOrientation, r.fullscreen, 2604ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner (r.info.flags & ActivityInfo.FLAG_SHOW_ON_LOCK_SCREEN) != 0, 2605bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner r.userId, r.info.configChanges, task.voiceSession != null, 2606bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner r.mLaunchTaskBehind); 2607ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 2608ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 2609ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner } 2610ef73ee1dd98acfc4a19561367cfc3e4d8bbe06eaCraig Mautner 26118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void moveTaskToStack(int taskId, int stackId, boolean toTop) { 2612b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner final TaskRecord task = anyTaskForIdLocked(taskId); 2613b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner if (task == null) { 2614b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner return; 2615b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner } 26168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityStack stack = getStack(stackId); 26178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (stack == null) { 26188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); 26198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return; 26208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 262141db4a77fa4659d60ad055ec1819a410ce35bf28Craig Mautner task.stack.removeTask(task); 2622c03c9167c2d9a1e22fb2b176b00a0524177fb037Dianne Hackborn stack.addTask(task, toTop, true); 2623b3b36ba13895d779159799341d432f6380a0ba8aCraig Mautner mWindowManager.addTask(taskId, stackId, toTop); 262405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 26258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 26268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2627ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner ActivityRecord findTaskLocked(ActivityRecord r) { 26282a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "Looking for task of " + r); 2629e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2630e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 26314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 26324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 26334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (!r.isApplicationActivity() && !stack.isHomeStack()) { 26341b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (home activity) " + stack); 26351b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner continue; 26361b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner } 26371b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner if (!stack.mActivityContainer.isEligibleForNewTasks()) { 26381b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner if (DEBUG_TASKS) Slog.d(TAG, "Skipping stack: (new task not allowed) " + 26391b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner stack); 26404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner continue; 26414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 26424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord ar = stack.findTaskLocked(r); 26434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (ar != null) { 26444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return ar; 26454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 26468849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 26478849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 26482a272d42a38035e60a8fd53d74c1c56a363b635eDianne Hackborn if (DEBUG_TASKS) Slog.d(TAG, "No task found"); 26498849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 26508849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 26518849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 26528849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 2653e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2654e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 26554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 26564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityRecord ar = stacks.get(stackNdx).findActivityLocked(intent, info); 26574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (ar != null) { 26584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return ar; 26594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 26608849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 26618849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 26628849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner return null; 26638849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner } 26648849a5ecb89834b55b6f83f201da6d7079f2cbb6Craig Mautner 26658d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void goingToSleepLocked() { 26660eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleSleepTimeout(); 26670eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mGoingToSleep.isHeld()) { 26680eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.acquire(); 26697ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 26707ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 26717ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 26720eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 26737ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 26747ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 26750eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 26768d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 2677ce15e157a6cf56fc73961ccb8c5ab18b1bf70280Amith Yamasani checkReadyForSleepLocked(); 26788d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 26798d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 26808d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean shutdownLocked(int timeout) { 26810eea92c67b292b005c152641a12b920fe145826cCraig Mautner goingToSleepLocked(); 26820eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2683f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner boolean timedout = false; 26840eea92c67b292b005c152641a12b920fe145826cCraig Mautner final long endTime = System.currentTimeMillis() + timeout; 26850eea92c67b292b005c152641a12b920fe145826cCraig Mautner while (true) { 26860eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean cantShutdown = false; 2687e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2688e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 26894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 26904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner cantShutdown |= stacks.get(stackNdx).checkReadyForSleepLocked(); 26914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 26920eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 26930eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (cantShutdown) { 26940eea92c67b292b005c152641a12b920fe145826cCraig Mautner long timeRemaining = endTime - System.currentTimeMillis(); 26950eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (timeRemaining > 0) { 26968d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 26970eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.wait(timeRemaining); 26988d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (InterruptedException e) { 26998d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27000eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 27010eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Activity manager shutdown timed out"); 27020eea92c67b292b005c152641a12b920fe145826cCraig Mautner timedout = true; 27030eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 27048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27050eea92c67b292b005c152641a12b920fe145826cCraig Mautner } else { 27060eea92c67b292b005c152641a12b920fe145826cCraig Mautner break; 27078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27090eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27100eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Force checkReadyForSleep to complete. 27110eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 27120eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 27130eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner return timedout; 27158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 27178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void comeOutOfSleepIfNeededLocked() { 27180eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 27190eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 27200eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 27210eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 2722e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2723e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 27244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 27254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 27264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.awakeFromSleepingLocked(); 27274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (isFrontStack(stack)) { 27284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner resumeTopActivitiesLocked(); 27294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27305314a40b96c7c3ecc0dafeda387efe49a5c434e4Craig Mautner } 27318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27320eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.clear(); 27330eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27340eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27350eea92c67b292b005c152641a12b920fe145826cCraig Mautner void activitySleptLocked(ActivityRecord r) { 27360eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleepActivities.remove(r); 27370eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 27380eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27390eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27400eea92c67b292b005c152641a12b920fe145826cCraig Mautner void checkReadyForSleepLocked() { 27410eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mService.isSleepingOrShuttingDown()) { 27420eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Do not care. 27430eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 27440eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27450eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27460eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (!mSleepTimeout) { 27470eea92c67b292b005c152641a12b920fe145826cCraig Mautner boolean dontSleep = false; 2748e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2749e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 27504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 27514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner dontSleep |= stacks.get(stackNdx).checkReadyForSleepLocked(); 27524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27530eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27540eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27550eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mStoppingActivities.size() > 0) { 27560eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to stop; can't sleep yet. 27570eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to stop " 27580eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mStoppingActivities.size() + " activities"); 27590eea92c67b292b005c152641a12b920fe145826cCraig Mautner scheduleIdleLocked(); 27600eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 27610eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27620eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27630eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleepActivities.size() > 0) { 27640eea92c67b292b005c152641a12b920fe145826cCraig Mautner // Still need to tell some activities to sleep; can't sleep yet. 27650eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (DEBUG_PAUSE) Slog.v(TAG, "Sleep still need to sleep " 27660eea92c67b292b005c152641a12b920fe145826cCraig Mautner + mGoingToSleepActivities.size() + " activities"); 27670eea92c67b292b005c152641a12b920fe145826cCraig Mautner dontSleep = true; 27680eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27690eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27700eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (dontSleep) { 27710eea92c67b292b005c152641a12b920fe145826cCraig Mautner return; 27720eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27730eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27740eea92c67b292b005c152641a12b920fe145826cCraig Mautner 2775e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2776e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 27774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 27784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stacks.get(stackNdx).goToSleep(); 27794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 27800eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27810eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27820eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 27830eea92c67b292b005c152641a12b920fe145826cCraig Mautner 27840eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mGoingToSleep.isHeld()) { 27850eea92c67b292b005c152641a12b920fe145826cCraig Mautner mGoingToSleep.release(); 27860eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27870eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.mShuttingDown) { 27880eea92c67b292b005c152641a12b920fe145826cCraig Mautner mService.notifyAll(); 27890eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 27908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 27918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 2792ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner boolean reportResumedActivityLocked(ActivityRecord r) { 2793ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner final ActivityStack stack = r.task.stack; 2794ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (isFrontStack(stack)) { 27955782da778ca2f282b763fa64a8f7ec079cad4d70Jeff Sharkey mService.updateUsageStats(r, true); 2796ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2797ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner if (allResumedActivitiesComplete()) { 2798ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner ensureActivitiesVisibleLocked(null, 0); 2799ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.executeAppTransition(); 2800ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return true; 2801ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2802ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return false; 2803ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 2804ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 28058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void handleAppCrashLocked(ProcessRecord app) { 2806e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2807e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 28084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 28094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 28104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 28114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stack.handleAppCrashLocked(app); 28124a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 28138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 28164b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima boolean requestVisibleBehindLocked(ActivityRecord r, boolean visible) { 2817ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner final ActivityStack stack = r.task.stack; 2818ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner if (stack == null) { 28194b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: r=" + r + " visible=" + 28204b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima visible + " stack is null"); 2821ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return false; 2822ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 28234b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima final boolean isVisible = stack.hasVisibleBehindActivity(); 28244b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind r=" + r + " visible=" + 28254b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima visible + " isVisible=" + isVisible); 2826ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 2827ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner final ActivityRecord top = topRunningActivityLocked(); 28284b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (top == null || top == r || (visible == isVisible)) { 28294b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: quick return"); 28304b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima stack.setVisibleBehindActivity(visible ? r : null); 2831ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return true; 2832ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2833ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 2834ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner // A non-top activity is reporting a visibility change. 2835aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner if (visible && top.fullscreen) { 2836aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner // Let the caller know that it can't be seen. 28374b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: returning top.fullscreen=" 283834ff492978d30569e694f7427be430dce66cac06Jose Lima + top.fullscreen + " top.state=" + top.state + " top.app=" + top.app + 2839ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner " top.app.thread=" + top.app.thread); 2840ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return false; 284134ff492978d30569e694f7427be430dce66cac06Jose Lima } else if (!visible && stack.getVisibleBehindActivity() != r) { 284234ff492978d30569e694f7427be430dce66cac06Jose Lima // Only the activity set as currently visible behind should actively reset its 284334ff492978d30569e694f7427be430dce66cac06Jose Lima // visible behind state. 284434ff492978d30569e694f7427be430dce66cac06Jose Lima if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG, "requestVisibleBehind: returning visible=" 284534ff492978d30569e694f7427be430dce66cac06Jose Lima + visible + " stack.getVisibleBehindActivity()=" + 284634ff492978d30569e694f7427be430dce66cac06Jose Lima stack.getVisibleBehindActivity() + " r=" + r); 284734ff492978d30569e694f7427be430dce66cac06Jose Lima return false; 2848ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2849ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 28504b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima stack.setVisibleBehindActivity(visible ? r : null); 28514b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima if (!visible) { 2852fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner // Make the activity immediately above r opaque. 2853fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner final ActivityRecord next = stack.findNextTranslucentActivity(r); 2854fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner if (next != null) { 2855fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner mService.convertFromTranslucent(next.appToken); 2856fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner } 2857fa387ad6cfa996d09050f8f6c39eaa0537893d20Craig Mautner } 2858aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner if (top.app != null && top.app.thread != null) { 2859aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner // Notify the top app of the change. 2860aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner try { 2861aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner top.app.thread.scheduleBackgroundVisibleBehindChanged(top.appToken, visible); 2862aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner } catch (RemoteException e) { 2863aea5ceded8015b45e8372b83a02f184974f52d6eCraig Mautner } 2864ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2865ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner return true; 2866ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 2867ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 2868bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner // Called when WindowManager has finished animating the launchingBehind activity to the back. 2869bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner void handleLaunchTaskBehindCompleteLocked(ActivityRecord r) { 2870bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner r.mLaunchTaskBehind = false; 2871bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner final TaskRecord task = r.task; 2872bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner task.setLastThumbnail(task.stack.screenshotActivities(r)); 2873bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner mService.addRecentTaskLocked(task); 2874bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner mWindowManager.setAppVisibility(r.appToken, false); 2875bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 2876bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner 2877bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner void scheduleLaunchTaskBehindComplete(IBinder token) { 2878bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner mHandler.obtainMessage(LAUNCH_TASK_BEHIND_COMPLETE, token).sendToTarget(); 2879bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 2880bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner 2881de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) { 2882580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner // First the front stacks. In case any are not fullscreen and are in front of home. 2883e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2884e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 28854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int topStackNdx = stacks.size() - 1; 28864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) { 28874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 2888729cb2391f8eedbab9af1d0ef62febb0b56292ccJose Lima stack.ensureActivitiesVisibleLocked(starting, configChanges); 2889580ea81ccdf29a7af0da88b43d2676fec93e4e5dCraig Mautner } 28908d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 28928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 28938d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner void scheduleDestroyAllActivities(ProcessRecord app, String reason) { 2894e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2895e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 28964a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numStacks = stacks.size(); 28974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 28984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 2899ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner stack.scheduleDestroyActivities(app, reason); 29004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 29018d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 29028d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 29038d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 290489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn void releaseSomeActivitiesLocked(ProcessRecord app, String reason) { 290589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Examine all activities currently running in the process. 290689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn TaskRecord firstTask = null; 290789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Tasks is non-null only if two or more tasks are found. 290889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ArraySet<TaskRecord> tasks = null; 290989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Trying to release some activities in " + app); 291089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn for (int i=0; i<app.activities.size(); i++) { 291189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn ActivityRecord r = app.activities.get(i); 291289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // First, if we find an activity that is in the process of being destroyed, 291389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // then we just aren't going to do anything for now; we want things to settle 291489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // down before we try to prune more activities. 291589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (r.finishing || r.state == ActivityState.DESTROYING 291689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn || r.state == ActivityState.DESTROYED) { 291789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Abort release; already destroying: " + r); 291889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return; 291989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 292089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Don't consider any activies that are currently not in a state where they 292189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // can be destroyed. 292289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (r.visible || !r.stopped || !r.haveState 292389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn || r.state == ActivityState.RESUMED || r.state == ActivityState.PAUSING 292489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn || r.state == ActivityState.PAUSED || r.state == ActivityState.STOPPING) { 292589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Not releasing in-use activity: " + r); 292689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn continue; 292789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 292889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (r.task != null) { 292989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Collecting release task " + r.task 293089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn + " from " + r); 293189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (firstTask == null) { 293289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn firstTask = r.task; 293389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } else if (firstTask != r.task) { 293489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (tasks == null) { 293589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn tasks = new ArraySet<>(); 293689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn tasks.add(firstTask); 293789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 293889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn tasks.add(r.task); 293989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 294089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 294189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 294289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (tasks == null) { 294389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (DEBUG_RELEASE) Slog.d(TAG, "Didn't find two or more tasks to release"); 294489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return; 294589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 294689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // If we have activities in multiple tasks that are in a position to be destroyed, 294789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // let's iterate through the tasks and release the oldest one. 294889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final int numDisplays = mActivityDisplays.size(); 294989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 295089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 295189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Step through all stacks starting from behind, to hit the oldest things first. 295289ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn for (int stackNdx = 0; stackNdx < stacks.size(); stackNdx++) { 295389ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn final ActivityStack stack = stacks.get(stackNdx); 295489ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn // Try to release activities in this stack; if we manage to, we are done. 295589ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn if (stack.releaseSomeActivitiesLocked(app, tasks, reason) > 0) { 295689ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn return; 295789ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 295889ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 295989ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 296089ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn } 296189ad456ea49cb62615ebdcac83a2515743bbe5faDianne Hackborn 29628d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean switchUserLocked(int userId, UserStartedState uss) { 29634f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner mUserStackInFront.put(mCurrentUser, getFocusedStack().getStackId()); 29644f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID); 29652420ead0326bfd2587da6231be419e758dba1930Craig Mautner mCurrentUser = userId; 2966ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 2967858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner mStartingUsers.add(uss); 2968e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2969e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 29704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 2971e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ActivityStack stack = stacks.get(stackNdx); 2972e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner stack.switchUserLocked(userId); 2973dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina TaskRecord task = stack.topTask(); 2974dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina if (task != null) { 2975dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina mWindowManager.moveTaskToTop(task.taskId); 2976dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina } 29774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 2978ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner } 2979858d8a6583b0c91c66960167b84c67b6c4e2d3c6Craig Mautner 29804f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner ActivityStack stack = getStack(restoreStackId); 29814f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner if (stack == null) { 29824f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner stack = mHomeStack; 29834f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner } 29844f1df4faed1300699bdda4ac9435532c0743ecf8Craig Mautner final boolean homeInFront = stack.isHomeStack(); 2985e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (stack.isOnHomeDisplay()) { 2986e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner moveHomeStack(homeInFront); 2987dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina TaskRecord task = stack.topTask(); 2988dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina if (task != null) { 2989dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina mWindowManager.moveTaskToTop(task.taskId); 2990dae57a14141a90d71332086c3d6e8bd3ebf84fe5Alexandra Gherghina } 2991e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } else { 2992e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner // Stack was moved to another display while user was swapped out. 299384984faf530e525b066e28710d0f9beb32142ec5Craig Mautner resumeHomeStackTask(HOME_ACTIVITY_TYPE, null); 2994e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 299593529a475e4935aa78599556a5c1a18d9425d8c2Craig Mautner return homeInFront; 29962219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner } 29972219a1ba3d9f5c215be0eeb63fa8e8084da0f1acCraig Mautner 29981a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani /** 29991a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani * Add background users to send boot completed events to. 30001a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani * @param userId The user being started in the background 30011a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani * @param uss The state object for the user. 30021a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani */ 30031a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani public void startBackgroundUserLocked(int userId, UserStartedState uss) { 30041a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani mStartingBackgroundUsers.add(uss); 30051a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani } 30061a7eaaa50e7f1a021129ebbe2f6ae1ac469b8812Amith Yamasani 3007de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) { 3008de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner int N = mStoppingActivities.size(); 3009de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (N <= 0) return null; 3010de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 3011de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ArrayList<ActivityRecord> stops = null; 3012de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 3013de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner final boolean nowVisible = allResumedActivitiesVisible(); 3014de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner for (int i=0; i<N; i++) { 3015de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner ActivityRecord s = mStoppingActivities.get(i); 3016a7f2bd4da736b48a2f23335d90475db4fee4ffbbCraig Mautner if (localLOGV) Slog.v(TAG, "Stopping " + s + ": nowVisible=" 3017de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + nowVisible + " waitingVisible=" + s.waitingVisible 3018de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner + " finishing=" + s.finishing); 3019de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.waitingVisible && nowVisible) { 3020de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mWaitingVisibleActivities.remove(s); 3021de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner s.waitingVisible = false; 3022de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (s.finishing) { 3023de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // If this activity is finishing, it is sitting on top of 3024de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // everyone else but we now know it is no longer needed... 3025de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // so get rid of it. Otherwise, we need to go through the 3026de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // normal flow and hide it once we determine that it is 3027de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner // hidden by the activities in front of it. 3028de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Before stopping, can hide: " + s); 3029ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner mWindowManager.setAppVisibility(s.appToken, false); 3030de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3031de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3032de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if ((!s.waitingVisible || mService.isSleepingOrShuttingDown()) && remove) { 3033de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (localLOGV) Slog.v(TAG, "Ready to stop: " + s); 3034de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (stops == null) { 3035de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops = new ArrayList<ActivityRecord>(); 3036de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3037de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner stops.add(s); 3038de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner mStoppingActivities.remove(i); 3039de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner N--; 3040de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner i--; 3041de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3042de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3043de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 3044de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner return stops; 3045de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner } 3046de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 3047cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner void validateTopActivitiesLocked() { 30484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // FIXME 30494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner/* for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 30504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 3051cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner final ActivityRecord r = stack.topRunningActivityLocked(null); 3052f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityState state = r == null ? ActivityState.DESTROYED : r.state; 3053cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (isFrontStack(stack)) { 3054cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner if (r == null) { 3055cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: null top activity, stack=" + stack); 3056cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 3057f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord pausing = stack.mPausingActivity; 3058f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (pausing != null && pausing == r) { 3059cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: top stack has pausing activity r=" + r + 3060f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 3061cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3062f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (state != ActivityState.INITIALIZING && state != ActivityState.RESUMED) { 3063cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in front not resumed r=" + r + 3064f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 3065cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3066cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3067cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } else { 3068f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner final ActivityRecord resumed = stack.mResumedActivity; 3069f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (resumed != null && resumed == r) { 3070cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: back stack has resumed activity r=" + r + 3071f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 3072cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3073f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner if (r != null && (state == ActivityState.INITIALIZING 3074f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner || state == ActivityState.RESUMED)) { 3075cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner Slog.e(TAG, "validateTop...: activity in back resumed r=" + r + 3076f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner " state=" + state); 3077cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3078cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 3079cf910b0c714b2ca90ea0013e5695850506a1d36fCraig Mautner } 30804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner*/ 308176ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner } 308276ea2246781a899659ce4e24f3b75d17d2f0745dCraig Mautner 3083270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner public void dump(PrintWriter pw, String prefix) { 3084d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack); 30854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pw.print(" mLastFocusedStack="); pw.println(mLastFocusedStack); 3086d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout); 3087d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId); 3088d1bbdb462afd280a599b3914bbf4256201641f35Craig Mautner pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront); 308995da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers); 3090270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner } 30918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 309220e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { 3093ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner return getFocusedStack().getDumpActivitiesLocked(name); 309420e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner } 309520e7227454bf6f3500c6eb97a17483dd8b764341Craig Mautner 3096390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage, 3097390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean needSep, String prefix) { 3098390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (activity != null) { 3099390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (dumpPackage == null || dumpPackage.equals(activity.packageName)) { 3100390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (needSep) { 3101390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(); 3102390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 3103390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.print(prefix); 3104390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(activity); 31057ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return true; 3106390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 3107390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 31087ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return false; 3109390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 3110390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn 31118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 31128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner boolean dumpClient, String dumpPackage) { 31137ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean printed = false; 31147ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn boolean needSep = false; 3115e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { 3116e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx); 3117ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner pw.print("Display #"); pw.print(activityDisplay.mDisplayId); 3118737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner pw.println(" (activities from top to bottom):"); 3119e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = activityDisplay.mStacks; 3120737fae2b2ea77e390c0dc1c91e9e1a98dac07d22Craig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 31214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack stack = stacks.get(stackNdx); 31224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StringBuilder stackHeader = new StringBuilder(128); 31234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stackHeader.append(" Stack #"); 31244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stackHeader.append(stack.mStackId); 31254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner stackHeader.append(":"); 31264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, 31274a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep, stackHeader.toString()); 31284a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, " ", "Run", false, 31294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner !dumpAll, false, dumpPackage, true, 31304a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " Running activities (most recent first):", null); 31314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 31324a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = printed; 31334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep, 31344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mPausingActivity: "); 31354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (pr) { 31364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed = true; 31374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = false; 31384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 31394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep, 31404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mResumedActivity: "); 31417ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (pr) { 31427ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed = true; 31434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = false; 31444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 31454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (dumpAll) { 31464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep, 31474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner " mLastPausedActivity: "); 31484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (pr) { 31494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed = true; 31504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = true; 31514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 31524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage, 31534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep, " mLastNoHistoryActivity: "); 31547ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 31554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner needSep = printed; 31568d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 31578d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 31588d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 31597ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mFinishingActivities, " ", "Fin", false, !dumpAll, 31607ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to finish:", null); 31617ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mStoppingActivities, " ", "Stop", false, !dumpAll, 31627ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to stop:", null); 31637ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, " ", "Wait", false, !dumpAll, 31647ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting for another to become visible:", 31657ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn null); 31667ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 31677ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 31687ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 31697ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn false, dumpPackage, true, " Activities waiting to sleep:", null); 3170de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 31717ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn return printed; 31728d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 31738d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner 3174390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, 31758d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner String prefix, String label, boolean complete, boolean brief, boolean client, 31767ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn String dumpPackage, boolean needNL, String header1, String header2) { 31778d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TaskRecord lastTask = null; 3178390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String innerPrefix = null; 3179390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn String[] args = null; 3180390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn boolean printed = false; 31818d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner for (int i=list.size()-1; i>=0; i--) { 31828d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final ActivityRecord r = list.get(i); 31838d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (dumpPackage != null && !dumpPackage.equals(r.packageName)) { 31848d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner continue; 31858d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3186390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn if (innerPrefix == null) { 3187390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn innerPrefix = prefix + " "; 3188390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn args = new String[0]; 3189390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 3190390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn printed = true; 31918d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner final boolean full = !brief && (complete || !r.isInHistory()); 31928d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (needNL) { 3193390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn pw.println(""); 31948d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = false; 31958d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 31967ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header1 != null) { 31977ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header1); 31987ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header1 = null; 31997ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn } 32007ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn if (header2 != null) { 32017ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn pw.println(header2); 32027ad34e5fb2bc8eda0a64377cedf8a8e899644dd9Dianne Hackborn header2 = null; 3203390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn } 32048d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask != r.task) { 32058d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask = r.task; 32068d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); 32078d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(full ? "* " : " "); 32088d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask); 32098d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 32108d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner lastTask.dump(pw, prefix + " "); 32118d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 32128d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 32138d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (lastTask.intent != null) { 32148d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(" "); 32158d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(lastTask.intent.toInsecureStringWithClip()); 32168d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32178d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32188d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32198d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(prefix); pw.print(full ? " * " : " "); pw.print(label); 32208d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(" #"); pw.print(i); pw.print(": "); 32218d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(r); 32228d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (full) { 32238d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.dump(pw, innerPrefix); 32248d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } else if (complete) { 32258d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Complete + brief == give a summary. Isn't that obvious?!? 32268d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.intent.toInsecureString()); 32278d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (r.app != null) { 32288d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.print(innerPrefix); pw.println(r.app); 32298d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32308d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32318d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner if (client && r.app != null && r.app.thread != null) { 32328d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // flush anything that is already in the PrintWriter since the thread is going 32338d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // to write to the file descriptor directly 32348d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.flush(); 32358d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 32368d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner TransferPipe tp = new TransferPipe(); 32378d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner try { 32388d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(), 32398d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner r.appToken, innerPrefix, args); 32408d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // Short timeout, since blocking here can 32418d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner // deadlock with the application. 32428d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.go(fd, 2000); 32438d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } finally { 32448d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner tp.kill(); 32458d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32468d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (IOException e) { 32478d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Failure while dumping the activity: " + e); 32488d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } catch (RemoteException e) { 32498d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner pw.println(innerPrefix + "Got a RemoteException while dumping the activity"); 32508d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32518d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner needNL = true; 32528d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 32538d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3254390517be2d60dd6e6264150c190c372d89bb331aDianne Hackborn return printed; 32558d341efad0850a6ff1a33375b33e3c7fdd8d9109Craig Mautner } 3256ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 3257f333327782e14688e1c198c1192172d51308e90bCraig Mautner void scheduleIdleTimeoutLocked(ActivityRecord next) { 3258b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4)); 3259c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next); 3260c64f73e7785507152358fbfa89be0ce7a0196692Craig Mautner mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 3261f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 3262f333327782e14688e1c198c1192172d51308e90bCraig Mautner 3263f333327782e14688e1c198c1192172d51308e90bCraig Mautner final void scheduleIdleLocked() { 326405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mHandler.sendEmptyMessage(IDLE_NOW_MSG); 3265f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 3266f333327782e14688e1c198c1192172d51308e90bCraig Mautner 3267f333327782e14688e1c198c1192172d51308e90bCraig Mautner void removeTimeoutsForActivityLocked(ActivityRecord r) { 3268b59dcfd5e108fdffbc610ef109cccecbbd11cd75Craig Mautner if (DEBUG_IDLE) Slog.d(TAG, "removeTimeoutsForActivity: Callers=" + Debug.getCallers(4)); 3269f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 3270f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 3271f333327782e14688e1c198c1192172d51308e90bCraig Mautner 327205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner final void scheduleResumeTopActivities() { 327334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) { 327434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 327534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 327605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 327705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 32780eea92c67b292b005c152641a12b920fe145826cCraig Mautner void removeSleepTimeouts() { 32790eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = false; 32800eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 32810eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 32820eea92c67b292b005c152641a12b920fe145826cCraig Mautner 32830eea92c67b292b005c152641a12b920fe145826cCraig Mautner final void scheduleSleepTimeout() { 32840eea92c67b292b005c152641a12b920fe145826cCraig Mautner removeSleepTimeouts(); 32850eea92c67b292b005c152641a12b920fe145826cCraig Mautner mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT); 32860eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 32870eea92c67b292b005c152641a12b920fe145826cCraig Mautner 32884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 32894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void onDisplayAdded(int displayId) { 3290d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Slog.v(TAG, "Display added displayId=" + displayId); 32914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0)); 32924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 32934a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 32944a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 32954a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void onDisplayRemoved(int displayId) { 3296d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Slog.v(TAG, "Display removed displayId=" + displayId); 32974a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0)); 32984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 32994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 33014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void onDisplayChanged(int displayId) { 3302d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Slog.v(TAG, "Display changed displayId=" + displayId); 33034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0)); 33044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void handleDisplayAddedLocked(int displayId) { 33074504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner boolean newDisplay; 33084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 33094504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner newDisplay = mActivityDisplays.get(displayId) == null; 33104504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner if (newDisplay) { 33114504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner ActivityDisplay activityDisplay = new ActivityDisplay(displayId); 33121a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner if (activityDisplay.mDisplay == null) { 33131a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner Slog.w(TAG, "Display " + displayId + " gone before initialization complete"); 33141a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner return; 33151a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner } 33164504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mActivityDisplays.put(displayId, activityDisplay); 33174504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 33184504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 33194504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner if (newDisplay) { 33204504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mWindowManager.onDisplayAdded(displayId); 33214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void handleDisplayRemovedLocked(int displayId) { 33254a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 3326e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 3327e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay != null) { 3328e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = activityDisplay.mStacks; 33294a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 333034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner stacks.get(stackNdx).mActivityContainer.detachLocked(); 33314a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3332e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplays.remove(displayId); 33334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager.onDisplayRemoved(displayId); 33364a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33374a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public void handleDisplayChangedLocked(int displayId) { 33394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 3340e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 3341e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay != null) { 33424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner // TODO: Update the bounds. 33434a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33454a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager.onDisplayChanged(displayId); 33464a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33474a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StackInfo getStackInfo(ActivityStack stack) { 33494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StackInfo info = new StackInfo(); 33504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mWindowManager.getStackBounds(stack.mStackId, info.bounds); 33514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.displayId = Display.DEFAULT_DISPLAY; 33524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.stackId = stack.mStackId; 33534a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<TaskRecord> tasks = stack.getAllTasks(); 33554a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int numTasks = tasks.size(); 33564a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner int[] taskIds = new int[numTasks]; 33574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner String[] taskNames = new String[numTasks]; 33584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int i = 0; i < numTasks; ++i) { 33594a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final TaskRecord task = tasks.get(i); 33604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner taskIds[i] = task.taskId; 33614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner taskNames[i] = task.origActivity != null ? task.origActivity.flattenToString() 33624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner : task.realActivity != null ? task.realActivity.flattenToString() 33634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner : task.getTopActivity() != null ? task.getTopActivity().packageName 33644a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner : "unknown"; 33654a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33664a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.taskIds = taskIds; 33674a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner info.taskNames = taskNames; 33684a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return info; 33694a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33704a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner StackInfo getStackInfoLocked(int stackId) { 33724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStack stack = getStack(stackId); 33734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner if (stack != null) { 33744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return getStackInfo(stack); 33754a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33764a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return null; 33774a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 33794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<StackInfo> getAllStackInfosLocked() { 33804a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ArrayList<StackInfo> list = new ArrayList<StackInfo>(); 3381e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { 3382e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 33834a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner for (int ndx = stacks.size() - 1; ndx >= 0; --ndx) { 33844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner list.add(getStackInfo(stacks.get(ndx))); 33854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return list; 33884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 33894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3390a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk void showLockTaskToast() { 3391a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk mLockTaskNotify.showToast(mLockTaskIsLocked); 3392a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk } 3393a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk 3394a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk void setLockTaskModeLocked(TaskRecord task, boolean isLocked) { 3395aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (task == null) { 33963bd90617ec07a1093139de39591a624b21468e46Christopher Tate // Take out of lock task mode if necessary 33973bd90617ec07a1093139de39591a624b21468e46Christopher Tate if (mLockTaskModeTask != null) { 33983bd90617ec07a1093139de39591a624b21468e46Christopher Tate final Message lockTaskMsg = Message.obtain(); 33993bd90617ec07a1093139de39591a624b21468e46Christopher Tate lockTaskMsg.arg1 = mLockTaskModeTask.userId; 34003bd90617ec07a1093139de39591a624b21468e46Christopher Tate lockTaskMsg.what = LOCK_TASK_END_MSG; 34013bd90617ec07a1093139de39591a624b21468e46Christopher Tate mLockTaskModeTask = null; 34023bd90617ec07a1093139de39591a624b21468e46Christopher Tate mHandler.sendMessage(lockTaskMsg); 34033bd90617ec07a1093139de39591a624b21468e46Christopher Tate } 3404aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return; 3405aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3406aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (isLockTaskModeViolation(task)) { 3407aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner Slog.e(TAG, "setLockTaskMode: Attempt to start a second Lock Task Mode task."); 3408aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return; 3409aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3410aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mLockTaskModeTask = task; 3411aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner findTaskToMoveToFrontLocked(task, 0, null); 3412aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner resumeTopActivitiesLocked(); 34133bd90617ec07a1093139de39591a624b21468e46Christopher Tate 34143bd90617ec07a1093139de39591a624b21468e46Christopher Tate final Message lockTaskMsg = Message.obtain(); 341535c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk lockTaskMsg.obj = mLockTaskModeTask.intent.getComponent().getPackageName(); 341635c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk lockTaskMsg.arg1 = mLockTaskModeTask.userId; 34175286d3ff47135976d66d67888cadca52ef2ab244justinzhang lockTaskMsg.what = LOCK_TASK_START_MSG; 3418a8f569c10a423ced5be7e019c3df2bca11b052f5Jason Monk lockTaskMsg.arg2 = !isLocked ? 1 : 0; 34195286d3ff47135976d66d67888cadca52ef2ab244justinzhang mHandler.sendMessage(lockTaskMsg); 3420aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3421aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 3422aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner boolean isLockTaskModeViolation(TaskRecord task) { 3423aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return mLockTaskModeTask != null && mLockTaskModeTask != task; 3424aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3425aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 3426aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner void endLockTaskModeIfTaskEnding(TaskRecord task) { 3427aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner if (mLockTaskModeTask != null && mLockTaskModeTask == task) { 3428835495c1175cd159635997ecff4281eb51e72fe6Jason Monk final Message lockTaskMsg = Message.obtain(); 3429835495c1175cd159635997ecff4281eb51e72fe6Jason Monk lockTaskMsg.arg1 = mLockTaskModeTask.userId; 3430835495c1175cd159635997ecff4281eb51e72fe6Jason Monk lockTaskMsg.what = LOCK_TASK_END_MSG; 3431aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner mLockTaskModeTask = null; 3432835495c1175cd159635997ecff4281eb51e72fe6Jason Monk mHandler.sendMessage(lockTaskMsg); 3433aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3434aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3435aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 3436aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner boolean isInLockTaskMode() { 3437aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner return mLockTaskModeTask != null; 3438aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner } 3439aea74a5977ca9f1054926eb24f247562c3a4a6baCraig Mautner 3440ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner private final class ActivityStackSupervisorHandler extends Handler { 3441f333327782e14688e1c198c1192172d51308e90bCraig Mautner 3442ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public ActivityStackSupervisorHandler(Looper looper) { 3443ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner super(looper); 3444ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3445ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner 3446f333327782e14688e1c198c1192172d51308e90bCraig Mautner void activityIdleInternal(ActivityRecord r) { 3447f333327782e14688e1c198c1192172d51308e90bCraig Mautner synchronized (mService) { 3448f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternalLocked(r != null ? r.appToken : null, true, null); 3449f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 34507ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 34517ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner 3452ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner @Override 3453ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner public void handleMessage(Message msg) { 3454ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner switch (msg.what) { 3455f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_TIMEOUT_MSG: { 34565eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj); 3457f333327782e14688e1c198c1192172d51308e90bCraig Mautner if (mService.mDidDexOpt) { 3458f333327782e14688e1c198c1192172d51308e90bCraig Mautner mService.mDidDexOpt = false; 3459f333327782e14688e1c198c1192172d51308e90bCraig Mautner Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 3460f333327782e14688e1c198c1192172d51308e90bCraig Mautner nmsg.obj = msg.obj; 3461f333327782e14688e1c198c1192172d51308e90bCraig Mautner mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 3462f333327782e14688e1c198c1192172d51308e90bCraig Mautner return; 3463f333327782e14688e1c198c1192172d51308e90bCraig Mautner } 3464f333327782e14688e1c198c1192172d51308e90bCraig Mautner // We don't at this point know if the activity is fullscreen, 3465f333327782e14688e1c198c1192172d51308e90bCraig Mautner // so we need to be conservative and assume it isn't. 3466f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 3467f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 3468f333327782e14688e1c198c1192172d51308e90bCraig Mautner case IDLE_NOW_MSG: { 34695eda9b330120f75964cd78b29f6101cc273c2a7eCraig Mautner if (DEBUG_IDLE) Slog.d(TAG, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj); 3470f333327782e14688e1c198c1192172d51308e90bCraig Mautner activityIdleInternal((ActivityRecord)msg.obj); 3471f333327782e14688e1c198c1192172d51308e90bCraig Mautner } break; 347205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner case RESUME_TOP_ACTIVITY_MSG: { 347305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner synchronized (mService) { 347405d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner resumeTopActivitiesLocked(); 347505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } 347605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner } break; 34770eea92c67b292b005c152641a12b920fe145826cCraig Mautner case SLEEP_TIMEOUT_MSG: { 34780eea92c67b292b005c152641a12b920fe145826cCraig Mautner synchronized (mService) { 34790eea92c67b292b005c152641a12b920fe145826cCraig Mautner if (mService.isSleepingOrShuttingDown()) { 34800eea92c67b292b005c152641a12b920fe145826cCraig Mautner Slog.w(TAG, "Sleep timeout! Sleeping now."); 34810eea92c67b292b005c152641a12b920fe145826cCraig Mautner mSleepTimeout = true; 34820eea92c67b292b005c152641a12b920fe145826cCraig Mautner checkReadyForSleepLocked(); 34830eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 34840eea92c67b292b005c152641a12b920fe145826cCraig Mautner } 34850eea92c67b292b005c152641a12b920fe145826cCraig Mautner } break; 34867ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner case LAUNCH_TIMEOUT_MSG: { 34877ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mService.mDidDexOpt) { 34887ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mService.mDidDexOpt = false; 34897ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 34907ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner return; 34917ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 34927ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner synchronized (mService) { 34937ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (mLaunchingActivity.isHeld()) { 34947ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 34957ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner if (VALIDATE_WAKE_LOCK_CALLER 34967ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner && Binder.getCallingUid() != Process.myUid()) { 34977ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner throw new IllegalStateException("Calling must be system uid"); 34987ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 34997ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner mLaunchingActivity.release(); 35007ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 35017ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } 35027ea5bd497f842c8181f6455da6c8013e06578d45Craig Mautner } break; 35034a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner case HANDLE_DISPLAY_ADDED: { 35044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner handleDisplayAddedLocked(msg.arg1); 35054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } break; 35064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner case HANDLE_DISPLAY_CHANGED: { 35074a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner handleDisplayChangedLocked(msg.arg1); 35084a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } break; 35094a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner case HANDLE_DISPLAY_REMOVED: { 35104a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner handleDisplayRemovedLocked(msg.arg1); 35114a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } break; 3512e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner case CONTAINER_CALLBACK_VISIBILITY: { 3513e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner final ActivityContainer container = (ActivityContainer) msg.obj; 3514d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner final IActivityContainerCallback callback = container.mCallback; 3515d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner if (callback != null) { 3516d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner try { 3517d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner callback.setVisible(container.asBinder(), msg.arg1 == 1); 3518d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } catch (RemoteException e) { 3519d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } 3520e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3521d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } break; 35225286d3ff47135976d66d67888cadca52ef2ab244justinzhang case LOCK_TASK_START_MSG: { 35235286d3ff47135976d66d67888cadca52ef2ab244justinzhang // When lock task starts, we disable the status bars. 35245286d3ff47135976d66d67888cadca52ef2ab244justinzhang try { 352562515beee67307d8859beec521b7baedfa54b2b5Jason Monk if (mLockTaskNotify == null) { 352662515beee67307d8859beec521b7baedfa54b2b5Jason Monk mLockTaskNotify = new LockTaskNotify(mService.mContext); 352762515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 352862515beee67307d8859beec521b7baedfa54b2b5Jason Monk mLockTaskNotify.show(true); 35292961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk mLockTaskIsLocked = msg.arg2 == 0; 35305286d3ff47135976d66d67888cadca52ef2ab244justinzhang if (getStatusBarService() != null) { 353162515beee67307d8859beec521b7baedfa54b2b5Jason Monk int flags = 353262515beee67307d8859beec521b7baedfa54b2b5Jason Monk StatusBarManager.DISABLE_MASK ^ StatusBarManager.DISABLE_BACK; 35332961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk if (!mLockTaskIsLocked) { 353462515beee67307d8859beec521b7baedfa54b2b5Jason Monk flags ^= StatusBarManager.DISABLE_HOME 353562515beee67307d8859beec521b7baedfa54b2b5Jason Monk | StatusBarManager.DISABLE_RECENT; 353662515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 353762515beee67307d8859beec521b7baedfa54b2b5Jason Monk getStatusBarService().disable(flags, mToken, 353862515beee67307d8859beec521b7baedfa54b2b5Jason Monk mService.mContext.getPackageName()); 35395286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 354062515beee67307d8859beec521b7baedfa54b2b5Jason Monk mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG); 354135c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk if (getDevicePolicyManager() != null) { 354235c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk getDevicePolicyManager().notifyLockTaskModeChanged(true, 354362515beee67307d8859beec521b7baedfa54b2b5Jason Monk (String)msg.obj, msg.arg1); 354435c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 35455286d3ff47135976d66d67888cadca52ef2ab244justinzhang } catch (RemoteException ex) { 35465286d3ff47135976d66d67888cadca52ef2ab244justinzhang throw new RuntimeException(ex); 35475286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3548b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner } break; 35495286d3ff47135976d66d67888cadca52ef2ab244justinzhang case LOCK_TASK_END_MSG: { 35505286d3ff47135976d66d67888cadca52ef2ab244justinzhang // When lock task ends, we enable the status bars. 35515286d3ff47135976d66d67888cadca52ef2ab244justinzhang try { 355262515beee67307d8859beec521b7baedfa54b2b5Jason Monk if (getStatusBarService() != null) { 355362515beee67307d8859beec521b7baedfa54b2b5Jason Monk getStatusBarService().disable(StatusBarManager.DISABLE_NONE, mToken, 355462515beee67307d8859beec521b7baedfa54b2b5Jason Monk mService.mContext.getPackageName()); 355562515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 355662515beee67307d8859beec521b7baedfa54b2b5Jason Monk mWindowManager.reenableKeyguard(mToken); 355735c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk if (getDevicePolicyManager() != null) { 355835c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk getDevicePolicyManager().notifyLockTaskModeChanged(false, null, 355935c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk msg.arg1); 356035c62a4668a85aa4318c9ec564f2e06e8a2d2a30Jason Monk } 356162515beee67307d8859beec521b7baedfa54b2b5Jason Monk if (mLockTaskNotify == null) { 356262515beee67307d8859beec521b7baedfa54b2b5Jason Monk mLockTaskNotify = new LockTaskNotify(mService.mContext); 356362515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 356462515beee67307d8859beec521b7baedfa54b2b5Jason Monk mLockTaskNotify.show(false); 356562515beee67307d8859beec521b7baedfa54b2b5Jason Monk try { 356694cfd9d7c42287c18bde29aa1ae34944eb448f45Jason Monk boolean shouldLockKeyguard = Settings.Secure.getInt( 356762515beee67307d8859beec521b7baedfa54b2b5Jason Monk mService.mContext.getContentResolver(), 356894cfd9d7c42287c18bde29aa1ae34944eb448f45Jason Monk Settings.Secure.LOCK_TO_APP_EXIT_LOCKED) != 0; 35692961ce599ebee4895d2c9720fff7f011e7d4a0cdJason Monk if (!mLockTaskIsLocked && shouldLockKeyguard) { 357062515beee67307d8859beec521b7baedfa54b2b5Jason Monk mWindowManager.lockNow(null); 35717779bf1ce8243d9f856c05db3cc5a37a8227a970Jason Monk mWindowManager.dismissKeyguard(); 3572e069779dea07c77fb858a403c42020e39b3d9c60Jason Monk new LockPatternUtils(mService.mContext) 3573e069779dea07c77fb858a403c42020e39b3d9c60Jason Monk .requireCredentialEntry(UserHandle.USER_ALL); 357462515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 357562515beee67307d8859beec521b7baedfa54b2b5Jason Monk } catch (SettingNotFoundException e) { 357662515beee67307d8859beec521b7baedfa54b2b5Jason Monk // No setting, don't lock. 357762515beee67307d8859beec521b7baedfa54b2b5Jason Monk } 35785286d3ff47135976d66d67888cadca52ef2ab244justinzhang } catch (RemoteException ex) { 35795286d3ff47135976d66d67888cadca52ef2ab244justinzhang throw new RuntimeException(ex); 35805286d3ff47135976d66d67888cadca52ef2ab244justinzhang } 3581b6011c1c2a2452174c7ce973e1867b912996081dCraig Mautner } break; 3582d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner case CONTAINER_CALLBACK_TASK_LIST_EMPTY: { 3583d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner final ActivityContainer container = (ActivityContainer) msg.obj; 3584d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner final IActivityContainerCallback callback = container.mCallback; 3585d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner if (callback != null) { 3586d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner try { 3587d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner callback.onAllActivitiesComplete(container.asBinder()); 3588d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } catch (RemoteException e) { 3589d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } 3590d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } 3591d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } break; 3592d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner case CONTAINER_TASK_LIST_EMPTY_TIMEOUT: { 3593d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3594d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Slog.w(TAG, "Timeout waiting for all activities in task to finish. " + 3595d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner msg.obj); 3596ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner final ActivityContainer container = (ActivityContainer) msg.obj; 3597ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner container.mStack.finishAllActivitiesLocked(true); 3598ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner container.onTaskListEmptyLocked(); 3599d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3600d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } break; 3601bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner case LAUNCH_TASK_BEHIND_COMPLETE: { 3602bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner synchronized (mService) { 3603bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner ActivityRecord r = ActivityRecord.forToken((IBinder) msg.obj); 3604bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner if (r != null) { 3605bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner handleLaunchTaskBehindCompleteLocked(r); 3606bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 3607bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } 3608bb742462781a73bb25516067c8fe6311c1c8a93eCraig Mautner } break; 3609ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3610ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3611ce5f3cba6b95e1fbc800c0fc43d13bb830e87423Craig Mautner } 3612ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3613b081a59a0fdec88dd9b0f68b45c2f625f751d625Ying Wang class ActivityContainer extends android.app.IActivityContainer.Stub { 36147f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner final static int FORCE_NEW_TASK_FLAGS = Intent.FLAG_ACTIVITY_NEW_TASK | 3615e6d80f4ce433e16dc72ea3291801169eb507a695Craig Mautner Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION; 36164a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final int mStackId; 3617f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner IActivityContainerCallback mCallback = null; 36184a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner final ActivityStack mStack; 3619f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityRecord mParentActivity = null; 3620f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner String mIdString; 3621ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3622e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner boolean mVisible = true; 3623e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner 36244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Display this ActivityStack is currently on. Null if not attached to a Display. */ 3625e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay mActivityDisplay; 36264a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3627f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final static int CONTAINER_STATE_HAS_SURFACE = 0; 3628f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final static int CONTAINER_STATE_NO_SURFACE = 1; 3629f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final static int CONTAINER_STATE_FINISHING = 2; 3630f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner int mContainerState = CONTAINER_STATE_HAS_SURFACE; 3631f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3632f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityContainer(int stackId) { 36334a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 36344a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mStackId = stackId; 36354a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mStack = new ActivityStack(this); 3636f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mIdString = "ActivtyContainer{" + mStackId + "}"; 363734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "Creating " + this); 36384a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3639ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 3640ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3641e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner void attachToDisplayLocked(ActivityDisplay activityDisplay) { 364234b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "attachToDisplayLocked: " + this 364334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner + " to display=" + activityDisplay); 3644e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay = activityDisplay; 3645e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mDisplayId = activityDisplay.mDisplayId; 3646e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mStacks = activityDisplay.mStacks; 3647e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner 3648e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner activityDisplay.attachActivities(mStack); 3649df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mWindowManager.attachStack(mStackId, activityDisplay.mDisplayId); 36504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 36514a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 36524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3653ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown public void attachToDisplay(int displayId) { 36544a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner synchronized (mService) { 3655e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 3656e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (activityDisplay == null) { 36574a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return; 36584a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3659e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner attachToDisplayLocked(activityDisplay); 36604a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 36614a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 36624a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 36634a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3664ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown public int getDisplayId() { 3665d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3666d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (mActivityDisplay != null) { 3667d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner return mActivityDisplay.mDisplayId; 3668d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3669e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 3670e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return -1; 36714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 36724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3673ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown @Override 3674ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown public boolean injectEvent(InputEvent event) { 3675ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown final long origId = Binder.clearCallingIdentity(); 3676ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown try { 3677d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3678d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (mActivityDisplay != null) { 3679d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner return mInputManagerInternal.injectInputEvent(event, 3680d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mActivityDisplay.mDisplayId, 3681d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); 3682d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3683ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } 3684ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown return false; 3685ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } finally { 3686ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown Binder.restoreCallingIdentity(origId); 3687ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } 3688ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown } 3689ca9bc702df5c14a89c9b8b0109a05894bf74962eJeff Brown 3690f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 3691f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public void release() { 3692d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3693d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (mContainerState == CONTAINER_STATE_FINISHING) { 3694d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner return; 3695d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3696d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mContainerState = CONTAINER_STATE_FINISHING; 3697d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner 3698d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner final Message msg = 3699d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mHandler.obtainMessage(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this); 3700ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner mHandler.sendMessageDelayed(msg, 2000); 3701d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner 3702d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner long origId = Binder.clearCallingIdentity(); 3703d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner try { 3704ee36c77acd3b92c64e53e19c570e2482382db870Craig Mautner mStack.finishAllActivitiesLocked(false); 37057f13ed37fd2a0533fa7c5e330519decd89fdc1d5Craig Mautner removePendingActivityLaunchesLocked(mStack); 3706d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } finally { 3707d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner Binder.restoreCallingIdentity(origId); 3708d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3709d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 3710f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3711f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 37126025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner protected void detachLocked() { 371334b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.d(TAG, "detachLocked: " + this + " from display=" 371434b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner + mActivityDisplay + " Callers=" + Debug.getCallers(2)); 3715e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mActivityDisplay != null) { 3716e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay.detachActivitiesLocked(mStack); 3717e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mActivityDisplay = null; 3718e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mDisplayId = -1; 3719e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStack.mStacks = null; 3720df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mWindowManager.detachStack(mStackId); 37214a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37224a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37234a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 37244a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3725e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner public final int startActivity(Intent intent) { 3726df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mService.enforceNotIsolatedCaller("ActivityContainer.startActivity"); 3727e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner int userId = mService.handleIncomingUser(Binder.getCallingPid(), 3728409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn Binder.getCallingUid(), mCurrentUser, false, 3729409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null); 3730e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner // TODO: Switch to user app stacks here. 37317f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner intent.addFlags(FORCE_NEW_TASK_FLAGS); 3732e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner String mimeType = intent.getType(); 3733e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (mimeType == null && intent.getData() != null 3734e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner && "content".equals(intent.getData().getScheme())) { 3735e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mimeType = mService.getProviderMimeType(intent.getData(), userId); 3736e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner } 37371b012d302b56b4adf950035136d1d191a1936d5aJeff Hao return startActivityMayWait(null, -1, null, intent, mimeType, null, null, null, null, 0, 37381b012d302b56b4adf950035136d1d191a1936d5aJeff Hao 0, null, null, null, null, userId, this, null); 37394a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37404a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 37414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner @Override 3742df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner public final int startActivityIntentSender(IIntentSender intentSender) { 3743df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender"); 3744df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 3745df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (!(intentSender instanceof PendingIntentRecord)) { 3746df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner throw new IllegalArgumentException("Bad PendingIntent object"); 3747df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 3748df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 3749df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner return ((PendingIntentRecord)intentSender).sendInner(0, null, null, null, null, null, 37507f7bdb2712d4988efa5e914c0b54271752b49407Craig Mautner null, 0, FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this); 3751df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 3752df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 3753247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner private void checkEmbeddedAllowedInner(Intent intent, String resolvedType) { 3754247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner int userId = mService.handleIncomingUser(Binder.getCallingPid(), 3755409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn Binder.getCallingUid(), mCurrentUser, false, 3756409297da182267465adbc21cfb75a23e8d678117Dianne Hackborn ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null); 3757247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner if (resolvedType == null) { 3758247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner resolvedType = intent.getType(); 3759247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner if (resolvedType == null && intent.getData() != null 3760247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner && "content".equals(intent.getData().getScheme())) { 3761247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner resolvedType = mService.getProviderMimeType(intent.getData(), userId); 3762247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3763247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 37641b012d302b56b4adf950035136d1d191a1936d5aJeff Hao ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId); 376505678d5a3136a747a2e7eaccca0ad148c52a2d00Craig Mautner if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) { 3766247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner throw new SecurityException( 3767247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner "Attempt to embed activity that has not set allowEmbedded=\"true\""); 3768247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3769247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3770247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner 3771247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner /** Throw a SecurityException if allowEmbedded is not true */ 3772247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner @Override 3773247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner public final void checkEmbeddedAllowed(Intent intent) { 3774247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner checkEmbeddedAllowedInner(intent, null); 3775247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3776247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner 3777247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner /** Throw a SecurityException if allowEmbedded is not true */ 3778247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner @Override 3779247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner public final void checkEmbeddedAllowedIntentSender(IIntentSender intentSender) { 3780247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner if (!(intentSender instanceof PendingIntentRecord)) { 3781247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner throw new IllegalArgumentException("Bad PendingIntent object"); 3782247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3783247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender; 3784247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner checkEmbeddedAllowedInner(pendingIntent.key.requestIntent, 3785247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner pendingIntent.key.requestResolvedType); 3786247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner } 3787247ab65a4985470feff9cb5b5d40d2b8c64f5adaCraig Mautner 3788df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner @Override 37894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner public IBinder asBinder() { 37904a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return this; 37914a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 37924a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 37934504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner @Override 3794f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public void setSurface(Surface surface, int width, int height, int density) { 3795df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface"); 37964504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 37974504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner 37984a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner ActivityStackSupervisor getOuter() { 37994a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner return ActivityStackSupervisor.this; 38004a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 38014a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3802d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner boolean isAttachedLocked() { 3803e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner return mActivityDisplay != null; 38044a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 38054a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 38064a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner void getBounds(Point outBounds) { 3807d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner synchronized (mService) { 3808d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (mActivityDisplay != null) { 3809d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mActivityDisplay.getBounds(outBounds); 3810d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } else { 3811d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner outBounds.set(0, 0); 3812d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner } 38134a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 3814ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 381534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner 38166985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner // TODO: Make sure every change to ActivityRecord.visible results in a call to this. 3817e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner void setVisible(boolean visible) { 3818e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner if (mVisible != visible) { 3819e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner mVisible = visible; 3820e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner if (mCallback != null) { 3821e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0, 3822e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner 0 /* unused */, this).sendToTarget(); 3823e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3824e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3825e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner } 3826e3a00d745fad479f560e96cec23e957f37d1c043Craig Mautner 38276985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner void setDrawn() { 38286985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 38296985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 38301b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner // You can always start a new task on a regular ActivityStack. 38311b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner boolean isEligibleForNewTasks() { 38321b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner return true; 38331b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner } 38341b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner 3835d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner void onTaskListEmptyLocked() { 3836d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner } 3837d94b47f3b671f5afbc79b061a9b8fa7aa8b22f87Craig Mautner 383834b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner @Override 383934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner public String toString() { 384034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner return mIdString + (mActivityDisplay == null ? "N" : "A"); 384134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 3842ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 3843ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner 3844f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private class VirtualActivityContainer extends ActivityContainer { 3845f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner Surface mSurface; 38466985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner boolean mDrawn = false; 3847f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3848f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) { 3849f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner super(getNextStackId()); 3850f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mParentActivity = parent; 3851f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mCallback = callback; 3852f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mContainerState = CONTAINER_STATE_NO_SURFACE; 3853d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}"; 3854f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3855f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3856f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 3857f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public void setSurface(Surface surface, int width, int height, int density) { 3858f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner super.setSurface(surface, width, height, density); 3859f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3860f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner synchronized (mService) { 3861f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner final long origId = Binder.clearCallingIdentity(); 3862f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner try { 3863f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner setSurfaceLocked(surface, width, height, density); 3864f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } finally { 3865f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner Binder.restoreCallingIdentity(origId); 3866f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3867f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3868f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3869f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3870f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner private void setSurfaceLocked(Surface surface, int width, int height, int density) { 3871f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mContainerState == CONTAINER_STATE_FINISHING) { 3872f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return; 3873f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3874f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner VirtualActivityDisplay virtualActivityDisplay = 3875f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner (VirtualActivityDisplay) mActivityDisplay; 3876f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (virtualActivityDisplay == null) { 3877f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner virtualActivityDisplay = 38786985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner new VirtualActivityDisplay(width, height, density); 3879f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityDisplay = virtualActivityDisplay; 3880f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay); 3881f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner attachToDisplayLocked(virtualActivityDisplay); 3882f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3883f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 3884f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mSurface != null) { 3885f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mSurface.release(); 3886f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3887f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 38886985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner mSurface = surface; 3889f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (surface != null) { 3890f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mStack.resumeTopActivityLocked(null); 3891f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } else { 3892f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mContainerState = CONTAINER_STATE_NO_SURFACE; 38936985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner ((VirtualActivityDisplay) mActivityDisplay).setSurface(null); 3894d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) { 3895a4e102ee580282dc7abeb22f4a025813e53b9431Dianne Hackborn mStack.startPausingLocked(false, true, false, false); 3896d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner } 3897f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 38986985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 3899d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner setSurfaceIfReadyLocked(); 39006985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 3901f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (DEBUG_STACK) Slog.d(TAG, "setSurface: " + this + " to display=" 3902f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner + virtualActivityDisplay); 39036985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 3904f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 39056985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner @Override 3906d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner boolean isAttachedLocked() { 3907d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner return mSurface != null && super.isAttachedLocked(); 3908d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner } 3909d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner 3910d13a5583971a5905ac2ec240282383bde96fc25eCraig Mautner @Override 39116985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner void setDrawn() { 39126985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner synchronized (mService) { 39136985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner mDrawn = true; 3914d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner setSurfaceIfReadyLocked(); 39156985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 39166985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 39176985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner 39181b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner // Never start a new task on an ActivityView if it isn't explicitly specified. 39191b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner @Override 39201b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner boolean isEligibleForNewTasks() { 39211b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner return false; 39221b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner } 39231b4bf857d34dc58a4ef84f5f0761bb7685051fbbCraig Mautner 39246025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner void onTaskListEmptyLocked() { 39256025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner mHandler.removeMessages(CONTAINER_TASK_LIST_EMPTY_TIMEOUT, this); 39266025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner detachLocked(); 39276025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner deleteActivityContainer(this); 39286025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget(); 39296025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner } 39306025770e6b8e19f2fd9f5099ec30f59bc439b48eCraig Mautner 3931d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner private void setSurfaceIfReadyLocked() { 3932d163e751895930a1c8d8d6c3d7e0a37177dbbf19Craig Mautner if (DEBUG_STACK) Slog.v(TAG, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn + 39336985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner " mContainerState=" + mContainerState + " mSurface=" + mSurface); 39346985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) { 39356985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface); 39366985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner mContainerState = CONTAINER_STATE_HAS_SURFACE; 39376985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner } 3938f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3939f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 3940f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 39414a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Exactly one of these classes per Display in the system. Capable of holding zero or more 39424a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner * attached {@link ActivityStack}s */ 3943f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner class ActivityDisplay { 39444a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** Actual Display this object tracks. */ 394534b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner int mDisplayId; 394634b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner Display mDisplay; 394734b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner DisplayInfo mDisplayInfo = new DisplayInfo(); 39484a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 39494a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner /** All of the stacks on this display. Order matters, topmost stack is in front of all other 39504a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner * stacks, bottommost behind. Accessed directly by ActivityManager package classes */ 3951e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner final ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); 39524a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 39534b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima ActivityRecord mVisibleBehindActivity; 3954ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 3955f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner ActivityDisplay() { 3956f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 39574504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner 39581a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner // After instantiation, check that mDisplay is not null before using this. The alternative 39591a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner // is for this to throw an exception if mDisplayManager.getDisplay() returns null. 3960e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner ActivityDisplay(int displayId) { 39611a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner final Display display = mDisplayManager.getDisplay(displayId); 39621a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner if (display == null) { 39631a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner return; 39641a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner } 39651a70a16b64620e416ae8353960c6af6c40274e7aCraig Mautner init(display); 39664504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner } 39674504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner 3968f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner void init(Display display) { 39694504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mDisplay = display; 39704504de5d5a8e1c7dfb306b16282f348856c24764Craig Mautner mDisplayId = display.getDisplayId(); 39714a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplay.getDisplayInfo(mDisplayInfo); 39724a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 39734a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 39744a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner void attachActivities(ActivityStack stack) { 3975e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner if (DEBUG_STACK) Slog.v(TAG, "attachActivities: attaching " + stack + " to displayId=" 3976e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner + mDisplayId); 3977e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStacks.add(stack); 39784a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 39794a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 3980e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner void detachActivitiesLocked(ActivityStack stack) { 398134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner if (DEBUG_STACK) Slog.v(TAG, "detachActivitiesLocked: detaching " + stack 3982e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner + " from displayId=" + mDisplayId); 3983e0a3884cb627efc650e19fbe76b1b3343468cf57Craig Mautner mStacks.remove(stack); 39844a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner } 39854a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner 39864a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner void getBounds(Point bounds) { 39874a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner mDisplay.getDisplayInfo(mDisplayInfo); 39884a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner bounds.x = mDisplayInfo.appWidth; 39894a1cb22056112f7ffd5f4fad8b7a092b96e7cc7bCraig Mautner bounds.y = mDisplayInfo.appHeight; 3990ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 399134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner 39924b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima void setVisibleBehindActivity(ActivityRecord r) { 39934b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima mVisibleBehindActivity = r; 3994ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 3995ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 39964b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima boolean hasVisibleBehindActivity() { 39974b6c6697da5a20c08b2f9f2ca40c94008477e914Jose Lima return mVisibleBehindActivity != null; 3998ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner } 3999ee2e45acbff28986c2ced636b7550d0afbb0eeb7Craig Mautner 400034b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner @Override 400134b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner public String toString() { 4002f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}"; 4003f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4004f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4005f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4006f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner class VirtualActivityDisplay extends ActivityDisplay { 4007f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner VirtualDisplay mVirtualDisplay; 4008f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 40096985badc632f2ff8425aa86423577a96eafc49e9Craig Mautner VirtualActivityDisplay(int width, int height, int density) { 4010f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); 4011c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, null, 4012c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright VIRTUAL_DISPLAY_BASE_NAME, width, height, density, null, 4013c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | 4014c39d47a8e7c74bd539104b0efab898ef6fc43ddfMichael Wright DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, null, null); 4015f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4016f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner init(mVirtualDisplay.getDisplay()); 4017f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4018f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mWindowManager.handleDisplayAdded(mDisplayId); 4019f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4020f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4021f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner void setSurface(Surface surface) { 4022f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mVirtualDisplay != null) { 4023f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay.setSurface(surface); 4024f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4025f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4026f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4027f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 4028f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner void detachActivitiesLocked(ActivityStack stack) { 4029f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner super.detachActivitiesLocked(stack); 4030f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner if (mVirtualDisplay != null) { 4031f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay.release(); 4032f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner mVirtualDisplay = null; 4033f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4034f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner } 4035f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner 4036f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner @Override 4037f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner public String toString() { 4038f4c909bcb87d6f103c9f9e8255fa61bd86f4de67Craig Mautner return "VirtualActivityDisplay={" + mDisplayId + "}"; 403934b73dfaa3a92e5a85abf62317183fb114f2ffffCraig Mautner } 4040ed6649f89f236ea9e665028bd33d6d804b906a92Craig Mautner } 404158e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 404258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima private boolean isLeanbackOnlyDevice() { 404358e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima boolean onLeanbackOnly = false; 404458e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima try { 404558e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima onLeanbackOnly = AppGlobals.getPackageManager().hasSystemFeature( 404658e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima PackageManager.FEATURE_LEANBACK_ONLY); 404758e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima } catch (RemoteException e) { 404858e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima // noop 404958e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima } 405058e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima 405158e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima return onLeanbackOnly; 405258e66d69f9f239a444a90c7ff5eae32557fe350cJose Lima } 4053270843072cff8cd35c517ec6009ccda3ba9668f8Craig Mautner} 4054