1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.am; 18 19 import static android.Manifest.permission.START_ANY_ACTIVITY; 20 import static android.app.ActivityManager.LOCK_TASK_MODE_LOCKED; 21 import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; 22 import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED; 23 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK; 24 import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; 25 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; 26 import static android.content.Intent.FLAG_ACTIVITY_TASK_ON_HOME; 27 import static android.content.pm.ActivityInfo.FLAG_SHOW_FOR_ALL_USERS; 28 import static android.content.pm.PackageManager.PERMISSION_GRANTED; 29 import static com.android.server.am.ActivityManagerDebugConfig.*; 30 import static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG; 31 import static com.android.server.am.ActivityRecord.HOME_ACTIVITY_TYPE; 32 import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE; 33 import static com.android.server.am.ActivityRecord.APPLICATION_ACTIVITY_TYPE; 34 import static com.android.server.am.ActivityStack.ActivityState.*; 35 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK; 36 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE; 37 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; 38 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_PINNABLE; 39 import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED; 40 41 import android.Manifest; 42 import android.app.Activity; 43 import android.app.ActivityManager; 44 import android.app.ActivityManager.StackInfo; 45 import android.app.ActivityOptions; 46 import android.app.AppGlobals; 47 import android.app.AppOpsManager; 48 import android.app.IActivityContainer; 49 import android.app.IActivityContainerCallback; 50 import android.app.IActivityManager; 51 import android.app.IApplicationThread; 52 import android.app.PendingIntent; 53 import android.app.ProfilerInfo; 54 import android.app.ActivityManager.RunningTaskInfo; 55 import android.app.IActivityManager.WaitResult; 56 import android.app.ResultInfo; 57 import android.app.StatusBarManager; 58 import android.app.admin.IDevicePolicyManager; 59 import android.content.ComponentName; 60 import android.content.Context; 61 import android.content.IIntentSender; 62 import android.content.Intent; 63 import android.content.IntentSender; 64 import android.content.pm.ActivityInfo; 65 import android.content.pm.ApplicationInfo; 66 import android.content.pm.PackageInfo; 67 import android.content.pm.PackageManager; 68 import android.content.pm.ResolveInfo; 69 import android.content.res.Configuration; 70 import android.graphics.Point; 71 import android.graphics.Rect; 72 import android.hardware.display.DisplayManager; 73 import android.hardware.display.DisplayManager.DisplayListener; 74 import android.hardware.display.DisplayManagerGlobal; 75 import android.hardware.display.VirtualDisplay; 76 import android.hardware.input.InputManager; 77 import android.hardware.input.InputManagerInternal; 78 import android.net.Uri; 79 import android.os.Binder; 80 import android.os.Bundle; 81 import android.os.Debug; 82 import android.os.Handler; 83 import android.os.IBinder; 84 import android.os.Looper; 85 import android.os.Message; 86 import android.os.ParcelFileDescriptor; 87 import android.os.PowerManager; 88 import android.os.Process; 89 import android.os.RemoteException; 90 import android.os.ServiceManager; 91 import android.os.SystemClock; 92 import android.os.TransactionTooLargeException; 93 import android.os.UserHandle; 94 import android.os.WorkSource; 95 import android.provider.MediaStore; 96 import android.provider.Settings; 97 import android.provider.Settings.SettingNotFoundException; 98 import android.service.voice.IVoiceInteractionSession; 99 import android.util.ArrayMap; 100 import android.util.ArraySet; 101 import android.util.EventLog; 102 import android.util.Slog; 103 import android.util.SparseArray; 104 105 import android.util.SparseIntArray; 106 import android.view.Display; 107 import android.view.DisplayInfo; 108 import android.view.InputEvent; 109 import android.view.Surface; 110 import com.android.internal.app.HeavyWeightSwitcherActivity; 111 import com.android.internal.app.IVoiceInteractor; 112 import com.android.internal.content.ReferrerIntent; 113 import com.android.internal.os.TransferPipe; 114 import com.android.internal.statusbar.IStatusBarService; 115 import com.android.internal.util.ArrayUtils; 116 import com.android.internal.widget.LockPatternUtils; 117 import com.android.server.LocalServices; 118 import com.android.server.am.ActivityStack.ActivityState; 119 import com.android.server.wm.WindowManagerService; 120 121 122 import java.io.FileDescriptor; 123 import java.io.IOException; 124 import java.io.PrintWriter; 125 import java.util.ArrayList; 126 import java.util.Arrays; 127 import java.util.List; 128 import java.util.Set; 129 130 public final class ActivityStackSupervisor implements DisplayListener { 131 private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_AM; 132 private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION; 133 private static final String TAG_CONTAINERS = TAG + POSTFIX_CONTAINERS; 134 private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS; 135 private static final String TAG_IDLE = TAG + POSTFIX_IDLE; 136 private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK; 137 private static final String TAG_PAUSE = TAG + POSTFIX_PAUSE; 138 private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS; 139 private static final String TAG_RELEASE = TAG + POSTFIX_RELEASE; 140 private static final String TAG_RESULTS = TAG + POSTFIX_RESULTS; 141 private static final String TAG_STACK = TAG + POSTFIX_STACK; 142 private static final String TAG_STATES = TAG + POSTFIX_STATES; 143 private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH; 144 private static final String TAG_TASKS = TAG + POSTFIX_TASKS; 145 private static final String TAG_VISIBLE_BEHIND = TAG + POSTFIX_VISIBLE_BEHIND; 146 private static final String TAG_USER_LEAVING = TAG + POSTFIX_USER_LEAVING; 147 148 public static final int HOME_STACK_ID = 0; 149 150 /** How long we wait until giving up on the last activity telling us it is idle. */ 151 static final int IDLE_TIMEOUT = 10 * 1000; 152 153 /** How long we can hold the sleep wake lock before giving up. */ 154 static final int SLEEP_TIMEOUT = 5 * 1000; 155 156 // How long we can hold the launch wake lock before giving up. 157 static final int LAUNCH_TIMEOUT = 10 * 1000; 158 159 static final int IDLE_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG; 160 static final int IDLE_NOW_MSG = FIRST_SUPERVISOR_STACK_MSG + 1; 161 static final int RESUME_TOP_ACTIVITY_MSG = FIRST_SUPERVISOR_STACK_MSG + 2; 162 static final int SLEEP_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 3; 163 static final int LAUNCH_TIMEOUT_MSG = FIRST_SUPERVISOR_STACK_MSG + 4; 164 static final int HANDLE_DISPLAY_ADDED = FIRST_SUPERVISOR_STACK_MSG + 5; 165 static final int HANDLE_DISPLAY_CHANGED = FIRST_SUPERVISOR_STACK_MSG + 6; 166 static final int HANDLE_DISPLAY_REMOVED = FIRST_SUPERVISOR_STACK_MSG + 7; 167 static final int CONTAINER_CALLBACK_VISIBILITY = FIRST_SUPERVISOR_STACK_MSG + 8; 168 static final int LOCK_TASK_START_MSG = FIRST_SUPERVISOR_STACK_MSG + 9; 169 static final int LOCK_TASK_END_MSG = FIRST_SUPERVISOR_STACK_MSG + 10; 170 static final int CONTAINER_CALLBACK_TASK_LIST_EMPTY = FIRST_SUPERVISOR_STACK_MSG + 11; 171 static final int LAUNCH_TASK_BEHIND_COMPLETE = FIRST_SUPERVISOR_STACK_MSG + 12; 172 static final int SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG = FIRST_SUPERVISOR_STACK_MSG + 13; 173 174 private final static String VIRTUAL_DISPLAY_BASE_NAME = "ActivityViewVirtualDisplay"; 175 176 private static final String LOCK_TASK_TAG = "Lock-to-App"; 177 178 // Activity actions an app cannot start if it uses a permission which is not granted. 179 private static final ArrayMap<String, String> ACTION_TO_RUNTIME_PERMISSION = 180 new ArrayMap<>(); 181 static { ACTION_TO_RUNTIME_PERMISSION.put(MediaStore.ACTION_IMAGE_CAPTURE, Manifest.permission.CAMERA)182 ACTION_TO_RUNTIME_PERMISSION.put(MediaStore.ACTION_IMAGE_CAPTURE, 183 Manifest.permission.CAMERA); ACTION_TO_RUNTIME_PERMISSION.put(MediaStore.ACTION_VIDEO_CAPTURE, Manifest.permission.CAMERA)184 ACTION_TO_RUNTIME_PERMISSION.put(MediaStore.ACTION_VIDEO_CAPTURE, 185 Manifest.permission.CAMERA); ACTION_TO_RUNTIME_PERMISSION.put(Intent.ACTION_CALL, Manifest.permission.CALL_PHONE)186 ACTION_TO_RUNTIME_PERMISSION.put(Intent.ACTION_CALL, 187 Manifest.permission.CALL_PHONE); 188 } 189 190 /** Action restriction: launching the activity is not restricted. */ 191 private static final int ACTIVITY_RESTRICTION_NONE = 0; 192 /** Action restriction: launching the activity is restricted by a permission. */ 193 private static final int ACTIVITY_RESTRICTION_PERMISSION = 1; 194 /** Action restriction: launching the activity is restricted by an app op. */ 195 private static final int ACTIVITY_RESTRICTION_APPOP = 2; 196 197 /** Status Bar Service **/ 198 private IBinder mToken = new Binder(); 199 private IStatusBarService mStatusBarService; 200 private IDevicePolicyManager mDevicePolicyManager; 201 202 // For debugging to make sure the caller when acquiring/releasing our 203 // wake lock is the system process. 204 static final boolean VALIDATE_WAKE_LOCK_CALLER = false; 205 206 final ActivityManagerService mService; 207 208 private final RecentTasks mRecentTasks; 209 210 final ActivityStackSupervisorHandler mHandler; 211 212 /** Short cut */ 213 WindowManagerService mWindowManager; 214 DisplayManager mDisplayManager; 215 216 /** Identifier counter for all ActivityStacks */ 217 private int mLastStackId = HOME_STACK_ID; 218 219 /** Task identifier that activities are currently being started in. Incremented each time a 220 * new task is created. */ 221 private int mCurTaskId = 0; 222 223 /** The current user */ 224 private int mCurrentUser; 225 226 /** The stack containing the launcher app. Assumed to always be attached to 227 * Display.DEFAULT_DISPLAY. */ 228 private ActivityStack mHomeStack; 229 230 /** The stack currently receiving input or launching the next activity. */ 231 private ActivityStack mFocusedStack; 232 233 /** If this is the same as mFocusedStack then the activity on the top of the focused stack has 234 * been resumed. If stacks are changing position this will hold the old stack until the new 235 * stack becomes resumed after which it will be set to mFocusedStack. */ 236 private ActivityStack mLastFocusedStack; 237 238 /** List of activities that are waiting for a new activity to become visible before completing 239 * whatever operation they are supposed to do. */ 240 final ArrayList<ActivityRecord> mWaitingVisibleActivities = new ArrayList<>(); 241 242 /** List of processes waiting to find out about the next visible activity. */ 243 final ArrayList<IActivityManager.WaitResult> mWaitingActivityVisible = new ArrayList<>(); 244 245 /** List of processes waiting to find out about the next launched activity. */ 246 final ArrayList<IActivityManager.WaitResult> mWaitingActivityLaunched = new ArrayList<>(); 247 248 /** List of activities that are ready to be stopped, but waiting for the next activity to 249 * settle down before doing so. */ 250 final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<>(); 251 252 /** List of activities that are ready to be finished, but waiting for the previous activity to 253 * settle down before doing so. It contains ActivityRecord objects. */ 254 final ArrayList<ActivityRecord> mFinishingActivities = new ArrayList<>(); 255 256 /** List of activities that are in the process of going to sleep. */ 257 final ArrayList<ActivityRecord> mGoingToSleepActivities = new ArrayList<>(); 258 259 /** Used on user changes */ 260 final ArrayList<UserState> mStartingUsers = new ArrayList<>(); 261 262 /** Used to queue up any background users being started */ 263 final ArrayList<UserState> mStartingBackgroundUsers = new ArrayList<>(); 264 265 /** Set to indicate whether to issue an onUserLeaving callback when a newly launched activity 266 * is being brought in front of us. */ 267 boolean mUserLeaving = false; 268 269 /** Set when we have taken too long waiting to go to sleep. */ 270 boolean mSleepTimeout = false; 271 272 /** Indicates if we are running on a Leanback-only (TV) device. Only initialized after 273 * setWindowManager is called. **/ 274 private boolean mLeanbackOnlyDevice; 275 276 /** 277 * We don't want to allow the device to go to sleep while in the process 278 * of launching an activity. This is primarily to allow alarm intent 279 * receivers to launch an activity and get that to run before the device 280 * goes back to sleep. 281 */ 282 PowerManager.WakeLock mLaunchingActivity; 283 284 /** 285 * Set when the system is going to sleep, until we have 286 * successfully paused the current activity and released our wake lock. 287 * At that point the system is allowed to actually sleep. 288 */ 289 PowerManager.WakeLock mGoingToSleep; 290 291 /** Stack id of the front stack when user switched, indexed by userId. */ 292 SparseIntArray mUserStackInFront = new SparseIntArray(2); 293 294 // TODO: Add listener for removal of references. 295 /** Mapping from (ActivityStack/TaskStack).mStackId to their current state */ 296 private SparseArray<ActivityContainer> mActivityContainers = new SparseArray<>(); 297 298 /** Mapping from displayId to display current state */ 299 private final SparseArray<ActivityDisplay> mActivityDisplays = new SparseArray<>(); 300 301 InputManagerInternal mInputManagerInternal; 302 303 /** The chain of tasks in lockTask mode. The current frontmost task is at the top, and tasks 304 * may be finished until there is only one entry left. If this is empty the system is not 305 * in lockTask mode. */ 306 ArrayList<TaskRecord> mLockTaskModeTasks = new ArrayList<>(); 307 /** Store the current lock task mode. Possible values: 308 * {@link ActivityManager#LOCK_TASK_MODE_NONE}, {@link ActivityManager#LOCK_TASK_MODE_LOCKED}, 309 * {@link ActivityManager#LOCK_TASK_MODE_PINNED} 310 */ 311 private int mLockTaskModeState; 312 /** 313 * Notifies the user when entering/exiting lock-task. 314 */ 315 private LockTaskNotify mLockTaskNotify; 316 317 final ArrayList<PendingActivityLaunch> mPendingActivityLaunches = new ArrayList<>(); 318 319 /** Used to keep resumeTopActivityLocked() from being entered recursively */ 320 boolean inResumeTopActivity; 321 322 /** 323 * Description of a request to start a new activity, which has been held 324 * due to app switches being disabled. 325 */ 326 static class PendingActivityLaunch { 327 final ActivityRecord r; 328 final ActivityRecord sourceRecord; 329 final int startFlags; 330 final ActivityStack stack; 331 PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord, int _startFlags, ActivityStack _stack)332 PendingActivityLaunch(ActivityRecord _r, ActivityRecord _sourceRecord, 333 int _startFlags, ActivityStack _stack) { 334 r = _r; 335 sourceRecord = _sourceRecord; 336 startFlags = _startFlags; 337 stack = _stack; 338 } 339 } 340 ActivityStackSupervisor(ActivityManagerService service, RecentTasks recentTasks)341 public ActivityStackSupervisor(ActivityManagerService service, RecentTasks recentTasks) { 342 mService = service; 343 mRecentTasks = recentTasks; 344 mHandler = new ActivityStackSupervisorHandler(mService.mHandler.getLooper()); 345 } 346 347 /** 348 * At the time when the constructor runs, the power manager has not yet been 349 * initialized. So we initialize our wakelocks afterwards. 350 */ initPowerManagement()351 void initPowerManagement() { 352 PowerManager pm = (PowerManager)mService.mContext.getSystemService(Context.POWER_SERVICE); 353 mGoingToSleep = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ActivityManager-Sleep"); 354 mLaunchingActivity = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*launch*"); 355 mLaunchingActivity.setReferenceCounted(false); 356 } 357 358 // This function returns a IStatusBarService. The value is from ServiceManager. 359 // getService and is cached. getStatusBarService()360 private IStatusBarService getStatusBarService() { 361 synchronized (mService) { 362 if (mStatusBarService == null) { 363 mStatusBarService = IStatusBarService.Stub.asInterface( 364 ServiceManager.checkService(Context.STATUS_BAR_SERVICE)); 365 if (mStatusBarService == null) { 366 Slog.w("StatusBarManager", "warning: no STATUS_BAR_SERVICE"); 367 } 368 } 369 return mStatusBarService; 370 } 371 } 372 getDevicePolicyManager()373 private IDevicePolicyManager getDevicePolicyManager() { 374 synchronized (mService) { 375 if (mDevicePolicyManager == null) { 376 mDevicePolicyManager = IDevicePolicyManager.Stub.asInterface( 377 ServiceManager.checkService(Context.DEVICE_POLICY_SERVICE)); 378 if (mDevicePolicyManager == null) { 379 Slog.w(TAG, "warning: no DEVICE_POLICY_SERVICE"); 380 } 381 } 382 return mDevicePolicyManager; 383 } 384 } 385 setWindowManager(WindowManagerService wm)386 void setWindowManager(WindowManagerService wm) { 387 synchronized (mService) { 388 mWindowManager = wm; 389 390 mDisplayManager = 391 (DisplayManager)mService.mContext.getSystemService(Context.DISPLAY_SERVICE); 392 mDisplayManager.registerDisplayListener(this, null); 393 394 Display[] displays = mDisplayManager.getDisplays(); 395 for (int displayNdx = displays.length - 1; displayNdx >= 0; --displayNdx) { 396 final int displayId = displays[displayNdx].getDisplayId(); 397 ActivityDisplay activityDisplay = new ActivityDisplay(displayId); 398 if (activityDisplay.mDisplay == null) { 399 throw new IllegalStateException("Default Display does not exist"); 400 } 401 mActivityDisplays.put(displayId, activityDisplay); 402 } 403 404 createStackOnDisplay(HOME_STACK_ID, Display.DEFAULT_DISPLAY); 405 mHomeStack = mFocusedStack = mLastFocusedStack = getStack(HOME_STACK_ID); 406 407 mInputManagerInternal = LocalServices.getService(InputManagerInternal.class); 408 409 // Initialize this here, now that we can get a valid reference to PackageManager. 410 mLeanbackOnlyDevice = isLeanbackOnlyDevice(); 411 } 412 } 413 notifyActivityDrawnForKeyguard()414 void notifyActivityDrawnForKeyguard() { 415 if (DEBUG_LOCKSCREEN) mService.logLockScreen(""); 416 mWindowManager.notifyActivityDrawnForKeyguard(); 417 } 418 getFocusedStack()419 ActivityStack getFocusedStack() { 420 return mFocusedStack; 421 } 422 getLastStack()423 ActivityStack getLastStack() { 424 return mLastFocusedStack; 425 } 426 427 /** Top of all visible stacks is/should always be equal to the focused stack. 428 * Use {@link ActivityStack#isStackVisibleLocked} to determine if a specific 429 * stack is visible or not. */ isFrontStack(ActivityStack stack)430 boolean isFrontStack(ActivityStack stack) { 431 if (stack == null) { 432 return false; 433 } 434 435 final ActivityRecord parent = stack.mActivityContainer.mParentActivity; 436 if (parent != null) { 437 stack = parent.task.stack; 438 } 439 return stack == mFocusedStack; 440 } 441 moveHomeStack(boolean toFront, String reason)442 void moveHomeStack(boolean toFront, String reason) { 443 moveHomeStack(toFront, reason, null); 444 } 445 moveHomeStack(boolean toFront, String reason, ActivityStack lastFocusedStack)446 void moveHomeStack(boolean toFront, String reason, ActivityStack lastFocusedStack) { 447 ArrayList<ActivityStack> stacks = mHomeStack.mStacks; 448 final int topNdx = stacks.size() - 1; 449 if (topNdx <= 0) { 450 return; 451 } 452 453 // The home stack should either be at the top or bottom of the stack list. 454 if ((toFront && (stacks.get(topNdx) != mHomeStack)) 455 || (!toFront && (stacks.get(0) != mHomeStack))) { 456 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveHomeTask: topStack old=" 457 + ((lastFocusedStack != null) ? lastFocusedStack : stacks.get(topNdx)) 458 + " new=" + mFocusedStack); 459 stacks.remove(mHomeStack); 460 stacks.add(toFront ? topNdx : 0, mHomeStack); 461 } 462 463 if (lastFocusedStack != null) { 464 mLastFocusedStack = lastFocusedStack; 465 } 466 mFocusedStack = stacks.get(topNdx); 467 468 EventLog.writeEvent(EventLogTags.AM_HOME_STACK_MOVED, 469 mCurrentUser, toFront ? 1 : 0, stacks.get(topNdx).getStackId(), 470 mFocusedStack == null ? -1 : mFocusedStack.getStackId(), reason); 471 472 if (mService.mBooting || !mService.mBooted) { 473 final ActivityRecord r = topRunningActivityLocked(); 474 if (r != null && r.idle) { 475 checkFinishBootingLocked(); 476 } 477 } 478 } 479 480 /** Returns true if the focus activity was adjusted to the home stack top activity. */ moveHomeStackTaskToTop(int homeStackTaskType, String reason)481 boolean moveHomeStackTaskToTop(int homeStackTaskType, String reason) { 482 if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { 483 mWindowManager.showRecentApps(); 484 return false; 485 } 486 487 mHomeStack.moveHomeStackTaskToTop(homeStackTaskType); 488 489 final ActivityRecord top = getHomeActivity(); 490 if (top == null) { 491 return false; 492 } 493 mService.setFocusedActivityLocked(top, reason); 494 return true; 495 } 496 resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev, String reason)497 boolean resumeHomeStackTask(int homeStackTaskType, ActivityRecord prev, String reason) { 498 if (!mService.mBooting && !mService.mBooted) { 499 // Not ready yet! 500 return false; 501 } 502 503 if (homeStackTaskType == RECENTS_ACTIVITY_TYPE) { 504 mWindowManager.showRecentApps(); 505 return false; 506 } 507 508 if (prev != null) { 509 prev.task.setTaskToReturnTo(APPLICATION_ACTIVITY_TYPE); 510 } 511 512 mHomeStack.moveHomeStackTaskToTop(homeStackTaskType); 513 ActivityRecord r = getHomeActivity(); 514 if (r != null) { 515 mService.setFocusedActivityLocked(r, reason); 516 return resumeTopActivitiesLocked(mHomeStack, prev, null); 517 } 518 return mService.startHomeActivityLocked(mCurrentUser, reason); 519 } 520 anyTaskForIdLocked(int id)521 TaskRecord anyTaskForIdLocked(int id) { 522 return anyTaskForIdLocked(id, true); 523 } 524 525 /** 526 * Returns a {@link TaskRecord} for the input id if available. Null otherwise. 527 * @param id Id of the task we would like returned. 528 * @param restoreFromRecents If the id was not in the active list, but was found in recents, 529 * restore the task from recents to the active list. 530 */ anyTaskForIdLocked(int id, boolean restoreFromRecents)531 TaskRecord anyTaskForIdLocked(int id, boolean restoreFromRecents) { 532 int numDisplays = mActivityDisplays.size(); 533 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 534 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 535 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 536 ActivityStack stack = stacks.get(stackNdx); 537 TaskRecord task = stack.taskForIdLocked(id); 538 if (task != null) { 539 return task; 540 } 541 } 542 } 543 544 // Don't give up! Look in recents. 545 if (DEBUG_RECENTS) Slog.v(TAG_RECENTS, "Looking for task id=" + id + " in recents"); 546 TaskRecord task = mRecentTasks.taskForIdLocked(id); 547 if (task == null) { 548 if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "\tDidn't find task id=" + id + " in recents"); 549 return null; 550 } 551 552 if (!restoreFromRecents) { 553 return task; 554 } 555 556 if (!restoreRecentTaskLocked(task)) { 557 if (DEBUG_RECENTS) Slog.w(TAG_RECENTS, 558 "Couldn't restore task id=" + id + " found in recents"); 559 return null; 560 } 561 if (DEBUG_RECENTS) Slog.w(TAG_RECENTS, "Restored task id=" + id + " from in recents"); 562 return task; 563 } 564 isInAnyStackLocked(IBinder token)565 ActivityRecord isInAnyStackLocked(IBinder token) { 566 int numDisplays = mActivityDisplays.size(); 567 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 568 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 569 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 570 final ActivityRecord r = stacks.get(stackNdx).isInStackLocked(token); 571 if (r != null) { 572 return r; 573 } 574 } 575 } 576 return null; 577 } 578 setNextTaskId(int taskId)579 void setNextTaskId(int taskId) { 580 if (taskId > mCurTaskId) { 581 mCurTaskId = taskId; 582 } 583 } 584 getNextTaskId()585 int getNextTaskId() { 586 do { 587 mCurTaskId++; 588 if (mCurTaskId <= 0) { 589 mCurTaskId = 1; 590 } 591 } while (anyTaskForIdLocked(mCurTaskId, false) != null); 592 return mCurTaskId; 593 } 594 resumedAppLocked()595 ActivityRecord resumedAppLocked() { 596 ActivityStack stack = mFocusedStack; 597 if (stack == null) { 598 return null; 599 } 600 ActivityRecord resumedActivity = stack.mResumedActivity; 601 if (resumedActivity == null || resumedActivity.app == null) { 602 resumedActivity = stack.mPausingActivity; 603 if (resumedActivity == null || resumedActivity.app == null) { 604 resumedActivity = stack.topRunningActivityLocked(null); 605 } 606 } 607 return resumedActivity; 608 } 609 attachApplicationLocked(ProcessRecord app)610 boolean attachApplicationLocked(ProcessRecord app) throws RemoteException { 611 final String processName = app.processName; 612 boolean didSomething = false; 613 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 614 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 615 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 616 final ActivityStack stack = stacks.get(stackNdx); 617 if (!isFrontStack(stack)) { 618 continue; 619 } 620 ActivityRecord hr = stack.topRunningActivityLocked(null); 621 if (hr != null) { 622 if (hr.app == null && app.uid == hr.info.applicationInfo.uid 623 && processName.equals(hr.processName)) { 624 try { 625 if (realStartActivityLocked(hr, app, true, true)) { 626 didSomething = true; 627 } 628 } catch (RemoteException e) { 629 Slog.w(TAG, "Exception in new application when starting activity " 630 + hr.intent.getComponent().flattenToShortString(), e); 631 throw e; 632 } 633 } 634 } 635 } 636 } 637 if (!didSomething) { 638 ensureActivitiesVisibleLocked(null, 0); 639 } 640 return didSomething; 641 } 642 allResumedActivitiesIdle()643 boolean allResumedActivitiesIdle() { 644 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 645 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 646 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 647 final ActivityStack stack = stacks.get(stackNdx); 648 if (!isFrontStack(stack) || stack.numActivities() == 0) { 649 continue; 650 } 651 final ActivityRecord resumedActivity = stack.mResumedActivity; 652 if (resumedActivity == null || !resumedActivity.idle) { 653 if (DEBUG_STATES) Slog.d(TAG_STATES, "allResumedActivitiesIdle: stack=" 654 + stack.mStackId + " " + resumedActivity + " not idle"); 655 return false; 656 } 657 } 658 } 659 return true; 660 } 661 allResumedActivitiesComplete()662 boolean allResumedActivitiesComplete() { 663 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 664 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 665 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 666 final ActivityStack stack = stacks.get(stackNdx); 667 if (isFrontStack(stack)) { 668 final ActivityRecord r = stack.mResumedActivity; 669 if (r != null && r.state != RESUMED) { 670 return false; 671 } 672 } 673 } 674 } 675 // TODO: Not sure if this should check if all Paused are complete too. 676 if (DEBUG_STACK) Slog.d(TAG_STACK, 677 "allResumedActivitiesComplete: mLastFocusedStack changing from=" + 678 mLastFocusedStack + " to=" + mFocusedStack); 679 mLastFocusedStack = mFocusedStack; 680 return true; 681 } 682 allResumedActivitiesVisible()683 boolean allResumedActivitiesVisible() { 684 boolean foundResumed = false; 685 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 686 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 687 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 688 final ActivityStack stack = stacks.get(stackNdx); 689 final ActivityRecord r = stack.mResumedActivity; 690 if (r != null) { 691 if (!r.nowVisible || mWaitingVisibleActivities.contains(r)) { 692 return false; 693 } 694 foundResumed = true; 695 } 696 } 697 } 698 return foundResumed; 699 } 700 701 /** 702 * Pause all activities in either all of the stacks or just the back stacks. 703 * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving(). 704 * @return true if any activity was paused as a result of this call. 705 */ pauseBackStacks(boolean userLeaving, boolean resuming, boolean dontWait)706 boolean pauseBackStacks(boolean userLeaving, boolean resuming, boolean dontWait) { 707 boolean someActivityPaused = false; 708 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 709 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 710 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 711 final ActivityStack stack = stacks.get(stackNdx); 712 if (!isFrontStack(stack) && stack.mResumedActivity != null) { 713 if (DEBUG_STATES) Slog.d(TAG_STATES, "pauseBackStacks: stack=" + stack + 714 " mResumedActivity=" + stack.mResumedActivity); 715 someActivityPaused |= stack.startPausingLocked(userLeaving, false, resuming, 716 dontWait); 717 } 718 } 719 } 720 return someActivityPaused; 721 } 722 allPausedActivitiesComplete()723 boolean allPausedActivitiesComplete() { 724 boolean pausing = true; 725 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 726 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 727 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 728 final ActivityStack stack = stacks.get(stackNdx); 729 final ActivityRecord r = stack.mPausingActivity; 730 if (r != null && r.state != PAUSED && r.state != STOPPED && r.state != STOPPING) { 731 if (DEBUG_STATES) { 732 Slog.d(TAG_STATES, 733 "allPausedActivitiesComplete: r=" + r + " state=" + r.state); 734 pausing = false; 735 } else { 736 return false; 737 } 738 } 739 } 740 } 741 return pausing; 742 } 743 pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping, boolean resuming, boolean dontWait)744 void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping, 745 boolean resuming, boolean dontWait) { 746 // TODO: Put all stacks in supervisor and iterate through them instead. 747 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 748 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 749 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 750 final ActivityStack stack = stacks.get(stackNdx); 751 if (stack.mResumedActivity != null && 752 stack.mActivityContainer.mParentActivity == parent) { 753 stack.startPausingLocked(userLeaving, uiSleeping, resuming, dontWait); 754 } 755 } 756 } 757 } 758 reportActivityVisibleLocked(ActivityRecord r)759 void reportActivityVisibleLocked(ActivityRecord r) { 760 sendWaitingVisibleReportLocked(r); 761 } 762 sendWaitingVisibleReportLocked(ActivityRecord r)763 void sendWaitingVisibleReportLocked(ActivityRecord r) { 764 boolean changed = false; 765 for (int i = mWaitingActivityVisible.size()-1; i >= 0; i--) { 766 WaitResult w = mWaitingActivityVisible.get(i); 767 if (w.who == null) { 768 changed = true; 769 w.timeout = false; 770 if (r != null) { 771 w.who = new ComponentName(r.info.packageName, r.info.name); 772 } 773 w.totalTime = SystemClock.uptimeMillis() - w.thisTime; 774 w.thisTime = w.totalTime; 775 } 776 } 777 if (changed) { 778 mService.notifyAll(); 779 } 780 } 781 reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, long thisTime, long totalTime)782 void reportActivityLaunchedLocked(boolean timeout, ActivityRecord r, 783 long thisTime, long totalTime) { 784 boolean changed = false; 785 for (int i = mWaitingActivityLaunched.size() - 1; i >= 0; i--) { 786 WaitResult w = mWaitingActivityLaunched.remove(i); 787 if (w.who == null) { 788 changed = true; 789 w.timeout = timeout; 790 if (r != null) { 791 w.who = new ComponentName(r.info.packageName, r.info.name); 792 } 793 w.thisTime = thisTime; 794 w.totalTime = totalTime; 795 } 796 } 797 if (changed) { 798 mService.notifyAll(); 799 } 800 } 801 topRunningActivityLocked()802 ActivityRecord topRunningActivityLocked() { 803 final ActivityStack focusedStack = mFocusedStack; 804 ActivityRecord r = focusedStack.topRunningActivityLocked(null); 805 if (r != null) { 806 return r; 807 } 808 809 // Return to the home stack. 810 final ArrayList<ActivityStack> stacks = mHomeStack.mStacks; 811 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 812 final ActivityStack stack = stacks.get(stackNdx); 813 if (stack != focusedStack && isFrontStack(stack)) { 814 r = stack.topRunningActivityLocked(null); 815 if (r != null) { 816 return r; 817 } 818 } 819 } 820 return null; 821 } 822 getTasksLocked(int maxNum, List<RunningTaskInfo> list, int callingUid, boolean allowed)823 void getTasksLocked(int maxNum, List<RunningTaskInfo> list, int callingUid, boolean allowed) { 824 // Gather all of the running tasks for each stack into runningTaskLists. 825 ArrayList<ArrayList<RunningTaskInfo>> runningTaskLists = 826 new ArrayList<ArrayList<RunningTaskInfo>>(); 827 final int numDisplays = mActivityDisplays.size(); 828 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 829 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 830 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 831 final ActivityStack stack = stacks.get(stackNdx); 832 ArrayList<RunningTaskInfo> stackTaskList = new ArrayList<>(); 833 runningTaskLists.add(stackTaskList); 834 stack.getTasksLocked(stackTaskList, callingUid, allowed); 835 } 836 } 837 838 // The lists are already sorted from most recent to oldest. Just pull the most recent off 839 // each list and add it to list. Stop when all lists are empty or maxNum reached. 840 while (maxNum > 0) { 841 long mostRecentActiveTime = Long.MIN_VALUE; 842 ArrayList<RunningTaskInfo> selectedStackList = null; 843 final int numTaskLists = runningTaskLists.size(); 844 for (int stackNdx = 0; stackNdx < numTaskLists; ++stackNdx) { 845 ArrayList<RunningTaskInfo> stackTaskList = runningTaskLists.get(stackNdx); 846 if (!stackTaskList.isEmpty()) { 847 final long lastActiveTime = stackTaskList.get(0).lastActiveTime; 848 if (lastActiveTime > mostRecentActiveTime) { 849 mostRecentActiveTime = lastActiveTime; 850 selectedStackList = stackTaskList; 851 } 852 } 853 } 854 if (selectedStackList != null) { 855 list.add(selectedStackList.remove(0)); 856 --maxNum; 857 } else { 858 break; 859 } 860 } 861 } 862 resolveActivity(Intent intent, String resolvedType, int startFlags, ProfilerInfo profilerInfo, int userId)863 ActivityInfo resolveActivity(Intent intent, String resolvedType, int startFlags, 864 ProfilerInfo profilerInfo, int userId) { 865 // Collect information about the target of the Intent. 866 ActivityInfo aInfo; 867 try { 868 ResolveInfo rInfo = 869 AppGlobals.getPackageManager().resolveIntent( 870 intent, resolvedType, 871 PackageManager.MATCH_DEFAULT_ONLY 872 | ActivityManagerService.STOCK_PM_FLAGS, userId); 873 aInfo = rInfo != null ? rInfo.activityInfo : null; 874 } catch (RemoteException e) { 875 aInfo = null; 876 } 877 878 if (aInfo != null) { 879 // Store the found target back into the intent, because now that 880 // we have it we never want to do this again. For example, if the 881 // user navigates back to this point in the history, we should 882 // always restart the exact same activity. 883 intent.setComponent(new ComponentName( 884 aInfo.applicationInfo.packageName, aInfo.name)); 885 886 // Don't debug things in the system process 887 if ((startFlags&ActivityManager.START_FLAG_DEBUG) != 0) { 888 if (!aInfo.processName.equals("system")) { 889 mService.setDebugApp(aInfo.processName, true, false); 890 } 891 } 892 893 if ((startFlags&ActivityManager.START_FLAG_OPENGL_TRACES) != 0) { 894 if (!aInfo.processName.equals("system")) { 895 mService.setOpenGlTraceApp(aInfo.applicationInfo, aInfo.processName); 896 } 897 } 898 899 if (profilerInfo != null) { 900 if (!aInfo.processName.equals("system")) { 901 mService.setProfileApp(aInfo.applicationInfo, aInfo.processName, profilerInfo); 902 } 903 } 904 } 905 return aInfo; 906 } 907 startHomeActivity(Intent intent, ActivityInfo aInfo, String reason)908 void startHomeActivity(Intent intent, ActivityInfo aInfo, String reason) { 909 moveHomeStackTaskToTop(HOME_ACTIVITY_TYPE, reason); 910 startActivityLocked(null /* caller */, intent, null /* resolvedType */, aInfo, 911 null /* voiceSession */, null /* voiceInteractor */, null /* resultTo */, 912 null /* resultWho */, 0 /* requestCode */, 0 /* callingPid */, 0 /* callingUid */, 913 null /* callingPackage */, 0 /* realCallingPid */, 0 /* realCallingUid */, 914 0 /* startFlags */, null /* options */, false /* ignoreTargetSecurity */, 915 false /* componentSpecified */, 916 null /* outActivity */, null /* container */, null /* inTask */); 917 if (inResumeTopActivity) { 918 // If we are in resume section already, home activity will be initialized, but not 919 // resumed (to avoid recursive resume) and will stay that way until something pokes it 920 // again. We need to schedule another resume. 921 scheduleResumeTopActivities(); 922 } 923 } 924 startActivityMayWait(IApplicationThread caller, int callingUid, String callingPackage, Intent intent, String resolvedType, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, WaitResult outResult, Configuration config, Bundle options, boolean ignoreTargetSecurity, int userId, IActivityContainer iContainer, TaskRecord inTask)925 final int startActivityMayWait(IApplicationThread caller, int callingUid, 926 String callingPackage, Intent intent, String resolvedType, 927 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 928 IBinder resultTo, String resultWho, int requestCode, int startFlags, 929 ProfilerInfo profilerInfo, WaitResult outResult, Configuration config, 930 Bundle options, boolean ignoreTargetSecurity, int userId, 931 IActivityContainer iContainer, TaskRecord inTask) { 932 // Refuse possible leaked file descriptors 933 if (intent != null && intent.hasFileDescriptors()) { 934 throw new IllegalArgumentException("File descriptors passed in Intent"); 935 } 936 boolean componentSpecified = intent.getComponent() != null; 937 938 // Don't modify the client's object! 939 intent = new Intent(intent); 940 941 // Collect information about the target of the Intent. 942 ActivityInfo aInfo = 943 resolveActivity(intent, resolvedType, startFlags, profilerInfo, userId); 944 945 ActivityContainer container = (ActivityContainer)iContainer; 946 synchronized (mService) { 947 if (container != null && container.mParentActivity != null && 948 container.mParentActivity.state != RESUMED) { 949 // Cannot start a child activity if the parent is not resumed. 950 return ActivityManager.START_CANCELED; 951 } 952 final int realCallingPid = Binder.getCallingPid(); 953 final int realCallingUid = Binder.getCallingUid(); 954 int callingPid; 955 if (callingUid >= 0) { 956 callingPid = -1; 957 } else if (caller == null) { 958 callingPid = realCallingPid; 959 callingUid = realCallingUid; 960 } else { 961 callingPid = callingUid = -1; 962 } 963 964 final ActivityStack stack; 965 if (container == null || container.mStack.isOnHomeDisplay()) { 966 stack = mFocusedStack; 967 } else { 968 stack = container.mStack; 969 } 970 stack.mConfigWillChange = config != null && mService.mConfiguration.diff(config) != 0; 971 if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, 972 "Starting activity when config will change = " + stack.mConfigWillChange); 973 974 final long origId = Binder.clearCallingIdentity(); 975 976 if (aInfo != null && 977 (aInfo.applicationInfo.privateFlags 978 &ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) { 979 // This may be a heavy-weight process! Check to see if we already 980 // have another, different heavy-weight process running. 981 if (aInfo.processName.equals(aInfo.applicationInfo.packageName)) { 982 if (mService.mHeavyWeightProcess != null && 983 (mService.mHeavyWeightProcess.info.uid != aInfo.applicationInfo.uid || 984 !mService.mHeavyWeightProcess.processName.equals(aInfo.processName))) { 985 int appCallingUid = callingUid; 986 if (caller != null) { 987 ProcessRecord callerApp = mService.getRecordForAppLocked(caller); 988 if (callerApp != null) { 989 appCallingUid = callerApp.info.uid; 990 } else { 991 Slog.w(TAG, "Unable to find app for caller " + caller 992 + " (pid=" + callingPid + ") when starting: " 993 + intent.toString()); 994 ActivityOptions.abort(options); 995 return ActivityManager.START_PERMISSION_DENIED; 996 } 997 } 998 999 IIntentSender target = mService.getIntentSenderLocked( 1000 ActivityManager.INTENT_SENDER_ACTIVITY, "android", 1001 appCallingUid, userId, null, null, 0, new Intent[] { intent }, 1002 new String[] { resolvedType }, PendingIntent.FLAG_CANCEL_CURRENT 1003 | PendingIntent.FLAG_ONE_SHOT, null); 1004 1005 Intent newIntent = new Intent(); 1006 if (requestCode >= 0) { 1007 // Caller is requesting a result. 1008 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_HAS_RESULT, true); 1009 } 1010 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_INTENT, 1011 new IntentSender(target)); 1012 if (mService.mHeavyWeightProcess.activities.size() > 0) { 1013 ActivityRecord hist = mService.mHeavyWeightProcess.activities.get(0); 1014 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_APP, 1015 hist.packageName); 1016 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_CUR_TASK, 1017 hist.task.taskId); 1018 } 1019 newIntent.putExtra(HeavyWeightSwitcherActivity.KEY_NEW_APP, 1020 aInfo.packageName); 1021 newIntent.setFlags(intent.getFlags()); 1022 newIntent.setClassName("android", 1023 HeavyWeightSwitcherActivity.class.getName()); 1024 intent = newIntent; 1025 resolvedType = null; 1026 caller = null; 1027 callingUid = Binder.getCallingUid(); 1028 callingPid = Binder.getCallingPid(); 1029 componentSpecified = true; 1030 try { 1031 ResolveInfo rInfo = 1032 AppGlobals.getPackageManager().resolveIntent( 1033 intent, null, 1034 PackageManager.MATCH_DEFAULT_ONLY 1035 | ActivityManagerService.STOCK_PM_FLAGS, userId); 1036 aInfo = rInfo != null ? rInfo.activityInfo : null; 1037 aInfo = mService.getActivityInfoForUser(aInfo, userId); 1038 } catch (RemoteException e) { 1039 aInfo = null; 1040 } 1041 } 1042 } 1043 } 1044 1045 int res = startActivityLocked(caller, intent, resolvedType, aInfo, 1046 voiceSession, voiceInteractor, resultTo, resultWho, 1047 requestCode, callingPid, callingUid, callingPackage, 1048 realCallingPid, realCallingUid, startFlags, options, ignoreTargetSecurity, 1049 componentSpecified, null, container, inTask); 1050 1051 Binder.restoreCallingIdentity(origId); 1052 1053 if (stack.mConfigWillChange) { 1054 // If the caller also wants to switch to a new configuration, 1055 // do so now. This allows a clean switch, as we are waiting 1056 // for the current activity to pause (so we will not destroy 1057 // it), and have not yet started the next activity. 1058 mService.enforceCallingPermission(android.Manifest.permission.CHANGE_CONFIGURATION, 1059 "updateConfiguration()"); 1060 stack.mConfigWillChange = false; 1061 if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, 1062 "Updating to new configuration after starting activity."); 1063 mService.updateConfigurationLocked(config, null, false, false); 1064 } 1065 1066 if (outResult != null) { 1067 outResult.result = res; 1068 if (res == ActivityManager.START_SUCCESS) { 1069 mWaitingActivityLaunched.add(outResult); 1070 do { 1071 try { 1072 mService.wait(); 1073 } catch (InterruptedException e) { 1074 } 1075 } while (!outResult.timeout && outResult.who == null); 1076 } else if (res == ActivityManager.START_TASK_TO_FRONT) { 1077 ActivityRecord r = stack.topRunningActivityLocked(null); 1078 if (r.nowVisible && r.state == RESUMED) { 1079 outResult.timeout = false; 1080 outResult.who = new ComponentName(r.info.packageName, r.info.name); 1081 outResult.totalTime = 0; 1082 outResult.thisTime = 0; 1083 } else { 1084 outResult.thisTime = SystemClock.uptimeMillis(); 1085 mWaitingActivityVisible.add(outResult); 1086 do { 1087 try { 1088 mService.wait(); 1089 } catch (InterruptedException e) { 1090 } 1091 } while (!outResult.timeout && outResult.who == null); 1092 } 1093 } 1094 } 1095 1096 return res; 1097 } 1098 } 1099 startActivities(IApplicationThread caller, int callingUid, String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle options, int userId)1100 final int startActivities(IApplicationThread caller, int callingUid, String callingPackage, 1101 Intent[] intents, String[] resolvedTypes, IBinder resultTo, 1102 Bundle options, int userId) { 1103 if (intents == null) { 1104 throw new NullPointerException("intents is null"); 1105 } 1106 if (resolvedTypes == null) { 1107 throw new NullPointerException("resolvedTypes is null"); 1108 } 1109 if (intents.length != resolvedTypes.length) { 1110 throw new IllegalArgumentException("intents are length different than resolvedTypes"); 1111 } 1112 1113 1114 int callingPid; 1115 if (callingUid >= 0) { 1116 callingPid = -1; 1117 } else if (caller == null) { 1118 callingPid = Binder.getCallingPid(); 1119 callingUid = Binder.getCallingUid(); 1120 } else { 1121 callingPid = callingUid = -1; 1122 } 1123 final long origId = Binder.clearCallingIdentity(); 1124 try { 1125 synchronized (mService) { 1126 ActivityRecord[] outActivity = new ActivityRecord[1]; 1127 for (int i=0; i<intents.length; i++) { 1128 Intent intent = intents[i]; 1129 if (intent == null) { 1130 continue; 1131 } 1132 1133 // Refuse possible leaked file descriptors 1134 if (intent != null && intent.hasFileDescriptors()) { 1135 throw new IllegalArgumentException("File descriptors passed in Intent"); 1136 } 1137 1138 boolean componentSpecified = intent.getComponent() != null; 1139 1140 // Don't modify the client's object! 1141 intent = new Intent(intent); 1142 1143 // Collect information about the target of the Intent. 1144 ActivityInfo aInfo = resolveActivity(intent, resolvedTypes[i], 0, null, userId); 1145 // TODO: New, check if this is correct 1146 aInfo = mService.getActivityInfoForUser(aInfo, userId); 1147 1148 if (aInfo != null && 1149 (aInfo.applicationInfo.privateFlags 1150 & ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) { 1151 throw new IllegalArgumentException( 1152 "FLAG_CANT_SAVE_STATE not supported here"); 1153 } 1154 1155 Bundle theseOptions; 1156 if (options != null && i == intents.length-1) { 1157 theseOptions = options; 1158 } else { 1159 theseOptions = null; 1160 } 1161 int res = startActivityLocked(caller, intent, resolvedTypes[i], 1162 aInfo, null, null, resultTo, null, -1, callingPid, callingUid, 1163 callingPackage, callingPid, callingUid, 1164 0, theseOptions, false, componentSpecified, outActivity, null, null); 1165 if (res < 0) { 1166 return res; 1167 } 1168 1169 resultTo = outActivity[0] != null ? outActivity[0].appToken : null; 1170 } 1171 } 1172 } finally { 1173 Binder.restoreCallingIdentity(origId); 1174 } 1175 1176 return ActivityManager.START_SUCCESS; 1177 } 1178 realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig)1179 final boolean realStartActivityLocked(ActivityRecord r, 1180 ProcessRecord app, boolean andResume, boolean checkConfig) 1181 throws RemoteException { 1182 1183 if (andResume) { 1184 r.startFreezingScreenLocked(app, 0); 1185 mWindowManager.setAppVisibility(r.appToken, true); 1186 1187 // schedule launch ticks to collect information about slow apps. 1188 r.startLaunchTickingLocked(); 1189 } 1190 1191 // Have the window manager re-evaluate the orientation of 1192 // the screen based on the new activity order. Note that 1193 // as a result of this, it can call back into the activity 1194 // manager with a new orientation. We don't care about that, 1195 // because the activity is not currently running so we are 1196 // just restarting it anyway. 1197 if (checkConfig) { 1198 Configuration config = mWindowManager.updateOrientationFromAppTokens( 1199 mService.mConfiguration, 1200 r.mayFreezeScreenLocked(app) ? r.appToken : null); 1201 mService.updateConfigurationLocked(config, r, false, false); 1202 } 1203 1204 r.app = app; 1205 app.waitingToKill = null; 1206 r.launchCount++; 1207 r.lastLaunchTime = SystemClock.uptimeMillis(); 1208 1209 if (DEBUG_ALL) Slog.v(TAG, "Launching: " + r); 1210 1211 int idx = app.activities.indexOf(r); 1212 if (idx < 0) { 1213 app.activities.add(r); 1214 } 1215 mService.updateLruProcessLocked(app, true, null); 1216 mService.updateOomAdjLocked(); 1217 1218 final TaskRecord task = r.task; 1219 if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE || 1220 task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE_PRIV) { 1221 setLockTaskModeLocked(task, LOCK_TASK_MODE_LOCKED, "mLockTaskAuth==LAUNCHABLE", false); 1222 } 1223 1224 final ActivityStack stack = task.stack; 1225 try { 1226 if (app.thread == null) { 1227 throw new RemoteException(); 1228 } 1229 List<ResultInfo> results = null; 1230 List<ReferrerIntent> newIntents = null; 1231 if (andResume) { 1232 results = r.results; 1233 newIntents = r.newIntents; 1234 } 1235 if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, 1236 "Launching: " + r + " icicle=" + r.icicle + " with results=" + results 1237 + " newIntents=" + newIntents + " andResume=" + andResume); 1238 if (andResume) { 1239 EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY, 1240 r.userId, System.identityHashCode(r), 1241 task.taskId, r.shortComponentName); 1242 } 1243 if (r.isHomeActivity() && r.isNotResolverActivity()) { 1244 // Home process is the root process of the task. 1245 mService.mHomeProcess = task.mActivities.get(0).app; 1246 } 1247 mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName()); 1248 r.sleeping = false; 1249 r.forceNewConfig = false; 1250 mService.showAskCompatModeDialogLocked(r); 1251 r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo); 1252 ProfilerInfo profilerInfo = null; 1253 if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) { 1254 if (mService.mProfileProc == null || mService.mProfileProc == app) { 1255 mService.mProfileProc = app; 1256 final String profileFile = mService.mProfileFile; 1257 if (profileFile != null) { 1258 ParcelFileDescriptor profileFd = mService.mProfileFd; 1259 if (profileFd != null) { 1260 try { 1261 profileFd = profileFd.dup(); 1262 } catch (IOException e) { 1263 if (profileFd != null) { 1264 try { 1265 profileFd.close(); 1266 } catch (IOException o) { 1267 } 1268 profileFd = null; 1269 } 1270 } 1271 } 1272 1273 profilerInfo = new ProfilerInfo(profileFile, profileFd, 1274 mService.mSamplingInterval, mService.mAutoStopProfiler); 1275 } 1276 } 1277 } 1278 1279 if (andResume) { 1280 app.hasShownUi = true; 1281 app.pendingUiClean = true; 1282 } 1283 app.forceProcessStateUpTo(mService.mTopProcessState); 1284 app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, 1285 System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration), 1286 new Configuration(stack.mOverrideConfig), r.compat, r.launchedFromPackage, 1287 task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results, 1288 newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo); 1289 1290 if ((app.info.privateFlags&ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) { 1291 // This may be a heavy-weight process! Note that the package 1292 // manager will ensure that only activity can run in the main 1293 // process of the .apk, which is the only thing that will be 1294 // considered heavy-weight. 1295 if (app.processName.equals(app.info.packageName)) { 1296 if (mService.mHeavyWeightProcess != null 1297 && mService.mHeavyWeightProcess != app) { 1298 Slog.w(TAG, "Starting new heavy weight process " + app 1299 + " when already running " 1300 + mService.mHeavyWeightProcess); 1301 } 1302 mService.mHeavyWeightProcess = app; 1303 Message msg = mService.mHandler.obtainMessage( 1304 ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG); 1305 msg.obj = r; 1306 mService.mHandler.sendMessage(msg); 1307 } 1308 } 1309 1310 } catch (RemoteException e) { 1311 if (r.launchFailed) { 1312 // This is the second time we failed -- finish activity 1313 // and give up. 1314 Slog.e(TAG, "Second failure launching " 1315 + r.intent.getComponent().flattenToShortString() 1316 + ", giving up", e); 1317 mService.appDiedLocked(app); 1318 stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null, 1319 "2nd-crash", false); 1320 return false; 1321 } 1322 1323 // This is the first time we failed -- restart process and 1324 // retry. 1325 app.activities.remove(r); 1326 throw e; 1327 } 1328 1329 r.launchFailed = false; 1330 if (stack.updateLRUListLocked(r)) { 1331 Slog.w(TAG, "Activity " + r 1332 + " being launched, but already in LRU list"); 1333 } 1334 1335 if (andResume) { 1336 // As part of the process of launching, ActivityThread also performs 1337 // a resume. 1338 stack.minimalResumeActivityLocked(r); 1339 } else { 1340 // This activity is not starting in the resumed state... which 1341 // should look like we asked it to pause+stop (but remain visible), 1342 // and it has done so and reported back the current icicle and 1343 // other state. 1344 if (DEBUG_STATES) Slog.v(TAG_STATES, 1345 "Moving to STOPPED: " + r + " (starting in stopped state)"); 1346 r.state = STOPPED; 1347 r.stopped = true; 1348 } 1349 1350 // Launch the new version setup screen if needed. We do this -after- 1351 // launching the initial activity (that is, home), so that it can have 1352 // a chance to initialize itself while in the background, making the 1353 // switch back to it faster and look better. 1354 if (isFrontStack(stack)) { 1355 mService.startSetupActivityLocked(); 1356 } 1357 1358 // Update any services we are bound to that might care about whether 1359 // their client may have activities. 1360 mService.mServices.updateServiceConnectionActivitiesLocked(r.app); 1361 1362 return true; 1363 } 1364 startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig)1365 void startSpecificActivityLocked(ActivityRecord r, 1366 boolean andResume, boolean checkConfig) { 1367 // Is this activity's application already running? 1368 ProcessRecord app = mService.getProcessRecordLocked(r.processName, 1369 r.info.applicationInfo.uid, true); 1370 1371 r.task.stack.setLaunchTime(r); 1372 1373 if (app != null && app.thread != null) { 1374 try { 1375 if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0 1376 || !"android".equals(r.info.packageName)) { 1377 // Don't add this if it is a platform component that is marked 1378 // to run in multiple processes, because this is actually 1379 // part of the framework so doesn't make sense to track as a 1380 // separate apk in the process. 1381 app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode, 1382 mService.mProcessStats); 1383 } 1384 realStartActivityLocked(r, app, andResume, checkConfig); 1385 return; 1386 } catch (RemoteException e) { 1387 Slog.w(TAG, "Exception when starting activity " 1388 + r.intent.getComponent().flattenToShortString(), e); 1389 } 1390 1391 // If a dead object exception was thrown -- fall through to 1392 // restart the application. 1393 } 1394 1395 mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, 1396 "activity", r.intent.getComponent(), false, false, true); 1397 } 1398 startActivityLocked(IApplicationThread caller, Intent intent, String resolvedType, ActivityInfo aInfo, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid, String callingPackage, int realCallingPid, int realCallingUid, int startFlags, Bundle options, boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, ActivityContainer container, TaskRecord inTask)1399 final int startActivityLocked(IApplicationThread caller, 1400 Intent intent, String resolvedType, ActivityInfo aInfo, 1401 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, 1402 IBinder resultTo, String resultWho, int requestCode, 1403 int callingPid, int callingUid, String callingPackage, 1404 int realCallingPid, int realCallingUid, int startFlags, Bundle options, 1405 boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity, 1406 ActivityContainer container, TaskRecord inTask) { 1407 int err = ActivityManager.START_SUCCESS; 1408 1409 ProcessRecord callerApp = null; 1410 if (caller != null) { 1411 callerApp = mService.getRecordForAppLocked(caller); 1412 if (callerApp != null) { 1413 callingPid = callerApp.pid; 1414 callingUid = callerApp.info.uid; 1415 } else { 1416 Slog.w(TAG, "Unable to find app for caller " + caller 1417 + " (pid=" + callingPid + ") when starting: " 1418 + intent.toString()); 1419 err = ActivityManager.START_PERMISSION_DENIED; 1420 } 1421 } 1422 1423 final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0; 1424 1425 if (err == ActivityManager.START_SUCCESS) { 1426 Slog.i(TAG, "START u" + userId + " {" + intent.toShortString(true, true, true, false) 1427 + "} from uid " + callingUid 1428 + " on display " + (container == null ? (mFocusedStack == null ? 1429 Display.DEFAULT_DISPLAY : mFocusedStack.mDisplayId) : 1430 (container.mActivityDisplay == null ? Display.DEFAULT_DISPLAY : 1431 container.mActivityDisplay.mDisplayId))); 1432 } 1433 1434 ActivityRecord sourceRecord = null; 1435 ActivityRecord resultRecord = null; 1436 if (resultTo != null) { 1437 sourceRecord = isInAnyStackLocked(resultTo); 1438 if (DEBUG_RESULTS) Slog.v(TAG_RESULTS, 1439 "Will send result to " + resultTo + " " + sourceRecord); 1440 if (sourceRecord != null) { 1441 if (requestCode >= 0 && !sourceRecord.finishing) { 1442 resultRecord = sourceRecord; 1443 } 1444 } 1445 } 1446 1447 final int launchFlags = intent.getFlags(); 1448 1449 if ((launchFlags & Intent.FLAG_ACTIVITY_FORWARD_RESULT) != 0 && sourceRecord != null) { 1450 // Transfer the result target from the source activity to the new 1451 // one being started, including any failures. 1452 if (requestCode >= 0) { 1453 ActivityOptions.abort(options); 1454 return ActivityManager.START_FORWARD_AND_REQUEST_CONFLICT; 1455 } 1456 resultRecord = sourceRecord.resultTo; 1457 if (resultRecord != null && !resultRecord.isInStackLocked()) { 1458 resultRecord = null; 1459 } 1460 resultWho = sourceRecord.resultWho; 1461 requestCode = sourceRecord.requestCode; 1462 sourceRecord.resultTo = null; 1463 if (resultRecord != null) { 1464 resultRecord.removeResultsLocked(sourceRecord, resultWho, requestCode); 1465 } 1466 if (sourceRecord.launchedFromUid == callingUid) { 1467 // The new activity is being launched from the same uid as the previous 1468 // activity in the flow, and asking to forward its result back to the 1469 // previous. In this case the activity is serving as a trampoline between 1470 // the two, so we also want to update its launchedFromPackage to be the 1471 // same as the previous activity. Note that this is safe, since we know 1472 // these two packages come from the same uid; the caller could just as 1473 // well have supplied that same package name itself. This specifially 1474 // deals with the case of an intent picker/chooser being launched in the app 1475 // flow to redirect to an activity picked by the user, where we want the final 1476 // activity to consider it to have been launched by the previous app activity. 1477 callingPackage = sourceRecord.launchedFromPackage; 1478 } 1479 } 1480 1481 if (err == ActivityManager.START_SUCCESS && intent.getComponent() == null) { 1482 // We couldn't find a class that can handle the given Intent. 1483 // That's the end of that! 1484 err = ActivityManager.START_INTENT_NOT_RESOLVED; 1485 } 1486 1487 if (err == ActivityManager.START_SUCCESS && aInfo == null) { 1488 // We couldn't find the specific class specified in the Intent. 1489 // Also the end of the line. 1490 err = ActivityManager.START_CLASS_NOT_FOUND; 1491 } 1492 1493 if (err == ActivityManager.START_SUCCESS 1494 && !isCurrentProfileLocked(userId) 1495 && (aInfo.flags & FLAG_SHOW_FOR_ALL_USERS) == 0) { 1496 // Trying to launch a background activity that doesn't show for all users. 1497 err = ActivityManager.START_NOT_CURRENT_USER_ACTIVITY; 1498 } 1499 1500 if (err == ActivityManager.START_SUCCESS && sourceRecord != null 1501 && sourceRecord.task.voiceSession != null) { 1502 // If this activity is being launched as part of a voice session, we need 1503 // to ensure that it is safe to do so. If the upcoming activity will also 1504 // be part of the voice session, we can only launch it if it has explicitly 1505 // said it supports the VOICE category, or it is a part of the calling app. 1506 if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 1507 && sourceRecord.info.applicationInfo.uid != aInfo.applicationInfo.uid) { 1508 try { 1509 intent.addCategory(Intent.CATEGORY_VOICE); 1510 if (!AppGlobals.getPackageManager().activitySupportsIntent( 1511 intent.getComponent(), intent, resolvedType)) { 1512 Slog.w(TAG, 1513 "Activity being started in current voice task does not support voice: " 1514 + intent); 1515 err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 1516 } 1517 } catch (RemoteException e) { 1518 Slog.w(TAG, "Failure checking voice capabilities", e); 1519 err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 1520 } 1521 } 1522 } 1523 1524 if (err == ActivityManager.START_SUCCESS && voiceSession != null) { 1525 // If the caller is starting a new voice session, just make sure the target 1526 // is actually allowing it to run this way. 1527 try { 1528 if (!AppGlobals.getPackageManager().activitySupportsIntent(intent.getComponent(), 1529 intent, resolvedType)) { 1530 Slog.w(TAG, 1531 "Activity being started in new voice task does not support: " 1532 + intent); 1533 err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 1534 } 1535 } catch (RemoteException e) { 1536 Slog.w(TAG, "Failure checking voice capabilities", e); 1537 err = ActivityManager.START_NOT_VOICE_COMPATIBLE; 1538 } 1539 } 1540 1541 final ActivityStack resultStack = resultRecord == null ? null : resultRecord.task.stack; 1542 1543 if (err != ActivityManager.START_SUCCESS) { 1544 if (resultRecord != null) { 1545 resultStack.sendActivityResultLocked(-1, 1546 resultRecord, resultWho, requestCode, 1547 Activity.RESULT_CANCELED, null); 1548 } 1549 ActivityOptions.abort(options); 1550 return err; 1551 } 1552 1553 boolean abort = false; 1554 1555 final int startAnyPerm = mService.checkPermission( 1556 START_ANY_ACTIVITY, callingPid, callingUid); 1557 1558 if (startAnyPerm != PERMISSION_GRANTED) { 1559 final int componentRestriction = getComponentRestrictionForCallingPackage( 1560 aInfo, callingPackage, callingPid, callingUid, ignoreTargetSecurity); 1561 final int actionRestriction = getActionRestrictionForCallingPackage( 1562 intent.getAction(), callingPackage, callingPid, callingUid); 1563 1564 if (componentRestriction == ACTIVITY_RESTRICTION_PERMISSION 1565 || actionRestriction == ACTIVITY_RESTRICTION_PERMISSION) { 1566 if (resultRecord != null) { 1567 resultStack.sendActivityResultLocked(-1, 1568 resultRecord, resultWho, requestCode, 1569 Activity.RESULT_CANCELED, null); 1570 } 1571 String msg; 1572 if (actionRestriction == ACTIVITY_RESTRICTION_PERMISSION) { 1573 msg = "Permission Denial: starting " + intent.toString() 1574 + " from " + callerApp + " (pid=" + callingPid 1575 + ", uid=" + callingUid + ")" + " with revoked permission " 1576 + ACTION_TO_RUNTIME_PERMISSION.get(intent.getAction()); 1577 } else if (!aInfo.exported) { 1578 msg = "Permission Denial: starting " + intent.toString() 1579 + " from " + callerApp + " (pid=" + callingPid 1580 + ", uid=" + callingUid + ")" 1581 + " not exported from uid " + aInfo.applicationInfo.uid; 1582 } else { 1583 msg = "Permission Denial: starting " + intent.toString() 1584 + " from " + callerApp + " (pid=" + callingPid 1585 + ", uid=" + callingUid + ")" 1586 + " requires " + aInfo.permission; 1587 } 1588 Slog.w(TAG, msg); 1589 throw new SecurityException(msg); 1590 } 1591 1592 if (actionRestriction == ACTIVITY_RESTRICTION_APPOP) { 1593 String message = "Appop Denial: starting " + intent.toString() 1594 + " from " + callerApp + " (pid=" + callingPid 1595 + ", uid=" + callingUid + ")" 1596 + " requires " + AppOpsManager.permissionToOp( 1597 ACTION_TO_RUNTIME_PERMISSION.get(intent.getAction())); 1598 Slog.w(TAG, message); 1599 abort = true; 1600 } else if (componentRestriction == ACTIVITY_RESTRICTION_APPOP) { 1601 String message = "Appop Denial: starting " + intent.toString() 1602 + " from " + callerApp + " (pid=" + callingPid 1603 + ", uid=" + callingUid + ")" 1604 + " requires appop " + AppOpsManager.permissionToOp(aInfo.permission); 1605 Slog.w(TAG, message); 1606 abort = true; 1607 } 1608 } 1609 1610 abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid, 1611 callingPid, resolvedType, aInfo.applicationInfo); 1612 1613 if (mService.mController != null) { 1614 try { 1615 // The Intent we give to the watcher has the extra data 1616 // stripped off, since it can contain private information. 1617 Intent watchIntent = intent.cloneFilter(); 1618 abort |= !mService.mController.activityStarting(watchIntent, 1619 aInfo.applicationInfo.packageName); 1620 } catch (RemoteException e) { 1621 mService.mController = null; 1622 } 1623 } 1624 1625 if (abort) { 1626 if (resultRecord != null) { 1627 resultStack.sendActivityResultLocked(-1, resultRecord, resultWho, requestCode, 1628 Activity.RESULT_CANCELED, null); 1629 } 1630 // We pretend to the caller that it was really started, but 1631 // they will just get a cancel result. 1632 ActivityOptions.abort(options); 1633 return ActivityManager.START_SUCCESS; 1634 } 1635 1636 ActivityRecord r = new ActivityRecord(mService, callerApp, callingUid, callingPackage, 1637 intent, resolvedType, aInfo, mService.mConfiguration, resultRecord, resultWho, 1638 requestCode, componentSpecified, voiceSession != null, this, container, options); 1639 if (outActivity != null) { 1640 outActivity[0] = r; 1641 } 1642 1643 if (r.appTimeTracker == null && sourceRecord != null) { 1644 // If the caller didn't specify an explicit time tracker, we want to continue 1645 // tracking under any it has. 1646 r.appTimeTracker = sourceRecord.appTimeTracker; 1647 } 1648 1649 final ActivityStack stack = mFocusedStack; 1650 if (voiceSession == null && (stack.mResumedActivity == null 1651 || stack.mResumedActivity.info.applicationInfo.uid != callingUid)) { 1652 if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, 1653 realCallingPid, realCallingUid, "Activity start")) { 1654 PendingActivityLaunch pal = 1655 new PendingActivityLaunch(r, sourceRecord, startFlags, stack); 1656 mPendingActivityLaunches.add(pal); 1657 ActivityOptions.abort(options); 1658 return ActivityManager.START_SWITCHES_CANCELED; 1659 } 1660 } 1661 1662 if (mService.mDidAppSwitch) { 1663 // This is the second allowed switch since we stopped switches, 1664 // so now just generally allow switches. Use case: user presses 1665 // home (switches disabled, switch to home, mDidAppSwitch now true); 1666 // user taps a home icon (coming from home so allowed, we hit here 1667 // and now allow anyone to switch again). 1668 mService.mAppSwitchesAllowedTime = 0; 1669 } else { 1670 mService.mDidAppSwitch = true; 1671 } 1672 1673 doPendingActivityLaunchesLocked(false); 1674 1675 err = startActivityUncheckedLocked(r, sourceRecord, voiceSession, voiceInteractor, 1676 startFlags, true, options, inTask); 1677 1678 if (err < 0) { 1679 // If someone asked to have the keyguard dismissed on the next 1680 // activity start, but we are not actually doing an activity 1681 // switch... just dismiss the keyguard now, because we 1682 // probably want to see whatever is behind it. 1683 notifyActivityDrawnForKeyguard(); 1684 } 1685 return err; 1686 } 1687 getComponentRestrictionForCallingPackage(ActivityInfo activityInfo, String callingPackage, int callingPid, int callingUid, boolean ignoreTargetSecurity)1688 private int getComponentRestrictionForCallingPackage(ActivityInfo activityInfo, 1689 String callingPackage, int callingPid, int callingUid, boolean ignoreTargetSecurity) { 1690 if (!ignoreTargetSecurity && mService.checkComponentPermission(activityInfo.permission, 1691 callingPid, callingUid, activityInfo.applicationInfo.uid, activityInfo.exported) 1692 == PackageManager.PERMISSION_DENIED) { 1693 return ACTIVITY_RESTRICTION_PERMISSION; 1694 } 1695 1696 if (activityInfo.permission == null) { 1697 return ACTIVITY_RESTRICTION_NONE; 1698 } 1699 1700 final int opCode = AppOpsManager.permissionToOpCode(activityInfo.permission); 1701 if (opCode == AppOpsManager.OP_NONE) { 1702 return ACTIVITY_RESTRICTION_NONE; 1703 } 1704 1705 if (mService.mAppOpsService.noteOperation(opCode, callingUid, 1706 callingPackage) != AppOpsManager.MODE_ALLOWED) { 1707 if (!ignoreTargetSecurity) { 1708 return ACTIVITY_RESTRICTION_APPOP; 1709 } 1710 } 1711 1712 return ACTIVITY_RESTRICTION_NONE; 1713 } 1714 getActionRestrictionForCallingPackage(String action, String callingPackage, int callingPid, int callingUid)1715 private int getActionRestrictionForCallingPackage(String action, 1716 String callingPackage, int callingPid, int callingUid) { 1717 if (action == null) { 1718 return ACTIVITY_RESTRICTION_NONE; 1719 } 1720 1721 String permission = ACTION_TO_RUNTIME_PERMISSION.get(action); 1722 if (permission == null) { 1723 return ACTIVITY_RESTRICTION_NONE; 1724 } 1725 1726 final PackageInfo packageInfo; 1727 try { 1728 packageInfo = mService.mContext.getPackageManager() 1729 .getPackageInfo(callingPackage, PackageManager.GET_PERMISSIONS); 1730 } catch (PackageManager.NameNotFoundException e) { 1731 Slog.i(TAG, "Cannot find package info for " + callingPackage); 1732 return ACTIVITY_RESTRICTION_NONE; 1733 } 1734 1735 if (!ArrayUtils.contains(packageInfo.requestedPermissions, permission)) { 1736 return ACTIVITY_RESTRICTION_NONE; 1737 } 1738 1739 if (mService.checkPermission(permission, callingPid, callingUid) == 1740 PackageManager.PERMISSION_DENIED) { 1741 return ACTIVITY_RESTRICTION_PERMISSION; 1742 } 1743 1744 final int opCode = AppOpsManager.permissionToOpCode(permission); 1745 if (opCode == AppOpsManager.OP_NONE) { 1746 return ACTIVITY_RESTRICTION_NONE; 1747 } 1748 1749 if (mService.mAppOpsService.noteOperation(opCode, callingUid, 1750 callingPackage) != AppOpsManager.MODE_ALLOWED) { 1751 return ACTIVITY_RESTRICTION_APPOP; 1752 } 1753 1754 return ACTIVITY_RESTRICTION_NONE; 1755 } 1756 computeStackFocus(ActivityRecord r, boolean newTask)1757 ActivityStack computeStackFocus(ActivityRecord r, boolean newTask) { 1758 final TaskRecord task = r.task; 1759 1760 // On leanback only devices we should keep all activities in the same stack. 1761 if (!mLeanbackOnlyDevice && 1762 (r.isApplicationActivity() || (task != null && task.isApplicationTask()))) { 1763 1764 ActivityStack stack; 1765 1766 if (task != null && task.stack != null) { 1767 stack = task.stack; 1768 if (stack.isOnHomeDisplay()) { 1769 if (mFocusedStack != stack) { 1770 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS, 1771 "computeStackFocus: Setting " + "focused stack to r=" + r 1772 + " task=" + task); 1773 } else { 1774 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS, 1775 "computeStackFocus: Focused stack already=" + mFocusedStack); 1776 } 1777 } 1778 return stack; 1779 } 1780 1781 final ActivityContainer container = r.mInitialActivityContainer; 1782 if (container != null) { 1783 // The first time put it on the desired stack, after this put on task stack. 1784 r.mInitialActivityContainer = null; 1785 return container.mStack; 1786 } 1787 1788 if (mFocusedStack != mHomeStack && (!newTask || 1789 mFocusedStack.mActivityContainer.isEligibleForNewTasks())) { 1790 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS, 1791 "computeStackFocus: Have a focused stack=" + mFocusedStack); 1792 return mFocusedStack; 1793 } 1794 1795 final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks; 1796 for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) { 1797 stack = homeDisplayStacks.get(stackNdx); 1798 if (!stack.isHomeStack()) { 1799 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS, 1800 "computeStackFocus: Setting focused stack=" + stack); 1801 return stack; 1802 } 1803 } 1804 1805 // Need to create an app stack for this user. 1806 stack = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); 1807 if (DEBUG_FOCUS || DEBUG_STACK) Slog.d(TAG_FOCUS, "computeStackFocus: New stack r=" 1808 + r + " stackId=" + stack.mStackId); 1809 return stack; 1810 } 1811 return mHomeStack; 1812 } 1813 setFocusedStack(ActivityRecord r, String reason)1814 boolean setFocusedStack(ActivityRecord r, String reason) { 1815 if (r == null) { 1816 // Not sure what you are trying to do, but it is not going to work... 1817 return false; 1818 } 1819 final TaskRecord task = r.task; 1820 if (task == null || task.stack == null) { 1821 Slog.w(TAG, "Can't set focus stack for r=" + r + " task=" + task); 1822 return false; 1823 } 1824 task.stack.moveToFront(reason); 1825 return true; 1826 } 1827 startActivityUncheckedLocked(final ActivityRecord r, ActivityRecord sourceRecord, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, boolean doResume, Bundle options, TaskRecord inTask)1828 final int startActivityUncheckedLocked(final ActivityRecord r, ActivityRecord sourceRecord, 1829 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor, int startFlags, 1830 boolean doResume, Bundle options, TaskRecord inTask) { 1831 final Intent intent = r.intent; 1832 final int callingUid = r.launchedFromUid; 1833 1834 // In some flows in to this function, we retrieve the task record and hold on to it 1835 // without a lock before calling back in to here... so the task at this point may 1836 // not actually be in recents. Check for that, and if it isn't in recents just 1837 // consider it invalid. 1838 if (inTask != null && !inTask.inRecents) { 1839 Slog.w(TAG, "Starting activity in task not in recents: " + inTask); 1840 inTask = null; 1841 } 1842 1843 final boolean launchSingleTop = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP; 1844 final boolean launchSingleInstance = r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE; 1845 final boolean launchSingleTask = r.launchMode == ActivityInfo.LAUNCH_SINGLE_TASK; 1846 1847 int launchFlags = intent.getFlags(); 1848 if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && 1849 (launchSingleInstance || launchSingleTask)) { 1850 // We have a conflict between the Intent and the Activity manifest, manifest wins. 1851 Slog.i(TAG, "Ignoring FLAG_ACTIVITY_NEW_DOCUMENT, launchMode is " + 1852 "\"singleInstance\" or \"singleTask\""); 1853 launchFlags &= 1854 ~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 1855 } else { 1856 switch (r.info.documentLaunchMode) { 1857 case ActivityInfo.DOCUMENT_LAUNCH_NONE: 1858 break; 1859 case ActivityInfo.DOCUMENT_LAUNCH_INTO_EXISTING: 1860 launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT; 1861 break; 1862 case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS: 1863 launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT; 1864 break; 1865 case ActivityInfo.DOCUMENT_LAUNCH_NEVER: 1866 launchFlags &= ~Intent.FLAG_ACTIVITY_MULTIPLE_TASK; 1867 break; 1868 } 1869 } 1870 1871 final boolean launchTaskBehind = r.mLaunchTaskBehind 1872 && !launchSingleTask && !launchSingleInstance 1873 && (launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0; 1874 1875 if (r.resultTo != null && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 1876 && r.resultTo.task.stack != null) { 1877 // For whatever reason this activity is being launched into a new 1878 // task... yet the caller has requested a result back. Well, that 1879 // is pretty messed up, so instead immediately send back a cancel 1880 // and let the new task continue launched as normal without a 1881 // dependency on its originator. 1882 Slog.w(TAG, "Activity is launching as a new task, so cancelling activity result."); 1883 r.resultTo.task.stack.sendActivityResultLocked(-1, 1884 r.resultTo, r.resultWho, r.requestCode, 1885 Activity.RESULT_CANCELED, null); 1886 r.resultTo = null; 1887 } 1888 1889 if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 && r.resultTo == null) { 1890 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1891 } 1892 1893 // If we are actually going to launch in to a new task, there are some cases where 1894 // we further want to do multiple task. 1895 if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1896 if (launchTaskBehind 1897 || r.info.documentLaunchMode == ActivityInfo.DOCUMENT_LAUNCH_ALWAYS) { 1898 launchFlags |= Intent.FLAG_ACTIVITY_MULTIPLE_TASK; 1899 } 1900 } 1901 1902 // We'll invoke onUserLeaving before onPause only if the launching 1903 // activity did not explicitly state that this is an automated launch. 1904 mUserLeaving = (launchFlags & Intent.FLAG_ACTIVITY_NO_USER_ACTION) == 0; 1905 if (DEBUG_USER_LEAVING) Slog.v(TAG_USER_LEAVING, 1906 "startActivity() => mUserLeaving=" + mUserLeaving); 1907 1908 // If the caller has asked not to resume at this point, we make note 1909 // of this in the record so that we can skip it when trying to find 1910 // the top running activity. 1911 if (!doResume) { 1912 r.delayedResume = true; 1913 } 1914 1915 ActivityRecord notTop = 1916 (launchFlags & Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null; 1917 1918 // If the onlyIfNeeded flag is set, then we can do this if the activity 1919 // being launched is the same as the one making the call... or, as 1920 // a special case, if we do not know the caller then we count the 1921 // current top activity as the caller. 1922 if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 1923 ActivityRecord checkedCaller = sourceRecord; 1924 if (checkedCaller == null) { 1925 checkedCaller = mFocusedStack.topRunningNonDelayedActivityLocked(notTop); 1926 } 1927 if (!checkedCaller.realActivity.equals(r.realActivity)) { 1928 // Caller is not the same as launcher, so always needed. 1929 startFlags &= ~ActivityManager.START_FLAG_ONLY_IF_NEEDED; 1930 } 1931 } 1932 1933 boolean addingToTask = false; 1934 TaskRecord reuseTask = null; 1935 1936 // If the caller is not coming from another activity, but has given us an 1937 // explicit task into which they would like us to launch the new activity, 1938 // then let's see about doing that. 1939 if (sourceRecord == null && inTask != null && inTask.stack != null) { 1940 final Intent baseIntent = inTask.getBaseIntent(); 1941 final ActivityRecord root = inTask.getRootActivity(); 1942 if (baseIntent == null) { 1943 ActivityOptions.abort(options); 1944 throw new IllegalArgumentException("Launching into task without base intent: " 1945 + inTask); 1946 } 1947 1948 // If this task is empty, then we are adding the first activity -- it 1949 // determines the root, and must be launching as a NEW_TASK. 1950 if (launchSingleInstance || launchSingleTask) { 1951 if (!baseIntent.getComponent().equals(r.intent.getComponent())) { 1952 ActivityOptions.abort(options); 1953 throw new IllegalArgumentException("Trying to launch singleInstance/Task " 1954 + r + " into different task " + inTask); 1955 } 1956 if (root != null) { 1957 ActivityOptions.abort(options); 1958 throw new IllegalArgumentException("Caller with inTask " + inTask 1959 + " has root " + root + " but target is singleInstance/Task"); 1960 } 1961 } 1962 1963 // If task is empty, then adopt the interesting intent launch flags in to the 1964 // activity being started. 1965 if (root == null) { 1966 final int flagsOfInterest = Intent.FLAG_ACTIVITY_NEW_TASK 1967 | Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NEW_DOCUMENT 1968 | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS; 1969 launchFlags = (launchFlags&~flagsOfInterest) 1970 | (baseIntent.getFlags()&flagsOfInterest); 1971 intent.setFlags(launchFlags); 1972 inTask.setIntent(r); 1973 addingToTask = true; 1974 1975 // If the task is not empty and the caller is asking to start it as the root 1976 // of a new task, then we don't actually want to start this on the task. We 1977 // will bring the task to the front, and possibly give it a new intent. 1978 } else if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 1979 addingToTask = false; 1980 1981 } else { 1982 addingToTask = true; 1983 } 1984 1985 reuseTask = inTask; 1986 } else { 1987 inTask = null; 1988 } 1989 1990 if (inTask == null) { 1991 if (sourceRecord == null) { 1992 // This activity is not being started from another... in this 1993 // case we -always- start a new task. 1994 if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0 && inTask == null) { 1995 Slog.w(TAG, "startActivity called from non-Activity context; forcing " + 1996 "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 1997 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 1998 } 1999 } else if (sourceRecord.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) { 2000 // The original activity who is starting us is running as a single 2001 // instance... this new activity it is starting must go on its 2002 // own task. 2003 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 2004 } else if (launchSingleInstance || launchSingleTask) { 2005 // The activity being started is a single instance... it always 2006 // gets launched into its own task. 2007 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 2008 } 2009 } 2010 2011 ActivityInfo newTaskInfo = null; 2012 Intent newTaskIntent = null; 2013 ActivityStack sourceStack; 2014 if (sourceRecord != null) { 2015 if (sourceRecord.finishing) { 2016 // If the source is finishing, we can't further count it as our source. This 2017 // is because the task it is associated with may now be empty and on its way out, 2018 // so we don't want to blindly throw it in to that task. Instead we will take 2019 // the NEW_TASK flow and try to find a task for it. But save the task information 2020 // so it can be used when creating the new task. 2021 if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) == 0) { 2022 Slog.w(TAG, "startActivity called from finishing " + sourceRecord 2023 + "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + intent); 2024 launchFlags |= Intent.FLAG_ACTIVITY_NEW_TASK; 2025 newTaskInfo = sourceRecord.info; 2026 newTaskIntent = sourceRecord.task.intent; 2027 } 2028 sourceRecord = null; 2029 sourceStack = null; 2030 } else { 2031 sourceStack = sourceRecord.task.stack; 2032 } 2033 } else { 2034 sourceStack = null; 2035 } 2036 2037 boolean movedHome = false; 2038 ActivityStack targetStack; 2039 2040 intent.setFlags(launchFlags); 2041 final boolean noAnimation = (launchFlags & Intent.FLAG_ACTIVITY_NO_ANIMATION) != 0; 2042 2043 // We may want to try to place the new activity in to an existing task. We always 2044 // do this if the target activity is singleTask or singleInstance; we will also do 2045 // this if NEW_TASK has been requested, and there is not an additional qualifier telling 2046 // us to still place it in a new task: multi task, always doc mode, or being asked to 2047 // launch this as a new task behind the current one. 2048 if (((launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0 && 2049 (launchFlags & Intent.FLAG_ACTIVITY_MULTIPLE_TASK) == 0) 2050 || launchSingleInstance || launchSingleTask) { 2051 // If bring to front is requested, and no result is requested and we have not 2052 // been given an explicit task to launch in to, and 2053 // we can find a task that was started with this same 2054 // component, then instead of launching bring that one to the front. 2055 if (inTask == null && r.resultTo == null) { 2056 // See if there is a task to bring to the front. If this is 2057 // a SINGLE_INSTANCE activity, there can be one and only one 2058 // instance of it in the history, and it is always in its own 2059 // unique task, so we do a special search. 2060 ActivityRecord intentActivity = !launchSingleInstance ? 2061 findTaskLocked(r) : findActivityLocked(intent, r.info); 2062 if (intentActivity != null) { 2063 // When the flags NEW_TASK and CLEAR_TASK are set, then the task gets reused 2064 // but still needs to be a lock task mode violation since the task gets 2065 // cleared out and the device would otherwise leave the locked task. 2066 if (isLockTaskModeViolation(intentActivity.task, 2067 (launchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) 2068 == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))) { 2069 showLockTaskToast(); 2070 Slog.e(TAG, "startActivityUnchecked: Attempt to violate Lock Task Mode"); 2071 return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 2072 } 2073 if (r.task == null) { 2074 r.task = intentActivity.task; 2075 } 2076 if (intentActivity.task.intent == null) { 2077 // This task was started because of movement of 2078 // the activity based on affinity... now that we 2079 // are actually launching it, we can assign the 2080 // base intent. 2081 intentActivity.task.setIntent(r); 2082 } 2083 targetStack = intentActivity.task.stack; 2084 targetStack.mLastPausedActivity = null; 2085 // If the target task is not in the front, then we need 2086 // to bring it to the front... except... well, with 2087 // SINGLE_TASK_LAUNCH it's not entirely clear. We'd like 2088 // to have the same behavior as if a new instance was 2089 // being started, which means not bringing it to the front 2090 // if the caller is not itself in the front. 2091 final ActivityStack focusStack = getFocusedStack(); 2092 ActivityRecord curTop = (focusStack == null) 2093 ? null : focusStack.topRunningNonDelayedActivityLocked(notTop); 2094 boolean movedToFront = false; 2095 if (curTop != null && (curTop.task != intentActivity.task || 2096 curTop.task != focusStack.topTask())) { 2097 r.intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT); 2098 if (sourceRecord == null || (sourceStack.topActivity() != null && 2099 sourceStack.topActivity().task == sourceRecord.task)) { 2100 // We really do want to push this one into the user's face, right now. 2101 if (launchTaskBehind && sourceRecord != null) { 2102 intentActivity.setTaskToAffiliateWith(sourceRecord.task); 2103 } 2104 movedHome = true; 2105 targetStack.moveTaskToFrontLocked(intentActivity.task, noAnimation, 2106 options, r.appTimeTracker, "bringingFoundTaskToFront"); 2107 movedToFront = true; 2108 if ((launchFlags & 2109 (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) 2110 == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { 2111 // Caller wants to appear on home activity. 2112 intentActivity.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 2113 } 2114 options = null; 2115 } 2116 } 2117 if (!movedToFront) { 2118 if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Bring to front target: " + targetStack 2119 + " from " + intentActivity); 2120 targetStack.moveToFront("intentActivityFound"); 2121 } 2122 2123 // If the caller has requested that the target task be 2124 // reset, then do so. 2125 if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) != 0) { 2126 intentActivity = targetStack.resetTaskIfNeededLocked(intentActivity, r); 2127 } 2128 if ((startFlags & ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 2129 // We don't need to start a new activity, and 2130 // the client said not to do anything if that 2131 // is the case, so this is it! And for paranoia, make 2132 // sure we have correctly resumed the top activity. 2133 if (doResume) { 2134 resumeTopActivitiesLocked(targetStack, null, options); 2135 2136 // Make sure to notify Keyguard as well if we are not running an app 2137 // transition later. 2138 if (!movedToFront) { 2139 notifyActivityDrawnForKeyguard(); 2140 } 2141 } else { 2142 ActivityOptions.abort(options); 2143 } 2144 return ActivityManager.START_RETURN_INTENT_TO_CALLER; 2145 } 2146 if ((launchFlags & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) 2147 == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK)) { 2148 // The caller has requested to completely replace any 2149 // existing task with its new activity. Well that should 2150 // not be too hard... 2151 reuseTask = intentActivity.task; 2152 reuseTask.performClearTaskLocked(); 2153 reuseTask.setIntent(r); 2154 } else if ((launchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0 2155 || launchSingleInstance || launchSingleTask) { 2156 // In this situation we want to remove all activities 2157 // from the task up to the one being started. In most 2158 // cases this means we are resetting the task to its 2159 // initial state. 2160 ActivityRecord top = 2161 intentActivity.task.performClearTaskLocked(r, launchFlags); 2162 if (top != null) { 2163 if (top.frontOfTask) { 2164 // Activity aliases may mean we use different 2165 // intents for the top activity, so make sure 2166 // the task now has the identity of the new 2167 // intent. 2168 top.task.setIntent(r); 2169 } 2170 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, 2171 r, top.task); 2172 top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 2173 } else { 2174 // A special case: we need to start the activity because it is not 2175 // currently running, and the caller has asked to clear the current 2176 // task to have this activity at the top. 2177 addingToTask = true; 2178 // Now pretend like this activity is being started by the top of its 2179 // task, so it is put in the right place. 2180 sourceRecord = intentActivity; 2181 TaskRecord task = sourceRecord.task; 2182 if (task != null && task.stack == null) { 2183 // Target stack got cleared when we all activities were removed 2184 // above. Go ahead and reset it. 2185 targetStack = computeStackFocus(sourceRecord, false /* newTask */); 2186 targetStack.addTask( 2187 task, !launchTaskBehind /* toTop */, false /* moving */); 2188 } 2189 2190 } 2191 } else if (r.realActivity.equals(intentActivity.task.realActivity)) { 2192 // In this case the top activity on the task is the 2193 // same as the one being launched, so we take that 2194 // as a request to bring the task to the foreground. 2195 // If the top activity in the task is the root 2196 // activity, deliver this new intent to it if it 2197 // desires. 2198 if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 || launchSingleTop) 2199 && intentActivity.realActivity.equals(r.realActivity)) { 2200 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, 2201 intentActivity.task); 2202 if (intentActivity.frontOfTask) { 2203 intentActivity.task.setIntent(r); 2204 } 2205 intentActivity.deliverNewIntentLocked(callingUid, r.intent, 2206 r.launchedFromPackage); 2207 } else if (!r.intent.filterEquals(intentActivity.task.intent)) { 2208 // In this case we are launching the root activity 2209 // of the task, but with a different intent. We 2210 // should start a new instance on top. 2211 addingToTask = true; 2212 sourceRecord = intentActivity; 2213 } 2214 } else if ((launchFlags&Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED) == 0) { 2215 // In this case an activity is being launched in to an 2216 // existing task, without resetting that task. This 2217 // is typically the situation of launching an activity 2218 // from a notification or shortcut. We want to place 2219 // the new activity on top of the current task. 2220 addingToTask = true; 2221 sourceRecord = intentActivity; 2222 } else if (!intentActivity.task.rootWasReset) { 2223 // In this case we are launching in to an existing task 2224 // that has not yet been started from its front door. 2225 // The current task has been brought to the front. 2226 // Ideally, we'd probably like to place this new task 2227 // at the bottom of its stack, but that's a little hard 2228 // to do with the current organization of the code so 2229 // for now we'll just drop it. 2230 intentActivity.task.setIntent(r); 2231 } 2232 if (!addingToTask && reuseTask == null) { 2233 // We didn't do anything... but it was needed (a.k.a., client 2234 // don't use that intent!) And for paranoia, make 2235 // sure we have correctly resumed the top activity. 2236 if (doResume) { 2237 targetStack.resumeTopActivityLocked(null, options); 2238 if (!movedToFront) { 2239 // Make sure to notify Keyguard as well if we are not running an app 2240 // transition later. 2241 notifyActivityDrawnForKeyguard(); 2242 } 2243 } else { 2244 ActivityOptions.abort(options); 2245 } 2246 return ActivityManager.START_TASK_TO_FRONT; 2247 } 2248 } 2249 } 2250 } 2251 2252 //String uri = r.intent.toURI(); 2253 //Intent intent2 = new Intent(uri); 2254 //Slog.i(TAG, "Given intent: " + r.intent); 2255 //Slog.i(TAG, "URI is: " + uri); 2256 //Slog.i(TAG, "To intent: " + intent2); 2257 2258 if (r.packageName != null) { 2259 // If the activity being launched is the same as the one currently 2260 // at the top, then we need to check if it should only be launched 2261 // once. 2262 ActivityStack topStack = mFocusedStack; 2263 ActivityRecord top = topStack.topRunningNonDelayedActivityLocked(notTop); 2264 if (top != null && r.resultTo == null) { 2265 if (top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 2266 if (top.app != null && top.app.thread != null) { 2267 if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 2268 || launchSingleTop || launchSingleTask) { 2269 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, 2270 top.task); 2271 // For paranoia, make sure we have correctly 2272 // resumed the top activity. 2273 topStack.mLastPausedActivity = null; 2274 if (doResume) { 2275 resumeTopActivitiesLocked(); 2276 } 2277 ActivityOptions.abort(options); 2278 if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 2279 // We don't need to start a new activity, and 2280 // the client said not to do anything if that 2281 // is the case, so this is it! 2282 return ActivityManager.START_RETURN_INTENT_TO_CALLER; 2283 } 2284 top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 2285 return ActivityManager.START_DELIVERED_TO_TOP; 2286 } 2287 } 2288 } 2289 } 2290 2291 } else { 2292 if (r.resultTo != null && r.resultTo.task.stack != null) { 2293 r.resultTo.task.stack.sendActivityResultLocked(-1, r.resultTo, r.resultWho, 2294 r.requestCode, Activity.RESULT_CANCELED, null); 2295 } 2296 ActivityOptions.abort(options); 2297 return ActivityManager.START_CLASS_NOT_FOUND; 2298 } 2299 2300 boolean newTask = false; 2301 boolean keepCurTransition = false; 2302 2303 TaskRecord taskToAffiliate = launchTaskBehind && sourceRecord != null ? 2304 sourceRecord.task : null; 2305 2306 // Should this be considered a new task? 2307 if (r.resultTo == null && inTask == null && !addingToTask 2308 && (launchFlags & Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 2309 newTask = true; 2310 targetStack = computeStackFocus(r, newTask); 2311 targetStack.moveToFront("startingNewTask"); 2312 2313 if (reuseTask == null) { 2314 r.setTask(targetStack.createTaskRecord(getNextTaskId(), 2315 newTaskInfo != null ? newTaskInfo : r.info, 2316 newTaskIntent != null ? newTaskIntent : intent, 2317 voiceSession, voiceInteractor, !launchTaskBehind /* toTop */), 2318 taskToAffiliate); 2319 if (DEBUG_TASKS) Slog.v(TAG_TASKS, 2320 "Starting new activity " + r + " in new task " + r.task); 2321 } else { 2322 r.setTask(reuseTask, taskToAffiliate); 2323 } 2324 if (isLockTaskModeViolation(r.task)) { 2325 Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 2326 return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 2327 } 2328 if (!movedHome) { 2329 if ((launchFlags & 2330 (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) 2331 == (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_TASK_ON_HOME)) { 2332 // Caller wants to appear on home activity, so before starting 2333 // their own activity we will bring home to the front. 2334 r.task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 2335 } 2336 } 2337 } else if (sourceRecord != null) { 2338 final TaskRecord sourceTask = sourceRecord.task; 2339 if (isLockTaskModeViolation(sourceTask)) { 2340 Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 2341 return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 2342 } 2343 targetStack = sourceTask.stack; 2344 targetStack.moveToFront("sourceStackToFront"); 2345 final TaskRecord topTask = targetStack.topTask(); 2346 if (topTask != sourceTask) { 2347 targetStack.moveTaskToFrontLocked(sourceTask, noAnimation, options, 2348 r.appTimeTracker, "sourceTaskToFront"); 2349 } 2350 if (!addingToTask && (launchFlags&Intent.FLAG_ACTIVITY_CLEAR_TOP) != 0) { 2351 // In this case, we are adding the activity to an existing 2352 // task, but the caller has asked to clear that task if the 2353 // activity is already running. 2354 ActivityRecord top = sourceTask.performClearTaskLocked(r, launchFlags); 2355 keepCurTransition = true; 2356 if (top != null) { 2357 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, top.task); 2358 top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 2359 // For paranoia, make sure we have correctly 2360 // resumed the top activity. 2361 targetStack.mLastPausedActivity = null; 2362 if (doResume) { 2363 targetStack.resumeTopActivityLocked(null); 2364 } 2365 ActivityOptions.abort(options); 2366 return ActivityManager.START_DELIVERED_TO_TOP; 2367 } 2368 } else if (!addingToTask && 2369 (launchFlags&Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) != 0) { 2370 // In this case, we are launching an activity in our own task 2371 // that may already be running somewhere in the history, and 2372 // we want to shuffle it to the front of the stack if so. 2373 final ActivityRecord top = sourceTask.findActivityInHistoryLocked(r); 2374 if (top != null) { 2375 final TaskRecord task = top.task; 2376 task.moveActivityToFrontLocked(top); 2377 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, r, task); 2378 top.updateOptionsLocked(options); 2379 top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 2380 targetStack.mLastPausedActivity = null; 2381 if (doResume) { 2382 targetStack.resumeTopActivityLocked(null); 2383 } 2384 return ActivityManager.START_DELIVERED_TO_TOP; 2385 } 2386 } 2387 // An existing activity is starting this new activity, so we want 2388 // to keep the new one in the same task as the one that is starting 2389 // it. 2390 r.setTask(sourceTask, null); 2391 if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + r 2392 + " in existing task " + r.task + " from source " + sourceRecord); 2393 2394 } else if (inTask != null) { 2395 // The caller is asking that the new activity be started in an explicit 2396 // task it has provided to us. 2397 if (isLockTaskModeViolation(inTask)) { 2398 Slog.e(TAG, "Attempted Lock Task Mode violation r=" + r); 2399 return ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION; 2400 } 2401 targetStack = inTask.stack; 2402 targetStack.moveTaskToFrontLocked(inTask, noAnimation, options, r.appTimeTracker, 2403 "inTaskToFront"); 2404 2405 // Check whether we should actually launch the new activity in to the task, 2406 // or just reuse the current activity on top. 2407 ActivityRecord top = inTask.getTopActivity(); 2408 if (top != null && top.realActivity.equals(r.realActivity) && top.userId == r.userId) { 2409 if ((launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0 2410 || launchSingleTop || launchSingleTask) { 2411 ActivityStack.logStartActivity(EventLogTags.AM_NEW_INTENT, top, top.task); 2412 if ((startFlags&ActivityManager.START_FLAG_ONLY_IF_NEEDED) != 0) { 2413 // We don't need to start a new activity, and 2414 // the client said not to do anything if that 2415 // is the case, so this is it! 2416 return ActivityManager.START_RETURN_INTENT_TO_CALLER; 2417 } 2418 top.deliverNewIntentLocked(callingUid, r.intent, r.launchedFromPackage); 2419 return ActivityManager.START_DELIVERED_TO_TOP; 2420 } 2421 } 2422 2423 if (!addingToTask) { 2424 // We don't actually want to have this activity added to the task, so just 2425 // stop here but still tell the caller that we consumed the intent. 2426 ActivityOptions.abort(options); 2427 return ActivityManager.START_TASK_TO_FRONT; 2428 } 2429 2430 r.setTask(inTask, null); 2431 if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + r 2432 + " in explicit task " + r.task); 2433 2434 } else { 2435 // This not being started from an existing activity, and not part 2436 // of a new task... just put it in the top task, though these days 2437 // this case should never happen. 2438 targetStack = computeStackFocus(r, newTask); 2439 targetStack.moveToFront("addingToTopTask"); 2440 ActivityRecord prev = targetStack.topActivity(); 2441 r.setTask(prev != null ? prev.task : targetStack.createTaskRecord(getNextTaskId(), 2442 r.info, intent, null, null, true), null); 2443 mWindowManager.moveTaskToTop(r.task.taskId); 2444 if (DEBUG_TASKS) Slog.v(TAG_TASKS, "Starting new activity " + r 2445 + " in new guessed " + r.task); 2446 } 2447 2448 mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, 2449 intent, r.getUriPermissionsLocked(), r.userId); 2450 2451 if (sourceRecord != null && sourceRecord.isRecentsActivity()) { 2452 r.task.setTaskToReturnTo(RECENTS_ACTIVITY_TYPE); 2453 } 2454 if (newTask) { 2455 EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId); 2456 } 2457 ActivityStack.logStartActivity(EventLogTags.AM_CREATE_ACTIVITY, r, r.task); 2458 targetStack.mLastPausedActivity = null; 2459 targetStack.startActivityLocked(r, newTask, doResume, keepCurTransition, options); 2460 if (!launchTaskBehind) { 2461 // Don't set focus on an activity that's going to the back. 2462 mService.setFocusedActivityLocked(r, "startedActivity"); 2463 } 2464 return ActivityManager.START_SUCCESS; 2465 } 2466 doPendingActivityLaunchesLocked(boolean doResume)2467 final void doPendingActivityLaunchesLocked(boolean doResume) { 2468 while (!mPendingActivityLaunches.isEmpty()) { 2469 PendingActivityLaunch pal = mPendingActivityLaunches.remove(0); 2470 startActivityUncheckedLocked(pal.r, pal.sourceRecord, null, null, pal.startFlags, 2471 doResume && mPendingActivityLaunches.isEmpty(), null, null); 2472 } 2473 } 2474 removePendingActivityLaunchesLocked(ActivityStack stack)2475 void removePendingActivityLaunchesLocked(ActivityStack stack) { 2476 for (int palNdx = mPendingActivityLaunches.size() - 1; palNdx >= 0; --palNdx) { 2477 PendingActivityLaunch pal = mPendingActivityLaunches.get(palNdx); 2478 if (pal.stack == stack) { 2479 mPendingActivityLaunches.remove(palNdx); 2480 } 2481 } 2482 } 2483 setLaunchSource(int uid)2484 void setLaunchSource(int uid) { 2485 mLaunchingActivity.setWorkSource(new WorkSource(uid)); 2486 } 2487 acquireLaunchWakelock()2488 void acquireLaunchWakelock() { 2489 if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 2490 throw new IllegalStateException("Calling must be system uid"); 2491 } 2492 mLaunchingActivity.acquire(); 2493 if (!mHandler.hasMessages(LAUNCH_TIMEOUT_MSG)) { 2494 // To be safe, don't allow the wake lock to be held for too long. 2495 mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 2496 } 2497 } 2498 2499 /** 2500 * Called when the frontmost task is idle. 2501 * @return the state of mService.mBooting before this was called. 2502 */ checkFinishBootingLocked()2503 private boolean checkFinishBootingLocked() { 2504 final boolean booting = mService.mBooting; 2505 boolean enableScreen = false; 2506 mService.mBooting = false; 2507 if (!mService.mBooted) { 2508 mService.mBooted = true; 2509 enableScreen = true; 2510 } 2511 if (booting || enableScreen) { 2512 mService.postFinishBooting(booting, enableScreen); 2513 } 2514 return booting; 2515 } 2516 2517 // Checked. activityIdleInternalLocked(final IBinder token, boolean fromTimeout, Configuration config)2518 final ActivityRecord activityIdleInternalLocked(final IBinder token, boolean fromTimeout, 2519 Configuration config) { 2520 if (DEBUG_ALL) Slog.v(TAG, "Activity idle: " + token); 2521 2522 ArrayList<ActivityRecord> stops = null; 2523 ArrayList<ActivityRecord> finishes = null; 2524 ArrayList<UserState> startingUsers = null; 2525 int NS = 0; 2526 int NF = 0; 2527 boolean booting = false; 2528 boolean activityRemoved = false; 2529 2530 ActivityRecord r = ActivityRecord.forTokenLocked(token); 2531 if (r != null) { 2532 if (DEBUG_IDLE) Slog.d(TAG_IDLE, "activityIdleInternalLocked: Callers=" 2533 + Debug.getCallers(4)); 2534 mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 2535 r.finishLaunchTickingLocked(); 2536 if (fromTimeout) { 2537 reportActivityLaunchedLocked(fromTimeout, r, -1, -1); 2538 } 2539 2540 // This is a hack to semi-deal with a race condition 2541 // in the client where it can be constructed with a 2542 // newer configuration from when we asked it to launch. 2543 // We'll update with whatever configuration it now says 2544 // it used to launch. 2545 if (config != null) { 2546 r.configuration = config; 2547 } 2548 2549 // We are now idle. If someone is waiting for a thumbnail from 2550 // us, we can now deliver. 2551 r.idle = true; 2552 2553 //Slog.i(TAG, "IDLE: mBooted=" + mBooted + ", fromTimeout=" + fromTimeout); 2554 if (isFrontStack(r.task.stack) || fromTimeout) { 2555 booting = checkFinishBootingLocked(); 2556 } 2557 } 2558 2559 if (allResumedActivitiesIdle()) { 2560 if (r != null) { 2561 mService.scheduleAppGcsLocked(); 2562 } 2563 2564 if (mLaunchingActivity.isHeld()) { 2565 mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 2566 if (VALIDATE_WAKE_LOCK_CALLER && 2567 Binder.getCallingUid() != Process.myUid()) { 2568 throw new IllegalStateException("Calling must be system uid"); 2569 } 2570 mLaunchingActivity.release(); 2571 } 2572 ensureActivitiesVisibleLocked(null, 0); 2573 } 2574 2575 // Atomically retrieve all of the other things to do. 2576 stops = processStoppingActivitiesLocked(true); 2577 NS = stops != null ? stops.size() : 0; 2578 if ((NF = mFinishingActivities.size()) > 0) { 2579 finishes = new ArrayList<>(mFinishingActivities); 2580 mFinishingActivities.clear(); 2581 } 2582 2583 if (mStartingUsers.size() > 0) { 2584 startingUsers = new ArrayList<>(mStartingUsers); 2585 mStartingUsers.clear(); 2586 } 2587 2588 // Stop any activities that are scheduled to do so but have been 2589 // waiting for the next one to start. 2590 for (int i = 0; i < NS; i++) { 2591 r = stops.get(i); 2592 final ActivityStack stack = r.task.stack; 2593 if (stack != null) { 2594 if (r.finishing) { 2595 stack.finishCurrentActivityLocked(r, ActivityStack.FINISH_IMMEDIATELY, false); 2596 } else { 2597 stack.stopActivityLocked(r); 2598 } 2599 } 2600 } 2601 2602 // Finish any activities that are scheduled to do so but have been 2603 // waiting for the next one to start. 2604 for (int i = 0; i < NF; i++) { 2605 r = finishes.get(i); 2606 final ActivityStack stack = r.task.stack; 2607 if (stack != null) { 2608 activityRemoved |= stack.destroyActivityLocked(r, true, "finish-idle"); 2609 } 2610 } 2611 2612 if (!booting) { 2613 // Complete user switch 2614 if (startingUsers != null) { 2615 for (int i = 0; i < startingUsers.size(); i++) { 2616 mService.finishUserSwitch(startingUsers.get(i)); 2617 } 2618 } 2619 // Complete starting up of background users 2620 if (mStartingBackgroundUsers.size() > 0) { 2621 startingUsers = new ArrayList<UserState>(mStartingBackgroundUsers); 2622 mStartingBackgroundUsers.clear(); 2623 for (int i = 0; i < startingUsers.size(); i++) { 2624 mService.finishUserBoot(startingUsers.get(i)); 2625 } 2626 } 2627 } 2628 2629 mService.trimApplications(); 2630 //dump(); 2631 //mWindowManager.dump(); 2632 2633 if (activityRemoved) { 2634 resumeTopActivitiesLocked(); 2635 } 2636 2637 return r; 2638 } 2639 handleAppDiedLocked(ProcessRecord app)2640 boolean handleAppDiedLocked(ProcessRecord app) { 2641 boolean hasVisibleActivities = false; 2642 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2643 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 2644 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 2645 hasVisibleActivities |= stacks.get(stackNdx).handleAppDiedLocked(app); 2646 } 2647 } 2648 return hasVisibleActivities; 2649 } 2650 closeSystemDialogsLocked()2651 void closeSystemDialogsLocked() { 2652 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2653 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 2654 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 2655 stacks.get(stackNdx).closeSystemDialogsLocked(); 2656 } 2657 } 2658 } 2659 removeUserLocked(int userId)2660 void removeUserLocked(int userId) { 2661 mUserStackInFront.delete(userId); 2662 } 2663 2664 /** 2665 * @return true if some activity was finished (or would have finished if doit were true). 2666 */ finishDisabledPackageActivitiesLocked(String packageName, Set<String> filterByClasses, boolean doit, boolean evenPersistent, int userId)2667 boolean finishDisabledPackageActivitiesLocked(String packageName, Set<String> filterByClasses, 2668 boolean doit, boolean evenPersistent, int userId) { 2669 boolean didSomething = false; 2670 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2671 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 2672 final int numStacks = stacks.size(); 2673 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2674 final ActivityStack stack = stacks.get(stackNdx); 2675 if (stack.finishDisabledPackageActivitiesLocked( 2676 packageName, filterByClasses, doit, evenPersistent, userId)) { 2677 didSomething = true; 2678 } 2679 } 2680 } 2681 return didSomething; 2682 } 2683 updatePreviousProcessLocked(ActivityRecord r)2684 void updatePreviousProcessLocked(ActivityRecord r) { 2685 // Now that this process has stopped, we may want to consider 2686 // it to be the previous app to try to keep around in case 2687 // the user wants to return to it. 2688 2689 // First, found out what is currently the foreground app, so that 2690 // we don't blow away the previous app if this activity is being 2691 // hosted by the process that is actually still the foreground. 2692 ProcessRecord fgApp = null; 2693 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2694 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 2695 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 2696 final ActivityStack stack = stacks.get(stackNdx); 2697 if (isFrontStack(stack)) { 2698 if (stack.mResumedActivity != null) { 2699 fgApp = stack.mResumedActivity.app; 2700 } else if (stack.mPausingActivity != null) { 2701 fgApp = stack.mPausingActivity.app; 2702 } 2703 break; 2704 } 2705 } 2706 } 2707 2708 // Now set this one as the previous process, only if that really 2709 // makes sense to. 2710 if (r.app != null && fgApp != null && r.app != fgApp 2711 && r.lastVisibleTime > mService.mPreviousProcessVisibleTime 2712 && r.app != mService.mHomeProcess) { 2713 mService.mPreviousProcess = r.app; 2714 mService.mPreviousProcessVisibleTime = r.lastVisibleTime; 2715 } 2716 } 2717 resumeTopActivitiesLocked()2718 boolean resumeTopActivitiesLocked() { 2719 return resumeTopActivitiesLocked(null, null, null); 2720 } 2721 resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, Bundle targetOptions)2722 boolean resumeTopActivitiesLocked(ActivityStack targetStack, ActivityRecord target, 2723 Bundle targetOptions) { 2724 if (targetStack == null) { 2725 targetStack = mFocusedStack; 2726 } 2727 // Do targetStack first. 2728 boolean result = false; 2729 if (isFrontStack(targetStack)) { 2730 result = targetStack.resumeTopActivityLocked(target, targetOptions); 2731 } 2732 2733 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2734 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 2735 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 2736 final ActivityStack stack = stacks.get(stackNdx); 2737 if (stack == targetStack) { 2738 // Already started above. 2739 continue; 2740 } 2741 if (isFrontStack(stack)) { 2742 stack.resumeTopActivityLocked(null); 2743 } 2744 } 2745 } 2746 return result; 2747 } 2748 finishTopRunningActivityLocked(ProcessRecord app, String reason)2749 void finishTopRunningActivityLocked(ProcessRecord app, String reason) { 2750 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2751 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 2752 final int numStacks = stacks.size(); 2753 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2754 final ActivityStack stack = stacks.get(stackNdx); 2755 stack.finishTopRunningActivityLocked(app, reason); 2756 } 2757 } 2758 } 2759 finishVoiceTask(IVoiceInteractionSession session)2760 void finishVoiceTask(IVoiceInteractionSession session) { 2761 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2762 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 2763 final int numStacks = stacks.size(); 2764 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 2765 final ActivityStack stack = stacks.get(stackNdx); 2766 stack.finishVoiceTask(session); 2767 } 2768 } 2769 } 2770 findTaskToMoveToFrontLocked(TaskRecord task, int flags, Bundle options, String reason)2771 void findTaskToMoveToFrontLocked(TaskRecord task, int flags, Bundle options, String reason) { 2772 if ((flags & ActivityManager.MOVE_TASK_NO_USER_ACTION) == 0) { 2773 mUserLeaving = true; 2774 } 2775 if ((flags & ActivityManager.MOVE_TASK_WITH_HOME) != 0) { 2776 // Caller wants the home activity moved with it. To accomplish this, 2777 // we'll just indicate that this task returns to the home task. 2778 task.setTaskToReturnTo(HOME_ACTIVITY_TYPE); 2779 } 2780 if (task.stack == null) { 2781 Slog.e(TAG, "findTaskToMoveToFrontLocked: can't move task=" 2782 + task + " to front. Stack is null"); 2783 return; 2784 } 2785 task.stack.moveTaskToFrontLocked(task, false /* noAnimation */, options, 2786 task.getTopActivity() == null ? null : task.getTopActivity().appTimeTracker, 2787 reason); 2788 if (DEBUG_STACK) Slog.d(TAG_STACK, 2789 "findTaskToMoveToFront: moved to front of stack=" + task.stack); 2790 } 2791 getStack(int stackId)2792 ActivityStack getStack(int stackId) { 2793 ActivityContainer activityContainer = mActivityContainers.get(stackId); 2794 if (activityContainer != null) { 2795 return activityContainer.mStack; 2796 } 2797 return null; 2798 } 2799 getStacks()2800 ArrayList<ActivityStack> getStacks() { 2801 ArrayList<ActivityStack> allStacks = new ArrayList<ActivityStack>(); 2802 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 2803 allStacks.addAll(mActivityDisplays.valueAt(displayNdx).mStacks); 2804 } 2805 return allStacks; 2806 } 2807 getHomeActivityToken()2808 IBinder getHomeActivityToken() { 2809 ActivityRecord homeActivity = getHomeActivity(); 2810 if (homeActivity != null) { 2811 return homeActivity.appToken; 2812 } 2813 return null; 2814 } 2815 getHomeActivity()2816 ActivityRecord getHomeActivity() { 2817 return getHomeActivityForUser(mCurrentUser); 2818 } 2819 getHomeActivityForUser(int userId)2820 ActivityRecord getHomeActivityForUser(int userId) { 2821 final ArrayList<TaskRecord> tasks = mHomeStack.getAllTasks(); 2822 for (int taskNdx = tasks.size() - 1; taskNdx >= 0; --taskNdx) { 2823 final TaskRecord task = tasks.get(taskNdx); 2824 if (task.isHomeTask()) { 2825 final ArrayList<ActivityRecord> activities = task.mActivities; 2826 for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { 2827 final ActivityRecord r = activities.get(activityNdx); 2828 if (r.isHomeActivity() 2829 && ((userId == UserHandle.USER_ALL) || (r.userId == userId))) { 2830 return r; 2831 } 2832 } 2833 } 2834 } 2835 return null; 2836 } 2837 createVirtualActivityContainer(ActivityRecord parentActivity, IActivityContainerCallback callback)2838 ActivityContainer createVirtualActivityContainer(ActivityRecord parentActivity, 2839 IActivityContainerCallback callback) { 2840 ActivityContainer activityContainer = 2841 new VirtualActivityContainer(parentActivity, callback); 2842 mActivityContainers.put(activityContainer.mStackId, activityContainer); 2843 if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, 2844 "createActivityContainer: " + activityContainer); 2845 parentActivity.mChildContainers.add(activityContainer); 2846 return activityContainer; 2847 } 2848 removeChildActivityContainers(ActivityRecord parentActivity)2849 void removeChildActivityContainers(ActivityRecord parentActivity) { 2850 final ArrayList<ActivityContainer> childStacks = parentActivity.mChildContainers; 2851 for (int containerNdx = childStacks.size() - 1; containerNdx >= 0; --containerNdx) { 2852 ActivityContainer container = childStacks.remove(containerNdx); 2853 if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, "removeChildActivityContainers: removing " 2854 + container); 2855 container.release(); 2856 } 2857 } 2858 deleteActivityContainer(IActivityContainer container)2859 void deleteActivityContainer(IActivityContainer container) { 2860 ActivityContainer activityContainer = (ActivityContainer)container; 2861 if (activityContainer != null) { 2862 if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, 2863 "deleteActivityContainer: callers=" + Debug.getCallers(4)); 2864 final int stackId = activityContainer.mStackId; 2865 mActivityContainers.remove(stackId); 2866 mWindowManager.removeStack(stackId); 2867 } 2868 } 2869 resizeStackLocked(int stackId, Rect bounds)2870 void resizeStackLocked(int stackId, Rect bounds) { 2871 final ActivityStack stack = getStack(stackId); 2872 if (stack == null) { 2873 Slog.w(TAG, "resizeStack: stackId " + stackId + " not found."); 2874 return; 2875 } 2876 2877 final ActivityRecord r = stack.topRunningActivityLocked(null); 2878 if (r != null && !r.task.mResizeable) { 2879 Slog.w(TAG, "resizeStack: top task " + r.task + " not resizeable."); 2880 return; 2881 } 2882 2883 final Configuration overrideConfig = mWindowManager.resizeStack(stackId, bounds); 2884 if (stack.updateOverrideConfiguration(overrideConfig)) { 2885 if (r != null) { 2886 final boolean updated = stack.ensureActivityConfigurationLocked(r, 0); 2887 // And we need to make sure at this point that all other activities 2888 // are made visible with the correct configuration. 2889 ensureActivitiesVisibleLocked(r, 0); 2890 if (!updated) { 2891 resumeTopActivitiesLocked(stack, null, null); 2892 } 2893 } 2894 } 2895 } 2896 2897 /** Makes sure the input task is in a stack with the specified bounds by either resizing the 2898 * current task stack if it only has one entry, moving the task to a stack that matches the 2899 * bounds, or creating a new stack with the required bounds. Also, makes the task resizeable.*/ resizeTaskLocked(TaskRecord task, Rect bounds)2900 void resizeTaskLocked(TaskRecord task, Rect bounds) { 2901 task.mResizeable = true; 2902 final ActivityStack currentStack = task.stack; 2903 if (currentStack.isHomeStack()) { 2904 // Can't move task off the home stack. Sorry! 2905 return; 2906 } 2907 2908 final int matchingStackId = mWindowManager.getStackIdWithBounds(bounds); 2909 if (matchingStackId != -1) { 2910 // There is already a stack with the right bounds! 2911 if (currentStack != null && currentStack.mStackId == matchingStackId) { 2912 // Nothing to do here. Already in the right stack... 2913 return; 2914 } 2915 // Move task to stack with matching bounds. 2916 moveTaskToStackLocked(task.taskId, matchingStackId, true); 2917 return; 2918 } 2919 2920 if (currentStack != null && currentStack.numTasks() == 1) { 2921 // Just resize the current stack since this is the task in it. 2922 resizeStackLocked(currentStack.mStackId, bounds); 2923 return; 2924 } 2925 2926 // Create new stack and move the task to it. 2927 final int displayId = (currentStack != null && currentStack.mDisplayId != -1) 2928 ? currentStack.mDisplayId : Display.DEFAULT_DISPLAY; 2929 ActivityStack newStack = createStackOnDisplay(getNextStackId(), displayId); 2930 2931 if (newStack == null) { 2932 Slog.e(TAG, "resizeTaskLocked: Can't create stack for task=" + task); 2933 return; 2934 } 2935 moveTaskToStackLocked(task.taskId, newStack.mStackId, true); 2936 resizeStackLocked(newStack.mStackId, bounds); 2937 } 2938 createStackOnDisplay(int stackId, int displayId)2939 ActivityStack createStackOnDisplay(int stackId, int displayId) { 2940 ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 2941 if (activityDisplay == null) { 2942 return null; 2943 } 2944 2945 ActivityContainer activityContainer = new ActivityContainer(stackId); 2946 mActivityContainers.put(stackId, activityContainer); 2947 activityContainer.attachToDisplayLocked(activityDisplay); 2948 return activityContainer.mStack; 2949 } 2950 getNextStackId()2951 int getNextStackId() { 2952 while (true) { 2953 if (++mLastStackId <= HOME_STACK_ID) { 2954 mLastStackId = HOME_STACK_ID + 1; 2955 } 2956 if (getStack(mLastStackId) == null) { 2957 break; 2958 } 2959 } 2960 return mLastStackId; 2961 } 2962 restoreRecentTaskLocked(TaskRecord task)2963 private boolean restoreRecentTaskLocked(TaskRecord task) { 2964 ActivityStack stack = null; 2965 // Determine stack to restore task to. 2966 if (mLeanbackOnlyDevice) { 2967 // There is only one stack for lean back devices. 2968 stack = mHomeStack; 2969 } else { 2970 // Look for the top stack on the home display that isn't the home stack. 2971 final ArrayList<ActivityStack> homeDisplayStacks = mHomeStack.mStacks; 2972 for (int stackNdx = homeDisplayStacks.size() - 1; stackNdx >= 0; --stackNdx) { 2973 final ActivityStack tmpStack = homeDisplayStacks.get(stackNdx); 2974 if (!tmpStack.isHomeStack() && tmpStack.mFullscreen) { 2975 stack = tmpStack; 2976 break; 2977 } 2978 } 2979 } 2980 2981 if (stack == null) { 2982 // We couldn't find a stack to restore the task to. Possible if are restoring recents 2983 // before an application stack is created...Go ahead and create one on the default 2984 // display. 2985 stack = createStackOnDisplay(getNextStackId(), Display.DEFAULT_DISPLAY); 2986 // Restore home stack to top. 2987 moveHomeStack(true, "restoreRecentTask"); 2988 if (DEBUG_RECENTS) Slog.v(TAG_RECENTS, 2989 "Created stack=" + stack + " for recents restoration."); 2990 } 2991 2992 if (stack == null) { 2993 // What does this mean??? Not sure how we would get here... 2994 if (DEBUG_RECENTS) Slog.v(TAG_RECENTS, 2995 "Unable to find/create stack to restore recent task=" + task); 2996 return false; 2997 } 2998 2999 stack.addTask(task, false, false); 3000 if (DEBUG_RECENTS) Slog.v(TAG_RECENTS, 3001 "Added restored task=" + task + " to stack=" + stack); 3002 final ArrayList<ActivityRecord> activities = task.mActivities; 3003 for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) { 3004 final ActivityRecord r = activities.get(activityNdx); 3005 mWindowManager.addAppToken(0, r.appToken, task.taskId, stack.mStackId, 3006 r.info.screenOrientation, r.fullscreen, 3007 (r.info.flags & ActivityInfo.FLAG_SHOW_FOR_ALL_USERS) != 0, 3008 r.userId, r.info.configChanges, task.voiceSession != null, 3009 r.mLaunchTaskBehind); 3010 } 3011 return true; 3012 } 3013 moveTaskToStackLocked(int taskId, int stackId, boolean toTop)3014 void moveTaskToStackLocked(int taskId, int stackId, boolean toTop) { 3015 final TaskRecord task = anyTaskForIdLocked(taskId); 3016 if (task == null) { 3017 Slog.w(TAG, "moveTaskToStack: no task for id=" + taskId); 3018 return; 3019 } 3020 final ActivityStack stack = getStack(stackId); 3021 if (stack == null) { 3022 Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId); 3023 return; 3024 } 3025 mWindowManager.moveTaskToStack(taskId, stackId, toTop); 3026 if (task.stack != null) { 3027 task.stack.removeTask(task, "moveTaskToStack", false /* notMoving */); 3028 } 3029 stack.addTask(task, toTop, true); 3030 // The task might have already been running and its visibility needs to be synchronized with 3031 // the visibility of the stack / windows. 3032 stack.ensureActivitiesVisibleLocked(null, 0); 3033 resumeTopActivitiesLocked(); 3034 } 3035 findTaskLocked(ActivityRecord r)3036 ActivityRecord findTaskLocked(ActivityRecord r) { 3037 if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Looking for task of " + r); 3038 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3039 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3040 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3041 final ActivityStack stack = stacks.get(stackNdx); 3042 if (!r.isApplicationActivity() && !stack.isHomeStack()) { 3043 if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Skipping stack: (home activity) " + stack); 3044 continue; 3045 } 3046 if (!stack.mActivityContainer.isEligibleForNewTasks()) { 3047 if (DEBUG_TASKS) Slog.d(TAG_TASKS, 3048 "Skipping stack: (new task not allowed) " + stack); 3049 continue; 3050 } 3051 final ActivityRecord ar = stack.findTaskLocked(r); 3052 if (ar != null) { 3053 return ar; 3054 } 3055 } 3056 } 3057 if (DEBUG_TASKS) Slog.d(TAG_TASKS, "No task found"); 3058 return null; 3059 } 3060 findActivityLocked(Intent intent, ActivityInfo info)3061 ActivityRecord findActivityLocked(Intent intent, ActivityInfo info) { 3062 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3063 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3064 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3065 final ActivityRecord ar = stacks.get(stackNdx).findActivityLocked(intent, info); 3066 if (ar != null) { 3067 return ar; 3068 } 3069 } 3070 } 3071 return null; 3072 } 3073 goingToSleepLocked()3074 void goingToSleepLocked() { 3075 scheduleSleepTimeout(); 3076 if (!mGoingToSleep.isHeld()) { 3077 mGoingToSleep.acquire(); 3078 if (mLaunchingActivity.isHeld()) { 3079 if (VALIDATE_WAKE_LOCK_CALLER && Binder.getCallingUid() != Process.myUid()) { 3080 throw new IllegalStateException("Calling must be system uid"); 3081 } 3082 mLaunchingActivity.release(); 3083 mService.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); 3084 } 3085 } 3086 checkReadyForSleepLocked(); 3087 } 3088 shutdownLocked(int timeout)3089 boolean shutdownLocked(int timeout) { 3090 goingToSleepLocked(); 3091 3092 boolean timedout = false; 3093 final long endTime = System.currentTimeMillis() + timeout; 3094 while (true) { 3095 boolean cantShutdown = false; 3096 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3097 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3098 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3099 cantShutdown |= stacks.get(stackNdx).checkReadyForSleepLocked(); 3100 } 3101 } 3102 if (cantShutdown) { 3103 long timeRemaining = endTime - System.currentTimeMillis(); 3104 if (timeRemaining > 0) { 3105 try { 3106 mService.wait(timeRemaining); 3107 } catch (InterruptedException e) { 3108 } 3109 } else { 3110 Slog.w(TAG, "Activity manager shutdown timed out"); 3111 timedout = true; 3112 break; 3113 } 3114 } else { 3115 break; 3116 } 3117 } 3118 3119 // Force checkReadyForSleep to complete. 3120 mSleepTimeout = true; 3121 checkReadyForSleepLocked(); 3122 3123 return timedout; 3124 } 3125 comeOutOfSleepIfNeededLocked()3126 void comeOutOfSleepIfNeededLocked() { 3127 removeSleepTimeouts(); 3128 if (mGoingToSleep.isHeld()) { 3129 mGoingToSleep.release(); 3130 } 3131 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3132 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3133 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3134 final ActivityStack stack = stacks.get(stackNdx); 3135 stack.awakeFromSleepingLocked(); 3136 if (isFrontStack(stack)) { 3137 resumeTopActivitiesLocked(); 3138 } 3139 } 3140 } 3141 mGoingToSleepActivities.clear(); 3142 } 3143 activitySleptLocked(ActivityRecord r)3144 void activitySleptLocked(ActivityRecord r) { 3145 mGoingToSleepActivities.remove(r); 3146 checkReadyForSleepLocked(); 3147 } 3148 checkReadyForSleepLocked()3149 void checkReadyForSleepLocked() { 3150 if (!mService.isSleepingOrShuttingDown()) { 3151 // Do not care. 3152 return; 3153 } 3154 3155 if (!mSleepTimeout) { 3156 boolean dontSleep = false; 3157 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3158 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3159 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3160 dontSleep |= stacks.get(stackNdx).checkReadyForSleepLocked(); 3161 } 3162 } 3163 3164 if (mStoppingActivities.size() > 0) { 3165 // Still need to tell some activities to stop; can't sleep yet. 3166 if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still need to stop " 3167 + mStoppingActivities.size() + " activities"); 3168 scheduleIdleLocked(); 3169 dontSleep = true; 3170 } 3171 3172 if (mGoingToSleepActivities.size() > 0) { 3173 // Still need to tell some activities to sleep; can't sleep yet. 3174 if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep still need to sleep " 3175 + mGoingToSleepActivities.size() + " activities"); 3176 dontSleep = true; 3177 } 3178 3179 if (dontSleep) { 3180 return; 3181 } 3182 } 3183 3184 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3185 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3186 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3187 stacks.get(stackNdx).goToSleep(); 3188 } 3189 } 3190 3191 removeSleepTimeouts(); 3192 3193 if (mGoingToSleep.isHeld()) { 3194 mGoingToSleep.release(); 3195 } 3196 if (mService.mShuttingDown) { 3197 mService.notifyAll(); 3198 } 3199 } 3200 reportResumedActivityLocked(ActivityRecord r)3201 boolean reportResumedActivityLocked(ActivityRecord r) { 3202 final ActivityStack stack = r.task.stack; 3203 if (isFrontStack(stack)) { 3204 mService.updateUsageStats(r, true); 3205 } 3206 if (allResumedActivitiesComplete()) { 3207 ensureActivitiesVisibleLocked(null, 0); 3208 mWindowManager.executeAppTransition(); 3209 return true; 3210 } 3211 return false; 3212 } 3213 handleAppCrashLocked(ProcessRecord app)3214 void handleAppCrashLocked(ProcessRecord app) { 3215 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3216 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3217 int stackNdx = stacks.size() - 1; 3218 while (stackNdx >= 0) { 3219 stacks.get(stackNdx).handleAppCrashLocked(app); 3220 stackNdx--; 3221 } 3222 } 3223 } 3224 requestVisibleBehindLocked(ActivityRecord r, boolean visible)3225 boolean requestVisibleBehindLocked(ActivityRecord r, boolean visible) { 3226 final ActivityStack stack = r.task.stack; 3227 if (stack == null) { 3228 if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, 3229 "requestVisibleBehind: r=" + r + " visible=" + visible + " stack is null"); 3230 return false; 3231 } 3232 final boolean isVisible = stack.hasVisibleBehindActivity(); 3233 if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, 3234 "requestVisibleBehind r=" + r + " visible=" + visible + " isVisible=" + isVisible); 3235 3236 final ActivityRecord top = topRunningActivityLocked(); 3237 if (top == null || top == r || (visible == isVisible)) { 3238 if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, "requestVisibleBehind: quick return"); 3239 stack.setVisibleBehindActivity(visible ? r : null); 3240 return true; 3241 } 3242 3243 // A non-top activity is reporting a visibility change. 3244 if (visible && top.fullscreen) { 3245 // Let the caller know that it can't be seen. 3246 if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, 3247 "requestVisibleBehind: returning top.fullscreen=" + top.fullscreen 3248 + " top.state=" + top.state + " top.app=" + top.app + " top.app.thread=" 3249 + top.app.thread); 3250 return false; 3251 } else if (!visible && stack.getVisibleBehindActivity() != r) { 3252 // Only the activity set as currently visible behind should actively reset its 3253 // visible behind state. 3254 if (DEBUG_VISIBLE_BEHIND) Slog.d(TAG_VISIBLE_BEHIND, 3255 "requestVisibleBehind: returning visible=" + visible 3256 + " stack.getVisibleBehindActivity()=" + stack.getVisibleBehindActivity() 3257 + " r=" + r); 3258 return false; 3259 } 3260 3261 stack.setVisibleBehindActivity(visible ? r : null); 3262 if (!visible) { 3263 // Make the activity immediately above r opaque. 3264 final ActivityRecord next = stack.findNextTranslucentActivity(r); 3265 if (next != null) { 3266 mService.convertFromTranslucent(next.appToken); 3267 } 3268 } 3269 if (top.app != null && top.app.thread != null) { 3270 // Notify the top app of the change. 3271 try { 3272 top.app.thread.scheduleBackgroundVisibleBehindChanged(top.appToken, visible); 3273 } catch (RemoteException e) { 3274 } 3275 } 3276 return true; 3277 } 3278 3279 // Called when WindowManager has finished animating the launchingBehind activity to the back. handleLaunchTaskBehindCompleteLocked(ActivityRecord r)3280 void handleLaunchTaskBehindCompleteLocked(ActivityRecord r) { 3281 r.mLaunchTaskBehind = false; 3282 final TaskRecord task = r.task; 3283 task.setLastThumbnail(task.stack.screenshotActivities(r)); 3284 mRecentTasks.addLocked(task); 3285 mService.notifyTaskStackChangedLocked(); 3286 mWindowManager.setAppVisibility(r.appToken, false); 3287 } 3288 scheduleLaunchTaskBehindComplete(IBinder token)3289 void scheduleLaunchTaskBehindComplete(IBinder token) { 3290 mHandler.obtainMessage(LAUNCH_TASK_BEHIND_COMPLETE, token).sendToTarget(); 3291 } 3292 ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges)3293 void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges) { 3294 // First the front stacks. In case any are not fullscreen and are in front of home. 3295 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3296 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3297 final int topStackNdx = stacks.size() - 1; 3298 for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) { 3299 final ActivityStack stack = stacks.get(stackNdx); 3300 stack.ensureActivitiesVisibleLocked(starting, configChanges); 3301 } 3302 } 3303 } 3304 clearOtherAppTimeTrackers(AppTimeTracker except)3305 void clearOtherAppTimeTrackers(AppTimeTracker except) { 3306 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3307 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3308 final int topStackNdx = stacks.size() - 1; 3309 for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) { 3310 final ActivityStack stack = stacks.get(stackNdx); 3311 stack.clearOtherAppTimeTrackers(except); 3312 } 3313 } 3314 } 3315 scheduleDestroyAllActivities(ProcessRecord app, String reason)3316 void scheduleDestroyAllActivities(ProcessRecord app, String reason) { 3317 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3318 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3319 final int numStacks = stacks.size(); 3320 for (int stackNdx = 0; stackNdx < numStacks; ++stackNdx) { 3321 final ActivityStack stack = stacks.get(stackNdx); 3322 stack.scheduleDestroyActivities(app, reason); 3323 } 3324 } 3325 } 3326 releaseSomeActivitiesLocked(ProcessRecord app, String reason)3327 void releaseSomeActivitiesLocked(ProcessRecord app, String reason) { 3328 // Examine all activities currently running in the process. 3329 TaskRecord firstTask = null; 3330 // Tasks is non-null only if two or more tasks are found. 3331 ArraySet<TaskRecord> tasks = null; 3332 if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Trying to release some activities in " + app); 3333 for (int i = 0; i < app.activities.size(); i++) { 3334 ActivityRecord r = app.activities.get(i); 3335 // First, if we find an activity that is in the process of being destroyed, 3336 // then we just aren't going to do anything for now; we want things to settle 3337 // down before we try to prune more activities. 3338 if (r.finishing || r.state == DESTROYING || r.state == DESTROYED) { 3339 if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Abort release; already destroying: " + r); 3340 return; 3341 } 3342 // Don't consider any activies that are currently not in a state where they 3343 // can be destroyed. 3344 if (r.visible || !r.stopped || !r.haveState || r.state == RESUMED || r.state == PAUSING 3345 || r.state == PAUSED || r.state == STOPPING) { 3346 if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r); 3347 continue; 3348 } 3349 if (r.task != null) { 3350 if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Collecting release task " + r.task 3351 + " from " + r); 3352 if (firstTask == null) { 3353 firstTask = r.task; 3354 } else if (firstTask != r.task) { 3355 if (tasks == null) { 3356 tasks = new ArraySet<>(); 3357 tasks.add(firstTask); 3358 } 3359 tasks.add(r.task); 3360 } 3361 } 3362 } 3363 if (tasks == null) { 3364 if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Didn't find two or more tasks to release"); 3365 return; 3366 } 3367 // If we have activities in multiple tasks that are in a position to be destroyed, 3368 // let's iterate through the tasks and release the oldest one. 3369 final int numDisplays = mActivityDisplays.size(); 3370 for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) { 3371 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3372 // Step through all stacks starting from behind, to hit the oldest things first. 3373 for (int stackNdx = 0; stackNdx < stacks.size(); stackNdx++) { 3374 final ActivityStack stack = stacks.get(stackNdx); 3375 // Try to release activities in this stack; if we manage to, we are done. 3376 if (stack.releaseSomeActivitiesLocked(app, tasks, reason) > 0) { 3377 return; 3378 } 3379 } 3380 } 3381 } 3382 switchUserLocked(int userId, UserState uss)3383 boolean switchUserLocked(int userId, UserState uss) { 3384 mUserStackInFront.put(mCurrentUser, mFocusedStack.getStackId()); 3385 final int restoreStackId = mUserStackInFront.get(userId, HOME_STACK_ID); 3386 mCurrentUser = userId; 3387 3388 mStartingUsers.add(uss); 3389 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3390 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3391 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3392 final ActivityStack stack = stacks.get(stackNdx); 3393 stack.switchUserLocked(userId); 3394 TaskRecord task = stack.topTask(); 3395 if (task != null) { 3396 mWindowManager.moveTaskToTop(task.taskId); 3397 } 3398 } 3399 } 3400 3401 ActivityStack stack = getStack(restoreStackId); 3402 if (stack == null) { 3403 stack = mHomeStack; 3404 } 3405 final boolean homeInFront = stack.isHomeStack(); 3406 if (stack.isOnHomeDisplay()) { 3407 moveHomeStack(homeInFront, "switchUserOnHomeDisplay"); 3408 TaskRecord task = stack.topTask(); 3409 if (task != null) { 3410 mWindowManager.moveTaskToTop(task.taskId); 3411 } 3412 } else { 3413 // Stack was moved to another display while user was swapped out. 3414 resumeHomeStackTask(HOME_ACTIVITY_TYPE, null, "switchUserOnOtherDisplay"); 3415 } 3416 return homeInFront; 3417 } 3418 3419 /** 3420 * Add background users to send boot completed events to. 3421 * @param userId The user being started in the background 3422 * @param uss The state object for the user. 3423 */ startBackgroundUserLocked(int userId, UserState uss)3424 public void startBackgroundUserLocked(int userId, UserState uss) { 3425 mStartingBackgroundUsers.add(uss); 3426 } 3427 3428 /** Checks whether the userid is a profile of the current user. */ isCurrentProfileLocked(int userId)3429 boolean isCurrentProfileLocked(int userId) { 3430 if (userId == mCurrentUser) return true; 3431 for (int i = 0; i < mService.mCurrentProfileIds.length; i++) { 3432 if (mService.mCurrentProfileIds[i] == userId) return true; 3433 } 3434 return false; 3435 } 3436 processStoppingActivitiesLocked(boolean remove)3437 final ArrayList<ActivityRecord> processStoppingActivitiesLocked(boolean remove) { 3438 ArrayList<ActivityRecord> stops = null; 3439 3440 final boolean nowVisible = allResumedActivitiesVisible(); 3441 for (int activityNdx = mStoppingActivities.size() - 1; activityNdx >= 0; --activityNdx) { 3442 ActivityRecord s = mStoppingActivities.get(activityNdx); 3443 final boolean waitingVisible = mWaitingVisibleActivities.contains(s); 3444 if (DEBUG_ALL) Slog.v(TAG, "Stopping " + s + ": nowVisible=" + nowVisible 3445 + " waitingVisible=" + waitingVisible + " finishing=" + s.finishing); 3446 if (waitingVisible && nowVisible) { 3447 mWaitingVisibleActivities.remove(s); 3448 if (s.finishing) { 3449 // If this activity is finishing, it is sitting on top of 3450 // everyone else but we now know it is no longer needed... 3451 // so get rid of it. Otherwise, we need to go through the 3452 // normal flow and hide it once we determine that it is 3453 // hidden by the activities in front of it. 3454 if (DEBUG_ALL) Slog.v(TAG, "Before stopping, can hide: " + s); 3455 mWindowManager.setAppVisibility(s.appToken, false); 3456 } 3457 } 3458 if ((!waitingVisible || mService.isSleepingOrShuttingDown()) && remove) { 3459 if (DEBUG_ALL) Slog.v(TAG, "Ready to stop: " + s); 3460 if (stops == null) { 3461 stops = new ArrayList<>(); 3462 } 3463 stops.add(s); 3464 mStoppingActivities.remove(activityNdx); 3465 } 3466 } 3467 3468 return stops; 3469 } 3470 validateTopActivitiesLocked()3471 void validateTopActivitiesLocked() { 3472 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3473 final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3474 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3475 final ActivityStack stack = stacks.get(stackNdx); 3476 final ActivityRecord r = stack.topRunningActivityLocked(null); 3477 final ActivityState state = r == null ? DESTROYED : r.state; 3478 if (isFrontStack(stack)) { 3479 if (r == null) Slog.e(TAG, 3480 "validateTop...: null top activity, stack=" + stack); 3481 else { 3482 final ActivityRecord pausing = stack.mPausingActivity; 3483 if (pausing != null && pausing == r) Slog.e(TAG, 3484 "validateTop...: top stack has pausing activity r=" + r 3485 + " state=" + state); 3486 if (state != INITIALIZING && state != RESUMED) Slog.e(TAG, 3487 "validateTop...: activity in front not resumed r=" + r 3488 + " state=" + state); 3489 } 3490 } else { 3491 final ActivityRecord resumed = stack.mResumedActivity; 3492 if (resumed != null && resumed == r) Slog.e(TAG, 3493 "validateTop...: back stack has resumed activity r=" + r 3494 + " state=" + state); 3495 if (r != null && (state == INITIALIZING || state == RESUMED)) Slog.e(TAG, 3496 "validateTop...: activity in back resumed r=" + r + " state=" + state); 3497 } 3498 } 3499 } 3500 } 3501 lockTaskModeToString()3502 private String lockTaskModeToString() { 3503 switch (mLockTaskModeState) { 3504 case LOCK_TASK_MODE_LOCKED: 3505 return "LOCKED"; 3506 case LOCK_TASK_MODE_PINNED: 3507 return "PINNED"; 3508 case LOCK_TASK_MODE_NONE: 3509 return "NONE"; 3510 default: return "unknown=" + mLockTaskModeState; 3511 } 3512 } 3513 dump(PrintWriter pw, String prefix)3514 public void dump(PrintWriter pw, String prefix) { 3515 pw.print(prefix); pw.print("mFocusedStack=" + mFocusedStack); 3516 pw.print(" mLastFocusedStack="); pw.println(mLastFocusedStack); 3517 pw.print(prefix); pw.println("mSleepTimeout=" + mSleepTimeout); 3518 pw.print(prefix); pw.println("mCurTaskId=" + mCurTaskId); 3519 pw.print(prefix); pw.println("mUserStackInFront=" + mUserStackInFront); 3520 pw.print(prefix); pw.println("mActivityContainers=" + mActivityContainers); 3521 pw.print(prefix); pw.print("mLockTaskModeState=" + lockTaskModeToString()); 3522 final SparseArray<String[]> packages = mService.mLockTaskPackages; 3523 if (packages.size() > 0) { 3524 pw.println(" mLockTaskPackages (userId:packages)="); 3525 for (int i = 0; i < packages.size(); ++i) { 3526 pw.print(prefix); pw.print(prefix); pw.print(packages.keyAt(i)); 3527 pw.print(":"); pw.println(Arrays.toString(packages.valueAt(i))); 3528 } 3529 } 3530 pw.println(" mLockTaskModeTasks" + mLockTaskModeTasks); 3531 } 3532 getDumpActivitiesLocked(String name)3533 ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) { 3534 return mFocusedStack.getDumpActivitiesLocked(name); 3535 } 3536 printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage, boolean needSep, String prefix)3537 static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage, 3538 boolean needSep, String prefix) { 3539 if (activity != null) { 3540 if (dumpPackage == null || dumpPackage.equals(activity.packageName)) { 3541 if (needSep) { 3542 pw.println(); 3543 } 3544 pw.print(prefix); 3545 pw.println(activity); 3546 return true; 3547 } 3548 } 3549 return false; 3550 } 3551 dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, boolean dumpClient, String dumpPackage)3552 boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 3553 boolean dumpClient, String dumpPackage) { 3554 boolean printed = false; 3555 boolean needSep = false; 3556 for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { 3557 ActivityDisplay activityDisplay = mActivityDisplays.valueAt(displayNdx); 3558 pw.print("Display #"); pw.print(activityDisplay.mDisplayId); 3559 pw.println(" (activities from top to bottom):"); 3560 ArrayList<ActivityStack> stacks = activityDisplay.mStacks; 3561 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3562 final ActivityStack stack = stacks.get(stackNdx); 3563 StringBuilder stackHeader = new StringBuilder(128); 3564 stackHeader.append(" Stack #"); 3565 stackHeader.append(stack.mStackId); 3566 stackHeader.append(":"); 3567 printed |= stack.dumpActivitiesLocked(fd, pw, dumpAll, dumpClient, dumpPackage, 3568 needSep, stackHeader.toString()); 3569 printed |= dumpHistoryList(fd, pw, stack.mLRUActivities, " ", "Run", false, 3570 !dumpAll, false, dumpPackage, true, 3571 " Running activities (most recent first):", null); 3572 3573 needSep = printed; 3574 boolean pr = printThisActivity(pw, stack.mPausingActivity, dumpPackage, needSep, 3575 " mPausingActivity: "); 3576 if (pr) { 3577 printed = true; 3578 needSep = false; 3579 } 3580 pr = printThisActivity(pw, stack.mResumedActivity, dumpPackage, needSep, 3581 " mResumedActivity: "); 3582 if (pr) { 3583 printed = true; 3584 needSep = false; 3585 } 3586 if (dumpAll) { 3587 pr = printThisActivity(pw, stack.mLastPausedActivity, dumpPackage, needSep, 3588 " mLastPausedActivity: "); 3589 if (pr) { 3590 printed = true; 3591 needSep = true; 3592 } 3593 printed |= printThisActivity(pw, stack.mLastNoHistoryActivity, dumpPackage, 3594 needSep, " mLastNoHistoryActivity: "); 3595 } 3596 needSep = printed; 3597 } 3598 } 3599 3600 printed |= dumpHistoryList(fd, pw, mFinishingActivities, " ", "Fin", false, !dumpAll, 3601 false, dumpPackage, true, " Activities waiting to finish:", null); 3602 printed |= dumpHistoryList(fd, pw, mStoppingActivities, " ", "Stop", false, !dumpAll, 3603 false, dumpPackage, true, " Activities waiting to stop:", null); 3604 printed |= dumpHistoryList(fd, pw, mWaitingVisibleActivities, " ", "Wait", false, !dumpAll, 3605 false, dumpPackage, true, " Activities waiting for another to become visible:", 3606 null); 3607 printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 3608 false, dumpPackage, true, " Activities waiting to sleep:", null); 3609 printed |= dumpHistoryList(fd, pw, mGoingToSleepActivities, " ", "Sleep", false, !dumpAll, 3610 false, dumpPackage, true, " Activities waiting to sleep:", null); 3611 3612 return printed; 3613 } 3614 dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, String prefix, String label, boolean complete, boolean brief, boolean client, String dumpPackage, boolean needNL, String header1, String header2)3615 static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list, 3616 String prefix, String label, boolean complete, boolean brief, boolean client, 3617 String dumpPackage, boolean needNL, String header1, String header2) { 3618 TaskRecord lastTask = null; 3619 String innerPrefix = null; 3620 String[] args = null; 3621 boolean printed = false; 3622 for (int i=list.size()-1; i>=0; i--) { 3623 final ActivityRecord r = list.get(i); 3624 if (dumpPackage != null && !dumpPackage.equals(r.packageName)) { 3625 continue; 3626 } 3627 if (innerPrefix == null) { 3628 innerPrefix = prefix + " "; 3629 args = new String[0]; 3630 } 3631 printed = true; 3632 final boolean full = !brief && (complete || !r.isInHistory()); 3633 if (needNL) { 3634 pw.println(""); 3635 needNL = false; 3636 } 3637 if (header1 != null) { 3638 pw.println(header1); 3639 header1 = null; 3640 } 3641 if (header2 != null) { 3642 pw.println(header2); 3643 header2 = null; 3644 } 3645 if (lastTask != r.task) { 3646 lastTask = r.task; 3647 pw.print(prefix); 3648 pw.print(full ? "* " : " "); 3649 pw.println(lastTask); 3650 if (full) { 3651 lastTask.dump(pw, prefix + " "); 3652 } else if (complete) { 3653 // Complete + brief == give a summary. Isn't that obvious?!? 3654 if (lastTask.intent != null) { 3655 pw.print(prefix); pw.print(" "); 3656 pw.println(lastTask.intent.toInsecureStringWithClip()); 3657 } 3658 } 3659 } 3660 pw.print(prefix); pw.print(full ? " * " : " "); pw.print(label); 3661 pw.print(" #"); pw.print(i); pw.print(": "); 3662 pw.println(r); 3663 if (full) { 3664 r.dump(pw, innerPrefix); 3665 } else if (complete) { 3666 // Complete + brief == give a summary. Isn't that obvious?!? 3667 pw.print(innerPrefix); pw.println(r.intent.toInsecureString()); 3668 if (r.app != null) { 3669 pw.print(innerPrefix); pw.println(r.app); 3670 } 3671 } 3672 if (client && r.app != null && r.app.thread != null) { 3673 // flush anything that is already in the PrintWriter since the thread is going 3674 // to write to the file descriptor directly 3675 pw.flush(); 3676 try { 3677 TransferPipe tp = new TransferPipe(); 3678 try { 3679 r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(), 3680 r.appToken, innerPrefix, args); 3681 // Short timeout, since blocking here can 3682 // deadlock with the application. 3683 tp.go(fd, 2000); 3684 } finally { 3685 tp.kill(); 3686 } 3687 } catch (IOException e) { 3688 pw.println(innerPrefix + "Failure while dumping the activity: " + e); 3689 } catch (RemoteException e) { 3690 pw.println(innerPrefix + "Got a RemoteException while dumping the activity"); 3691 } 3692 needNL = true; 3693 } 3694 } 3695 return printed; 3696 } 3697 scheduleIdleTimeoutLocked(ActivityRecord next)3698 void scheduleIdleTimeoutLocked(ActivityRecord next) { 3699 if (DEBUG_IDLE) Slog.d(TAG_IDLE, 3700 "scheduleIdleTimeoutLocked: Callers=" + Debug.getCallers(4)); 3701 Message msg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG, next); 3702 mHandler.sendMessageDelayed(msg, IDLE_TIMEOUT); 3703 } 3704 scheduleIdleLocked()3705 final void scheduleIdleLocked() { 3706 mHandler.sendEmptyMessage(IDLE_NOW_MSG); 3707 } 3708 removeTimeoutsForActivityLocked(ActivityRecord r)3709 void removeTimeoutsForActivityLocked(ActivityRecord r) { 3710 if (DEBUG_IDLE) Slog.d(TAG_IDLE, "removeTimeoutsForActivity: Callers=" 3711 + Debug.getCallers(4)); 3712 mHandler.removeMessages(IDLE_TIMEOUT_MSG, r); 3713 } 3714 scheduleResumeTopActivities()3715 final void scheduleResumeTopActivities() { 3716 if (!mHandler.hasMessages(RESUME_TOP_ACTIVITY_MSG)) { 3717 mHandler.sendEmptyMessage(RESUME_TOP_ACTIVITY_MSG); 3718 } 3719 } 3720 removeSleepTimeouts()3721 void removeSleepTimeouts() { 3722 mSleepTimeout = false; 3723 mHandler.removeMessages(SLEEP_TIMEOUT_MSG); 3724 } 3725 scheduleSleepTimeout()3726 final void scheduleSleepTimeout() { 3727 removeSleepTimeouts(); 3728 mHandler.sendEmptyMessageDelayed(SLEEP_TIMEOUT_MSG, SLEEP_TIMEOUT); 3729 } 3730 3731 @Override onDisplayAdded(int displayId)3732 public void onDisplayAdded(int displayId) { 3733 if (DEBUG_STACK) Slog.v(TAG, "Display added displayId=" + displayId); 3734 mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_ADDED, displayId, 0)); 3735 } 3736 3737 @Override onDisplayRemoved(int displayId)3738 public void onDisplayRemoved(int displayId) { 3739 if (DEBUG_STACK) Slog.v(TAG, "Display removed displayId=" + displayId); 3740 mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_REMOVED, displayId, 0)); 3741 } 3742 3743 @Override onDisplayChanged(int displayId)3744 public void onDisplayChanged(int displayId) { 3745 if (DEBUG_STACK) Slog.v(TAG, "Display changed displayId=" + displayId); 3746 mHandler.sendMessage(mHandler.obtainMessage(HANDLE_DISPLAY_CHANGED, displayId, 0)); 3747 } 3748 handleDisplayAdded(int displayId)3749 private void handleDisplayAdded(int displayId) { 3750 boolean newDisplay; 3751 synchronized (mService) { 3752 newDisplay = mActivityDisplays.get(displayId) == null; 3753 if (newDisplay) { 3754 ActivityDisplay activityDisplay = new ActivityDisplay(displayId); 3755 if (activityDisplay.mDisplay == null) { 3756 Slog.w(TAG, "Display " + displayId + " gone before initialization complete"); 3757 return; 3758 } 3759 mActivityDisplays.put(displayId, activityDisplay); 3760 } 3761 } 3762 if (newDisplay) { 3763 mWindowManager.onDisplayAdded(displayId); 3764 } 3765 } 3766 handleDisplayRemoved(int displayId)3767 private void handleDisplayRemoved(int displayId) { 3768 synchronized (mService) { 3769 ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 3770 if (activityDisplay != null) { 3771 ArrayList<ActivityStack> stacks = activityDisplay.mStacks; 3772 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3773 stacks.get(stackNdx).mActivityContainer.detachLocked(); 3774 } 3775 mActivityDisplays.remove(displayId); 3776 } 3777 } 3778 mWindowManager.onDisplayRemoved(displayId); 3779 } 3780 handleDisplayChanged(int displayId)3781 private void handleDisplayChanged(int displayId) { 3782 synchronized (mService) { 3783 ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 3784 if (activityDisplay != null) { 3785 // TODO: Update the bounds. 3786 } 3787 } 3788 mWindowManager.onDisplayChanged(displayId); 3789 } 3790 getStackInfoLocked(ActivityStack stack)3791 private StackInfo getStackInfoLocked(ActivityStack stack) { 3792 StackInfo info = new StackInfo(); 3793 mWindowManager.getStackBounds(stack.mStackId, info.bounds); 3794 info.displayId = Display.DEFAULT_DISPLAY; 3795 info.stackId = stack.mStackId; 3796 3797 ArrayList<TaskRecord> tasks = stack.getAllTasks(); 3798 final int numTasks = tasks.size(); 3799 int[] taskIds = new int[numTasks]; 3800 String[] taskNames = new String[numTasks]; 3801 for (int i = 0; i < numTasks; ++i) { 3802 final TaskRecord task = tasks.get(i); 3803 taskIds[i] = task.taskId; 3804 taskNames[i] = task.origActivity != null ? task.origActivity.flattenToString() 3805 : task.realActivity != null ? task.realActivity.flattenToString() 3806 : task.getTopActivity() != null ? task.getTopActivity().packageName 3807 : "unknown"; 3808 } 3809 info.taskIds = taskIds; 3810 info.taskNames = taskNames; 3811 return info; 3812 } 3813 getStackInfoLocked(int stackId)3814 StackInfo getStackInfoLocked(int stackId) { 3815 ActivityStack stack = getStack(stackId); 3816 if (stack != null) { 3817 return getStackInfoLocked(stack); 3818 } 3819 return null; 3820 } 3821 getAllStackInfosLocked()3822 ArrayList<StackInfo> getAllStackInfosLocked() { 3823 ArrayList<StackInfo> list = new ArrayList<StackInfo>(); 3824 for (int displayNdx = 0; displayNdx < mActivityDisplays.size(); ++displayNdx) { 3825 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3826 for (int ndx = stacks.size() - 1; ndx >= 0; --ndx) { 3827 list.add(getStackInfoLocked(stacks.get(ndx))); 3828 } 3829 } 3830 return list; 3831 } 3832 getLockedTaskLocked()3833 TaskRecord getLockedTaskLocked() { 3834 final int top = mLockTaskModeTasks.size() - 1; 3835 if (top >= 0) { 3836 return mLockTaskModeTasks.get(top); 3837 } 3838 return null; 3839 } 3840 isLockedTask(TaskRecord task)3841 boolean isLockedTask(TaskRecord task) { 3842 return mLockTaskModeTasks.contains(task); 3843 } 3844 isLastLockedTask(TaskRecord task)3845 boolean isLastLockedTask(TaskRecord task) { 3846 return mLockTaskModeTasks.size() == 1 && mLockTaskModeTasks.contains(task); 3847 } 3848 removeLockedTaskLocked(final TaskRecord task)3849 void removeLockedTaskLocked(final TaskRecord task) { 3850 if (!mLockTaskModeTasks.remove(task)) { 3851 return; 3852 } 3853 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "removeLockedTaskLocked: removed " + task); 3854 if (mLockTaskModeTasks.isEmpty()) { 3855 // Last one. 3856 if (DEBUG_LOCKTASK) Slog.d(TAG_LOCKTASK, "removeLockedTask: task=" + task + 3857 " last task, reverting locktask mode. Callers=" + Debug.getCallers(3)); 3858 final Message lockTaskMsg = Message.obtain(); 3859 lockTaskMsg.arg1 = task.userId; 3860 lockTaskMsg.what = LOCK_TASK_END_MSG; 3861 mHandler.sendMessage(lockTaskMsg); 3862 } 3863 } 3864 showLockTaskToast()3865 void showLockTaskToast() { 3866 mLockTaskNotify.showToast(mLockTaskModeState); 3867 } 3868 showLockTaskEscapeMessageLocked(TaskRecord task)3869 void showLockTaskEscapeMessageLocked(TaskRecord task) { 3870 if (mLockTaskModeTasks.contains(task)) { 3871 mHandler.sendEmptyMessage(SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG); 3872 } 3873 } 3874 setLockTaskModeLocked(TaskRecord task, int lockTaskModeState, String reason, boolean andResume)3875 void setLockTaskModeLocked(TaskRecord task, int lockTaskModeState, String reason, 3876 boolean andResume) { 3877 if (task == null) { 3878 // Take out of lock task mode if necessary 3879 final TaskRecord lockedTask = getLockedTaskLocked(); 3880 if (lockedTask != null) { 3881 removeLockedTaskLocked(lockedTask); 3882 if (!mLockTaskModeTasks.isEmpty()) { 3883 // There are locked tasks remaining, can only finish this task, not unlock it. 3884 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, 3885 "setLockTaskModeLocked: Tasks remaining, can't unlock"); 3886 lockedTask.performClearTaskLocked(); 3887 resumeTopActivitiesLocked(); 3888 return; 3889 } 3890 } 3891 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, 3892 "setLockTaskModeLocked: No tasks to unlock. Callers=" + Debug.getCallers(4)); 3893 return; 3894 } 3895 3896 // Should have already been checked, but do it again. 3897 if (task.mLockTaskAuth == LOCK_TASK_AUTH_DONT_LOCK) { 3898 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, 3899 "setLockTaskModeLocked: Can't lock due to auth"); 3900 return; 3901 } 3902 if (isLockTaskModeViolation(task)) { 3903 Slog.e(TAG_LOCKTASK, "setLockTaskMode: Attempt to start an unauthorized lock task."); 3904 return; 3905 } 3906 3907 if (mLockTaskModeTasks.isEmpty()) { 3908 // First locktask. 3909 final Message lockTaskMsg = Message.obtain(); 3910 lockTaskMsg.obj = task.intent.getComponent().getPackageName(); 3911 lockTaskMsg.arg1 = task.userId; 3912 lockTaskMsg.what = LOCK_TASK_START_MSG; 3913 lockTaskMsg.arg2 = lockTaskModeState; 3914 mHandler.sendMessage(lockTaskMsg); 3915 } 3916 // Add it or move it to the top. 3917 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "setLockTaskModeLocked: Locking to " + task + 3918 " Callers=" + Debug.getCallers(4)); 3919 mLockTaskModeTasks.remove(task); 3920 mLockTaskModeTasks.add(task); 3921 3922 if (task.mLockTaskUid == -1) { 3923 task.mLockTaskUid = task.mCallingUid; 3924 } 3925 3926 if (andResume) { 3927 findTaskToMoveToFrontLocked(task, 0, null, reason); 3928 resumeTopActivitiesLocked(); 3929 } 3930 } 3931 isLockTaskModeViolation(TaskRecord task)3932 boolean isLockTaskModeViolation(TaskRecord task) { 3933 return isLockTaskModeViolation(task, false); 3934 } 3935 isLockTaskModeViolation(TaskRecord task, boolean isNewClearTask)3936 boolean isLockTaskModeViolation(TaskRecord task, boolean isNewClearTask) { 3937 if (getLockedTaskLocked() == task && !isNewClearTask) { 3938 return false; 3939 } 3940 final int lockTaskAuth = task.mLockTaskAuth; 3941 switch (lockTaskAuth) { 3942 case LOCK_TASK_AUTH_DONT_LOCK: 3943 return !mLockTaskModeTasks.isEmpty(); 3944 case LOCK_TASK_AUTH_LAUNCHABLE_PRIV: 3945 case LOCK_TASK_AUTH_LAUNCHABLE: 3946 case LOCK_TASK_AUTH_WHITELISTED: 3947 return false; 3948 case LOCK_TASK_AUTH_PINNABLE: 3949 // Pinnable tasks can't be launched on top of locktask tasks. 3950 return !mLockTaskModeTasks.isEmpty(); 3951 default: 3952 Slog.w(TAG, "isLockTaskModeViolation: invalid lockTaskAuth value=" + lockTaskAuth); 3953 return true; 3954 } 3955 } 3956 onLockTaskPackagesUpdatedLocked()3957 void onLockTaskPackagesUpdatedLocked() { 3958 boolean didSomething = false; 3959 for (int taskNdx = mLockTaskModeTasks.size() - 1; taskNdx >= 0; --taskNdx) { 3960 final TaskRecord lockedTask = mLockTaskModeTasks.get(taskNdx); 3961 final boolean wasWhitelisted = 3962 (lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE) || 3963 (lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_WHITELISTED); 3964 lockedTask.setLockTaskAuth(); 3965 final boolean isWhitelisted = 3966 (lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE) || 3967 (lockedTask.mLockTaskAuth == LOCK_TASK_AUTH_WHITELISTED); 3968 if (wasWhitelisted && !isWhitelisted) { 3969 // Lost whitelisting authorization. End it now. 3970 if (DEBUG_LOCKTASK) Slog.d(TAG_LOCKTASK, "onLockTaskPackagesUpdated: removing " + 3971 lockedTask + " mLockTaskAuth=" + lockedTask.lockTaskAuthToString()); 3972 removeLockedTaskLocked(lockedTask); 3973 lockedTask.performClearTaskLocked(); 3974 didSomething = true; 3975 } 3976 } 3977 for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { 3978 ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; 3979 for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) { 3980 final ActivityStack stack = stacks.get(stackNdx); 3981 stack.onLockTaskPackagesUpdatedLocked(); 3982 } 3983 } 3984 final ActivityRecord r = topRunningActivityLocked(); 3985 final TaskRecord task = r != null ? r.task : null; 3986 if (mLockTaskModeTasks.isEmpty() && task != null 3987 && task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE) { 3988 // This task must have just been authorized. 3989 if (DEBUG_LOCKTASK) Slog.d(TAG_LOCKTASK, 3990 "onLockTaskPackagesUpdated: starting new locktask task=" + task); 3991 setLockTaskModeLocked(task, ActivityManager.LOCK_TASK_MODE_LOCKED, "package updated", 3992 false); 3993 didSomething = true; 3994 } 3995 if (didSomething) { 3996 resumeTopActivitiesLocked(); 3997 } 3998 } 3999 getLockTaskModeState()4000 int getLockTaskModeState() { 4001 return mLockTaskModeState; 4002 } 4003 4004 private final class ActivityStackSupervisorHandler extends Handler { 4005 ActivityStackSupervisorHandler(Looper looper)4006 public ActivityStackSupervisorHandler(Looper looper) { 4007 super(looper); 4008 } 4009 activityIdleInternal(ActivityRecord r)4010 void activityIdleInternal(ActivityRecord r) { 4011 synchronized (mService) { 4012 activityIdleInternalLocked(r != null ? r.appToken : null, true, null); 4013 } 4014 } 4015 4016 @Override handleMessage(Message msg)4017 public void handleMessage(Message msg) { 4018 switch (msg.what) { 4019 case IDLE_TIMEOUT_MSG: { 4020 if (DEBUG_IDLE) Slog.d(TAG_IDLE, 4021 "handleMessage: IDLE_TIMEOUT_MSG: r=" + msg.obj); 4022 if (mService.mDidDexOpt) { 4023 mService.mDidDexOpt = false; 4024 Message nmsg = mHandler.obtainMessage(IDLE_TIMEOUT_MSG); 4025 nmsg.obj = msg.obj; 4026 mHandler.sendMessageDelayed(nmsg, IDLE_TIMEOUT); 4027 return; 4028 } 4029 // We don't at this point know if the activity is fullscreen, 4030 // so we need to be conservative and assume it isn't. 4031 activityIdleInternal((ActivityRecord)msg.obj); 4032 } break; 4033 case IDLE_NOW_MSG: { 4034 if (DEBUG_IDLE) Slog.d(TAG_IDLE, "handleMessage: IDLE_NOW_MSG: r=" + msg.obj); 4035 activityIdleInternal((ActivityRecord)msg.obj); 4036 } break; 4037 case RESUME_TOP_ACTIVITY_MSG: { 4038 synchronized (mService) { 4039 resumeTopActivitiesLocked(); 4040 } 4041 } break; 4042 case SLEEP_TIMEOUT_MSG: { 4043 synchronized (mService) { 4044 if (mService.isSleepingOrShuttingDown()) { 4045 Slog.w(TAG, "Sleep timeout! Sleeping now."); 4046 mSleepTimeout = true; 4047 checkReadyForSleepLocked(); 4048 } 4049 } 4050 } break; 4051 case LAUNCH_TIMEOUT_MSG: { 4052 if (mService.mDidDexOpt) { 4053 mService.mDidDexOpt = false; 4054 mHandler.sendEmptyMessageDelayed(LAUNCH_TIMEOUT_MSG, LAUNCH_TIMEOUT); 4055 return; 4056 } 4057 synchronized (mService) { 4058 if (mLaunchingActivity.isHeld()) { 4059 Slog.w(TAG, "Launch timeout has expired, giving up wake lock!"); 4060 if (VALIDATE_WAKE_LOCK_CALLER 4061 && Binder.getCallingUid() != Process.myUid()) { 4062 throw new IllegalStateException("Calling must be system uid"); 4063 } 4064 mLaunchingActivity.release(); 4065 } 4066 } 4067 } break; 4068 case HANDLE_DISPLAY_ADDED: { 4069 handleDisplayAdded(msg.arg1); 4070 } break; 4071 case HANDLE_DISPLAY_CHANGED: { 4072 handleDisplayChanged(msg.arg1); 4073 } break; 4074 case HANDLE_DISPLAY_REMOVED: { 4075 handleDisplayRemoved(msg.arg1); 4076 } break; 4077 case CONTAINER_CALLBACK_VISIBILITY: { 4078 final ActivityContainer container = (ActivityContainer) msg.obj; 4079 final IActivityContainerCallback callback = container.mCallback; 4080 if (callback != null) { 4081 try { 4082 callback.setVisible(container.asBinder(), msg.arg1 == 1); 4083 } catch (RemoteException e) { 4084 } 4085 } 4086 } break; 4087 case LOCK_TASK_START_MSG: { 4088 // When lock task starts, we disable the status bars. 4089 try { 4090 if (mLockTaskNotify == null) { 4091 mLockTaskNotify = new LockTaskNotify(mService.mContext); 4092 } 4093 mLockTaskNotify.show(true); 4094 mLockTaskModeState = msg.arg2; 4095 if (getStatusBarService() != null) { 4096 int flags = 0; 4097 if (mLockTaskModeState == LOCK_TASK_MODE_LOCKED) { 4098 flags = StatusBarManager.DISABLE_MASK 4099 & (~StatusBarManager.DISABLE_BACK); 4100 } else if (mLockTaskModeState == LOCK_TASK_MODE_PINNED) { 4101 flags = StatusBarManager.DISABLE_MASK 4102 & (~StatusBarManager.DISABLE_BACK) 4103 & (~StatusBarManager.DISABLE_HOME) 4104 & (~StatusBarManager.DISABLE_RECENT); 4105 } 4106 getStatusBarService().disable(flags, mToken, 4107 mService.mContext.getPackageName()); 4108 } 4109 mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG); 4110 if (getDevicePolicyManager() != null) { 4111 getDevicePolicyManager().notifyLockTaskModeChanged(true, 4112 (String)msg.obj, msg.arg1); 4113 } 4114 } catch (RemoteException ex) { 4115 throw new RuntimeException(ex); 4116 } 4117 } break; 4118 case LOCK_TASK_END_MSG: { 4119 // When lock task ends, we enable the status bars. 4120 try { 4121 if (getStatusBarService() != null) { 4122 getStatusBarService().disable(StatusBarManager.DISABLE_NONE, mToken, 4123 mService.mContext.getPackageName()); 4124 } 4125 mWindowManager.reenableKeyguard(mToken); 4126 if (getDevicePolicyManager() != null) { 4127 getDevicePolicyManager().notifyLockTaskModeChanged(false, null, 4128 msg.arg1); 4129 } 4130 if (mLockTaskNotify == null) { 4131 mLockTaskNotify = new LockTaskNotify(mService.mContext); 4132 } 4133 mLockTaskNotify.show(false); 4134 try { 4135 boolean shouldLockKeyguard = Settings.Secure.getInt( 4136 mService.mContext.getContentResolver(), 4137 Settings.Secure.LOCK_TO_APP_EXIT_LOCKED) != 0; 4138 if (mLockTaskModeState == LOCK_TASK_MODE_PINNED && shouldLockKeyguard) { 4139 mWindowManager.lockNow(null); 4140 mWindowManager.dismissKeyguard(); 4141 new LockPatternUtils(mService.mContext) 4142 .requireCredentialEntry(UserHandle.USER_ALL); 4143 } 4144 } catch (SettingNotFoundException e) { 4145 // No setting, don't lock. 4146 } 4147 } catch (RemoteException ex) { 4148 throw new RuntimeException(ex); 4149 } finally { 4150 mLockTaskModeState = LOCK_TASK_MODE_NONE; 4151 } 4152 } break; 4153 case SHOW_LOCK_TASK_ESCAPE_MESSAGE_MSG: { 4154 if (mLockTaskNotify == null) { 4155 mLockTaskNotify = new LockTaskNotify(mService.mContext); 4156 } 4157 mLockTaskNotify.showToast(LOCK_TASK_MODE_PINNED); 4158 } break; 4159 case CONTAINER_CALLBACK_TASK_LIST_EMPTY: { 4160 final ActivityContainer container = (ActivityContainer) msg.obj; 4161 final IActivityContainerCallback callback = container.mCallback; 4162 if (callback != null) { 4163 try { 4164 callback.onAllActivitiesComplete(container.asBinder()); 4165 } catch (RemoteException e) { 4166 } 4167 } 4168 } break; 4169 case LAUNCH_TASK_BEHIND_COMPLETE: { 4170 synchronized (mService) { 4171 ActivityRecord r = ActivityRecord.forTokenLocked((IBinder) msg.obj); 4172 if (r != null) { 4173 handleLaunchTaskBehindCompleteLocked(r); 4174 } 4175 } 4176 } break; 4177 } 4178 } 4179 } 4180 4181 class ActivityContainer extends android.app.IActivityContainer.Stub { 4182 final static int FORCE_NEW_TASK_FLAGS = Intent.FLAG_ACTIVITY_NEW_TASK | 4183 Intent.FLAG_ACTIVITY_MULTIPLE_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION; 4184 final int mStackId; 4185 IActivityContainerCallback mCallback = null; 4186 final ActivityStack mStack; 4187 ActivityRecord mParentActivity = null; 4188 String mIdString; 4189 4190 boolean mVisible = true; 4191 4192 /** Display this ActivityStack is currently on. Null if not attached to a Display. */ 4193 ActivityDisplay mActivityDisplay; 4194 4195 final static int CONTAINER_STATE_HAS_SURFACE = 0; 4196 final static int CONTAINER_STATE_NO_SURFACE = 1; 4197 final static int CONTAINER_STATE_FINISHING = 2; 4198 int mContainerState = CONTAINER_STATE_HAS_SURFACE; 4199 ActivityContainer(int stackId)4200 ActivityContainer(int stackId) { 4201 synchronized (mService) { 4202 mStackId = stackId; 4203 mStack = new ActivityStack(this, mRecentTasks); 4204 mIdString = "ActivtyContainer{" + mStackId + "}"; 4205 if (DEBUG_STACK) Slog.d(TAG_STACK, "Creating " + this); 4206 } 4207 } 4208 attachToDisplayLocked(ActivityDisplay activityDisplay)4209 void attachToDisplayLocked(ActivityDisplay activityDisplay) { 4210 if (DEBUG_STACK) Slog.d(TAG_STACK, "attachToDisplayLocked: " + this 4211 + " to display=" + activityDisplay); 4212 mActivityDisplay = activityDisplay; 4213 mStack.mDisplayId = activityDisplay.mDisplayId; 4214 mStack.mStacks = activityDisplay.mStacks; 4215 4216 activityDisplay.attachActivities(mStack); 4217 mWindowManager.attachStack(mStackId, activityDisplay.mDisplayId); 4218 } 4219 4220 @Override attachToDisplay(int displayId)4221 public void attachToDisplay(int displayId) { 4222 synchronized (mService) { 4223 ActivityDisplay activityDisplay = mActivityDisplays.get(displayId); 4224 if (activityDisplay == null) { 4225 return; 4226 } 4227 attachToDisplayLocked(activityDisplay); 4228 } 4229 } 4230 4231 @Override getDisplayId()4232 public int getDisplayId() { 4233 synchronized (mService) { 4234 if (mActivityDisplay != null) { 4235 return mActivityDisplay.mDisplayId; 4236 } 4237 } 4238 return -1; 4239 } 4240 4241 @Override getStackId()4242 public int getStackId() { 4243 synchronized (mService) { 4244 return mStackId; 4245 } 4246 } 4247 4248 @Override injectEvent(InputEvent event)4249 public boolean injectEvent(InputEvent event) { 4250 final long origId = Binder.clearCallingIdentity(); 4251 try { 4252 synchronized (mService) { 4253 if (mActivityDisplay != null) { 4254 return mInputManagerInternal.injectInputEvent(event, 4255 mActivityDisplay.mDisplayId, 4256 InputManager.INJECT_INPUT_EVENT_MODE_ASYNC); 4257 } 4258 } 4259 return false; 4260 } finally { 4261 Binder.restoreCallingIdentity(origId); 4262 } 4263 } 4264 4265 @Override release()4266 public void release() { 4267 synchronized (mService) { 4268 if (mContainerState == CONTAINER_STATE_FINISHING) { 4269 return; 4270 } 4271 mContainerState = CONTAINER_STATE_FINISHING; 4272 4273 long origId = Binder.clearCallingIdentity(); 4274 try { 4275 mStack.finishAllActivitiesLocked(false); 4276 removePendingActivityLaunchesLocked(mStack); 4277 } finally { 4278 Binder.restoreCallingIdentity(origId); 4279 } 4280 } 4281 } 4282 detachLocked()4283 protected void detachLocked() { 4284 if (DEBUG_STACK) Slog.d(TAG_STACK, "detachLocked: " + this + " from display=" 4285 + mActivityDisplay + " Callers=" + Debug.getCallers(2)); 4286 if (mActivityDisplay != null) { 4287 mActivityDisplay.detachActivitiesLocked(mStack); 4288 mActivityDisplay = null; 4289 mStack.mDisplayId = -1; 4290 mStack.mStacks = null; 4291 mWindowManager.detachStack(mStackId); 4292 } 4293 } 4294 4295 @Override startActivity(Intent intent)4296 public final int startActivity(Intent intent) { 4297 mService.enforceNotIsolatedCaller("ActivityContainer.startActivity"); 4298 final int userId = mService.handleIncomingUser(Binder.getCallingPid(), 4299 Binder.getCallingUid(), mCurrentUser, false, 4300 ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null); 4301 4302 // TODO: Switch to user app stacks here. 4303 String mimeType = intent.getType(); 4304 final Uri data = intent.getData(); 4305 if (mimeType == null && data != null && "content".equals(data.getScheme())) { 4306 mimeType = mService.getProviderMimeType(data, userId); 4307 } 4308 checkEmbeddedAllowedInner(userId, intent, mimeType); 4309 4310 intent.addFlags(FORCE_NEW_TASK_FLAGS); 4311 return startActivityMayWait(null, -1, null, intent, mimeType, null, null, null, null, 4312 0, 0, null, null, null, null, false, userId, this, null); 4313 } 4314 4315 @Override startActivityIntentSender(IIntentSender intentSender)4316 public final int startActivityIntentSender(IIntentSender intentSender) 4317 throws TransactionTooLargeException { 4318 mService.enforceNotIsolatedCaller("ActivityContainer.startActivityIntentSender"); 4319 4320 if (!(intentSender instanceof PendingIntentRecord)) { 4321 throw new IllegalArgumentException("Bad PendingIntent object"); 4322 } 4323 4324 final int userId = mService.handleIncomingUser(Binder.getCallingPid(), 4325 Binder.getCallingUid(), mCurrentUser, false, 4326 ActivityManagerService.ALLOW_FULL_ONLY, "ActivityContainer", null); 4327 4328 final PendingIntentRecord pendingIntent = (PendingIntentRecord) intentSender; 4329 checkEmbeddedAllowedInner(userId, pendingIntent.key.requestIntent, 4330 pendingIntent.key.requestResolvedType); 4331 4332 return pendingIntent.sendInner(0, null, null, null, null, null, null, 0, 4333 FORCE_NEW_TASK_FLAGS, FORCE_NEW_TASK_FLAGS, null, this); 4334 } 4335 checkEmbeddedAllowedInner(int userId, Intent intent, String resolvedType)4336 private void checkEmbeddedAllowedInner(int userId, Intent intent, String resolvedType) { 4337 ActivityInfo aInfo = resolveActivity(intent, resolvedType, 0, null, userId); 4338 if (aInfo != null && (aInfo.flags & ActivityInfo.FLAG_ALLOW_EMBEDDED) == 0) { 4339 throw new SecurityException( 4340 "Attempt to embed activity that has not set allowEmbedded=\"true\""); 4341 } 4342 } 4343 4344 @Override asBinder()4345 public IBinder asBinder() { 4346 return this; 4347 } 4348 4349 @Override setSurface(Surface surface, int width, int height, int density)4350 public void setSurface(Surface surface, int width, int height, int density) { 4351 mService.enforceNotIsolatedCaller("ActivityContainer.attachToSurface"); 4352 } 4353 getOuter()4354 ActivityStackSupervisor getOuter() { 4355 return ActivityStackSupervisor.this; 4356 } 4357 isAttachedLocked()4358 boolean isAttachedLocked() { 4359 return mActivityDisplay != null; 4360 } 4361 getBounds(Point outBounds)4362 void getBounds(Point outBounds) { 4363 synchronized (mService) { 4364 if (mActivityDisplay != null) { 4365 mActivityDisplay.getBounds(outBounds); 4366 } else { 4367 outBounds.set(0, 0); 4368 } 4369 } 4370 } 4371 4372 // TODO: Make sure every change to ActivityRecord.visible results in a call to this. setVisible(boolean visible)4373 void setVisible(boolean visible) { 4374 if (mVisible != visible) { 4375 mVisible = visible; 4376 if (mCallback != null) { 4377 mHandler.obtainMessage(CONTAINER_CALLBACK_VISIBILITY, visible ? 1 : 0, 4378 0 /* unused */, this).sendToTarget(); 4379 } 4380 } 4381 } 4382 setDrawn()4383 void setDrawn() { 4384 } 4385 4386 // You can always start a new task on a regular ActivityStack. isEligibleForNewTasks()4387 boolean isEligibleForNewTasks() { 4388 return true; 4389 } 4390 onTaskListEmptyLocked()4391 void onTaskListEmptyLocked() { 4392 detachLocked(); 4393 deleteActivityContainer(this); 4394 mHandler.obtainMessage(CONTAINER_CALLBACK_TASK_LIST_EMPTY, this).sendToTarget(); 4395 } 4396 4397 @Override toString()4398 public String toString() { 4399 return mIdString + (mActivityDisplay == null ? "N" : "A"); 4400 } 4401 } 4402 4403 private class VirtualActivityContainer extends ActivityContainer { 4404 Surface mSurface; 4405 boolean mDrawn = false; 4406 VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback)4407 VirtualActivityContainer(ActivityRecord parent, IActivityContainerCallback callback) { 4408 super(getNextStackId()); 4409 mParentActivity = parent; 4410 mCallback = callback; 4411 mContainerState = CONTAINER_STATE_NO_SURFACE; 4412 mIdString = "VirtualActivityContainer{" + mStackId + ", parent=" + mParentActivity + "}"; 4413 } 4414 4415 @Override setSurface(Surface surface, int width, int height, int density)4416 public void setSurface(Surface surface, int width, int height, int density) { 4417 super.setSurface(surface, width, height, density); 4418 4419 synchronized (mService) { 4420 final long origId = Binder.clearCallingIdentity(); 4421 try { 4422 setSurfaceLocked(surface, width, height, density); 4423 } finally { 4424 Binder.restoreCallingIdentity(origId); 4425 } 4426 } 4427 } 4428 setSurfaceLocked(Surface surface, int width, int height, int density)4429 private void setSurfaceLocked(Surface surface, int width, int height, int density) { 4430 if (mContainerState == CONTAINER_STATE_FINISHING) { 4431 return; 4432 } 4433 VirtualActivityDisplay virtualActivityDisplay = 4434 (VirtualActivityDisplay) mActivityDisplay; 4435 if (virtualActivityDisplay == null) { 4436 virtualActivityDisplay = 4437 new VirtualActivityDisplay(width, height, density); 4438 mActivityDisplay = virtualActivityDisplay; 4439 mActivityDisplays.put(virtualActivityDisplay.mDisplayId, virtualActivityDisplay); 4440 attachToDisplayLocked(virtualActivityDisplay); 4441 } 4442 4443 if (mSurface != null) { 4444 mSurface.release(); 4445 } 4446 4447 mSurface = surface; 4448 if (surface != null) { 4449 mStack.resumeTopActivityLocked(null); 4450 } else { 4451 mContainerState = CONTAINER_STATE_NO_SURFACE; 4452 ((VirtualActivityDisplay) mActivityDisplay).setSurface(null); 4453 if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) { 4454 mStack.startPausingLocked(false, true, false, false); 4455 } 4456 } 4457 4458 setSurfaceIfReadyLocked(); 4459 4460 if (DEBUG_STACK) Slog.d(TAG_STACK, 4461 "setSurface: " + this + " to display=" + virtualActivityDisplay); 4462 } 4463 4464 @Override isAttachedLocked()4465 boolean isAttachedLocked() { 4466 return mSurface != null && super.isAttachedLocked(); 4467 } 4468 4469 @Override setDrawn()4470 void setDrawn() { 4471 synchronized (mService) { 4472 mDrawn = true; 4473 setSurfaceIfReadyLocked(); 4474 } 4475 } 4476 4477 // Never start a new task on an ActivityView if it isn't explicitly specified. 4478 @Override isEligibleForNewTasks()4479 boolean isEligibleForNewTasks() { 4480 return false; 4481 } 4482 setSurfaceIfReadyLocked()4483 private void setSurfaceIfReadyLocked() { 4484 if (DEBUG_STACK) Slog.v(TAG_STACK, "setSurfaceIfReadyLocked: mDrawn=" + mDrawn + 4485 " mContainerState=" + mContainerState + " mSurface=" + mSurface); 4486 if (mDrawn && mSurface != null && mContainerState == CONTAINER_STATE_NO_SURFACE) { 4487 ((VirtualActivityDisplay) mActivityDisplay).setSurface(mSurface); 4488 mContainerState = CONTAINER_STATE_HAS_SURFACE; 4489 } 4490 } 4491 } 4492 4493 /** Exactly one of these classes per Display in the system. Capable of holding zero or more 4494 * attached {@link ActivityStack}s */ 4495 class ActivityDisplay { 4496 /** Actual Display this object tracks. */ 4497 int mDisplayId; 4498 Display mDisplay; 4499 DisplayInfo mDisplayInfo = new DisplayInfo(); 4500 4501 /** All of the stacks on this display. Order matters, topmost stack is in front of all other 4502 * stacks, bottommost behind. Accessed directly by ActivityManager package classes */ 4503 final ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>(); 4504 4505 ActivityRecord mVisibleBehindActivity; 4506 ActivityDisplay()4507 ActivityDisplay() { 4508 } 4509 4510 // After instantiation, check that mDisplay is not null before using this. The alternative 4511 // is for this to throw an exception if mDisplayManager.getDisplay() returns null. ActivityDisplay(int displayId)4512 ActivityDisplay(int displayId) { 4513 final Display display = mDisplayManager.getDisplay(displayId); 4514 if (display == null) { 4515 return; 4516 } 4517 init(display); 4518 } 4519 init(Display display)4520 void init(Display display) { 4521 mDisplay = display; 4522 mDisplayId = display.getDisplayId(); 4523 mDisplay.getDisplayInfo(mDisplayInfo); 4524 } 4525 attachActivities(ActivityStack stack)4526 void attachActivities(ActivityStack stack) { 4527 if (DEBUG_STACK) Slog.v(TAG_STACK, 4528 "attachActivities: attaching " + stack + " to displayId=" + mDisplayId); 4529 mStacks.add(stack); 4530 } 4531 detachActivitiesLocked(ActivityStack stack)4532 void detachActivitiesLocked(ActivityStack stack) { 4533 if (DEBUG_STACK) Slog.v(TAG_STACK, "detachActivitiesLocked: detaching " + stack 4534 + " from displayId=" + mDisplayId); 4535 mStacks.remove(stack); 4536 } 4537 getBounds(Point bounds)4538 void getBounds(Point bounds) { 4539 mDisplay.getDisplayInfo(mDisplayInfo); 4540 bounds.x = mDisplayInfo.appWidth; 4541 bounds.y = mDisplayInfo.appHeight; 4542 } 4543 setVisibleBehindActivity(ActivityRecord r)4544 void setVisibleBehindActivity(ActivityRecord r) { 4545 mVisibleBehindActivity = r; 4546 } 4547 hasVisibleBehindActivity()4548 boolean hasVisibleBehindActivity() { 4549 return mVisibleBehindActivity != null; 4550 } 4551 4552 @Override toString()4553 public String toString() { 4554 return "ActivityDisplay={" + mDisplayId + " numStacks=" + mStacks.size() + "}"; 4555 } 4556 } 4557 4558 class VirtualActivityDisplay extends ActivityDisplay { 4559 VirtualDisplay mVirtualDisplay; 4560 VirtualActivityDisplay(int width, int height, int density)4561 VirtualActivityDisplay(int width, int height, int density) { 4562 DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance(); 4563 mVirtualDisplay = dm.createVirtualDisplay(mService.mContext, null, 4564 VIRTUAL_DISPLAY_BASE_NAME, width, height, density, null, 4565 DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | 4566 DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY, null, null); 4567 4568 init(mVirtualDisplay.getDisplay()); 4569 4570 mWindowManager.handleDisplayAdded(mDisplayId); 4571 } 4572 setSurface(Surface surface)4573 void setSurface(Surface surface) { 4574 if (mVirtualDisplay != null) { 4575 mVirtualDisplay.setSurface(surface); 4576 } 4577 } 4578 4579 @Override detachActivitiesLocked(ActivityStack stack)4580 void detachActivitiesLocked(ActivityStack stack) { 4581 super.detachActivitiesLocked(stack); 4582 if (mVirtualDisplay != null) { 4583 mVirtualDisplay.release(); 4584 mVirtualDisplay = null; 4585 } 4586 } 4587 4588 @Override toString()4589 public String toString() { 4590 return "VirtualActivityDisplay={" + mDisplayId + "}"; 4591 } 4592 } 4593 isLeanbackOnlyDevice()4594 private boolean isLeanbackOnlyDevice() { 4595 boolean onLeanbackOnly = false; 4596 try { 4597 onLeanbackOnly = AppGlobals.getPackageManager().hasSystemFeature( 4598 PackageManager.FEATURE_LEANBACK_ONLY); 4599 } catch (RemoteException e) { 4600 // noop 4601 } 4602 4603 return onLeanbackOnly; 4604 } 4605 } 4606