1 /* 2 * Copyright (C) 2018 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.wm; 18 19 import static android.Manifest.permission.BIND_VOICE_INTERACTION; 20 import static android.Manifest.permission.CHANGE_CONFIGURATION; 21 import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS; 22 import static android.Manifest.permission.INTERACT_ACROSS_USERS; 23 import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL; 24 import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; 25 import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS; 26 import static android.Manifest.permission.READ_FRAME_BUFFER; 27 import static android.Manifest.permission.REMOVE_TASKS; 28 import static android.Manifest.permission.START_TASKS_FROM_RECENTS; 29 import static android.Manifest.permission.STOP_APP_SWITCHES; 30 import static android.app.ActivityManager.LOCK_TASK_MODE_NONE; 31 import static android.app.ActivityManagerInternal.ALLOW_FULL_ONLY; 32 import static android.app.ActivityTaskManager.INVALID_TASK_ID; 33 import static android.app.ActivityTaskManager.RESIZE_MODE_PRESERVE_WINDOW; 34 import static android.app.ActivityTaskManager.SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT; 35 import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; 36 import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; 37 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; 38 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED; 39 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY; 40 import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY; 41 import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; 42 import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; 43 import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; 44 import static android.content.pm.ApplicationInfo.FLAG_FACTORY_TEST; 45 import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED; 46 import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS; 47 import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT; 48 import static android.content.pm.PackageManager.FEATURE_PC; 49 import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE; 50 import static android.content.pm.PackageManager.PERMISSION_GRANTED; 51 import static android.content.res.Configuration.UI_MODE_TYPE_TELEVISION; 52 import static android.os.Build.VERSION_CODES.N; 53 import static android.os.FactoryTest.FACTORY_TEST_HIGH_LEVEL; 54 import static android.os.FactoryTest.FACTORY_TEST_LOW_LEVEL; 55 import static android.os.FactoryTest.FACTORY_TEST_OFF; 56 import static android.os.Process.FIRST_APPLICATION_UID; 57 import static android.os.Process.SYSTEM_UID; 58 import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; 59 import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT; 60 import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES; 61 import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RTL; 62 import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS; 63 import static android.provider.Settings.System.FONT_SCALE; 64 import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICATION; 65 import static android.text.format.DateUtils.MINUTE_IN_MILLIS; 66 import static android.view.Display.DEFAULT_DISPLAY; 67 import static android.view.Display.INVALID_DISPLAY; 68 import static android.view.WindowManager.TRANSIT_NONE; 69 import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; 70 71 import static com.android.server.am.ActivityManagerService.ANR_TRACE_DIR; 72 import static com.android.server.am.ActivityManagerService.MY_PID; 73 import static com.android.server.am.ActivityManagerService.STOCK_PM_FLAGS; 74 import static com.android.server.am.ActivityManagerService.dumpStackTraces; 75 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CONFIG_WILL_CHANGE; 76 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CONTROLLER; 77 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CURRENT_TRACKER; 78 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.Controller.IS_A_MONKEY; 79 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.GLOBAL_CONFIGURATION; 80 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.GOING_TO_SLEEP; 81 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HEAVY_WEIGHT_PROC; 82 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HOME_PROC; 83 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.LAUNCHING_ACTIVITY; 84 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC; 85 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS; 86 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.SCREEN_COMPAT_PACKAGES; 87 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.MODE; 88 import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.PACKAGE; 89 import static com.android.server.wm.ActivityStack.REMOVE_TASK_MODE_DESTROYING; 90 import static com.android.server.wm.ActivityStackSupervisor.DEFER_RESUME; 91 import static com.android.server.wm.ActivityStackSupervisor.ON_TOP; 92 import static com.android.server.wm.ActivityStackSupervisor.PRESERVE_WINDOWS; 93 import static com.android.server.wm.ActivityStackSupervisor.REMOVE_FROM_RECENTS; 94 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL; 95 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION; 96 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_FOCUS; 97 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_IMMERSIVE; 98 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_LOCKTASK; 99 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_STACK; 100 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH; 101 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_TASKS; 102 import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY; 103 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION; 104 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_FOCUS; 105 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_IMMERSIVE; 106 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK; 107 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_STACK; 108 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH; 109 import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_VISIBILITY; 110 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM; 111 import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; 112 import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT; 113 import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_DATA; 114 import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS; 115 import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE; 116 import static com.android.server.wm.ActivityTaskManagerService.H.REPORT_TIME_TRACKER_MSG; 117 import static com.android.server.wm.ActivityTaskManagerService.UiHandler.DISMISS_DIALOG_UI_MSG; 118 import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE; 119 import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION; 120 import static com.android.server.wm.RootActivityContainer.MATCH_TASK_IN_STACKS_ONLY; 121 import static com.android.server.wm.RootActivityContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS; 122 import static com.android.server.wm.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK; 123 import static com.android.server.wm.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT; 124 import static com.android.server.wm.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE; 125 126 import android.Manifest; 127 import android.annotation.NonNull; 128 import android.annotation.Nullable; 129 import android.annotation.UserIdInt; 130 import android.app.Activity; 131 import android.app.ActivityManager; 132 import android.app.ActivityManagerInternal; 133 import android.app.ActivityOptions; 134 import android.app.ActivityTaskManager; 135 import android.app.ActivityThread; 136 import android.app.AlertDialog; 137 import android.app.AppGlobals; 138 import android.app.AppOpsManager; 139 import android.app.Dialog; 140 import android.app.IActivityController; 141 import android.app.IActivityTaskManager; 142 import android.app.IApplicationThread; 143 import android.app.IAssistDataReceiver; 144 import android.app.INotificationManager; 145 import android.app.IRequestFinishCallback; 146 import android.app.ITaskStackListener; 147 import android.app.Notification; 148 import android.app.NotificationManager; 149 import android.app.PendingIntent; 150 import android.app.PictureInPictureParams; 151 import android.app.ProfilerInfo; 152 import android.app.RemoteAction; 153 import android.app.WaitResult; 154 import android.app.WindowConfiguration; 155 import android.app.admin.DevicePolicyCache; 156 import android.app.assist.AssistContent; 157 import android.app.assist.AssistStructure; 158 import android.app.usage.UsageStatsManagerInternal; 159 import android.content.ActivityNotFoundException; 160 import android.content.ComponentName; 161 import android.content.ContentResolver; 162 import android.content.Context; 163 import android.content.DialogInterface; 164 import android.content.IIntentSender; 165 import android.content.Intent; 166 import android.content.pm.ActivityInfo; 167 import android.content.pm.ApplicationInfo; 168 import android.content.pm.ConfigurationInfo; 169 import android.content.pm.IPackageManager; 170 import android.content.pm.PackageManager; 171 import android.content.pm.PackageManagerInternal; 172 import android.content.pm.ParceledListSlice; 173 import android.content.pm.ResolveInfo; 174 import android.content.res.CompatibilityInfo; 175 import android.content.res.Configuration; 176 import android.content.res.Resources; 177 import android.database.ContentObserver; 178 import android.graphics.Bitmap; 179 import android.graphics.Point; 180 import android.graphics.Rect; 181 import android.metrics.LogMaker; 182 import android.net.Uri; 183 import android.os.Binder; 184 import android.os.Build; 185 import android.os.Bundle; 186 import android.os.FactoryTest; 187 import android.os.FileUtils; 188 import android.os.Handler; 189 import android.os.IBinder; 190 import android.os.IUserManager; 191 import android.os.LocaleList; 192 import android.os.Looper; 193 import android.os.Message; 194 import android.os.PersistableBundle; 195 import android.os.PowerManager; 196 import android.os.PowerManagerInternal; 197 import android.os.Process; 198 import android.os.RemoteException; 199 import android.os.ServiceManager; 200 import android.os.StrictMode; 201 import android.os.SystemClock; 202 import android.os.SystemProperties; 203 import android.os.Trace; 204 import android.os.UpdateLock; 205 import android.os.UserHandle; 206 import android.os.UserManager; 207 import android.os.WorkSource; 208 import android.os.storage.IStorageManager; 209 import android.os.storage.StorageManager; 210 import android.provider.Settings; 211 import android.service.voice.IVoiceInteractionSession; 212 import android.service.voice.VoiceInteractionManagerInternal; 213 import android.sysprop.DisplayProperties; 214 import android.telecom.TelecomManager; 215 import android.text.TextUtils; 216 import android.text.format.Time; 217 import android.util.ArrayMap; 218 import android.util.ArraySet; 219 import android.util.EventLog; 220 import android.util.Log; 221 import android.util.Slog; 222 import android.util.SparseArray; 223 import android.util.SparseIntArray; 224 import android.util.StatsLog; 225 import android.util.TimeUtils; 226 import android.util.proto.ProtoOutputStream; 227 import android.view.IRecentsAnimationRunner; 228 import android.view.RemoteAnimationAdapter; 229 import android.view.RemoteAnimationDefinition; 230 import android.view.WindowManager; 231 import android.view.inputmethod.InputMethodSystemProperty; 232 233 import com.android.internal.R; 234 import com.android.internal.annotations.VisibleForTesting; 235 import com.android.internal.app.AssistUtils; 236 import com.android.internal.app.IAppOpsService; 237 import com.android.internal.app.IVoiceInteractor; 238 import com.android.internal.app.ProcessMap; 239 import com.android.internal.logging.MetricsLogger; 240 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 241 import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; 242 import com.android.internal.notification.SystemNotificationChannels; 243 import com.android.internal.os.TransferPipe; 244 import com.android.internal.os.logging.MetricsLoggerWrapper; 245 import com.android.internal.policy.IKeyguardDismissCallback; 246 import com.android.internal.policy.KeyguardDismissCallback; 247 import com.android.internal.util.ArrayUtils; 248 import com.android.internal.util.FastPrintWriter; 249 import com.android.internal.util.Preconditions; 250 import com.android.internal.util.function.pooled.PooledLambda; 251 import com.android.server.AttributeCache; 252 import com.android.server.DeviceIdleController; 253 import com.android.server.LocalServices; 254 import com.android.server.SystemService; 255 import com.android.server.SystemServiceManager; 256 import com.android.server.UiThread; 257 import com.android.server.Watchdog; 258 import com.android.server.am.ActivityManagerService; 259 import com.android.server.am.ActivityManagerServiceDumpActivitiesProto; 260 import com.android.server.am.ActivityManagerServiceDumpProcessesProto; 261 import com.android.server.am.AppTimeTracker; 262 import com.android.server.am.BaseErrorDialog; 263 import com.android.server.am.EventLogTags; 264 import com.android.server.am.PendingIntentController; 265 import com.android.server.am.PendingIntentRecord; 266 import com.android.server.am.UserState; 267 import com.android.server.appop.AppOpsService; 268 import com.android.server.firewall.IntentFirewall; 269 import com.android.server.pm.UserManagerService; 270 import com.android.server.policy.PermissionPolicyInternal; 271 import com.android.server.uri.UriGrantsManagerInternal; 272 import com.android.server.vr.VrManagerInternal; 273 274 import java.io.BufferedReader; 275 import java.io.File; 276 import java.io.FileDescriptor; 277 import java.io.FileOutputStream; 278 import java.io.FileReader; 279 import java.io.IOException; 280 import java.io.PrintWriter; 281 import java.io.StringWriter; 282 import java.lang.annotation.ElementType; 283 import java.lang.annotation.Retention; 284 import java.lang.annotation.RetentionPolicy; 285 import java.lang.annotation.Target; 286 import java.lang.ref.WeakReference; 287 import java.text.DateFormat; 288 import java.util.ArrayList; 289 import java.util.Arrays; 290 import java.util.Date; 291 import java.util.HashMap; 292 import java.util.HashSet; 293 import java.util.List; 294 import java.util.Locale; 295 import java.util.Map; 296 import java.util.Set; 297 298 /** 299 * System service for managing activities and their containers (task, stacks, displays,... ). 300 * 301 * {@hide} 302 */ 303 public class ActivityTaskManagerService extends IActivityTaskManager.Stub { 304 private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskManagerService" : TAG_ATM; 305 private static final String TAG_STACK = TAG + POSTFIX_STACK; 306 private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH; 307 private static final String TAG_IMMERSIVE = TAG + POSTFIX_IMMERSIVE; 308 private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS; 309 private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY; 310 private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK; 311 private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION; 312 313 // How long we wait until we timeout on key dispatching. 314 public static final int KEY_DISPATCHING_TIMEOUT_MS = 5 * 1000; 315 // How long we wait until we timeout on key dispatching during instrumentation. 316 static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT_MS = 60 * 1000; 317 // How long we permit background activity starts after an activity in the process 318 // started or finished. 319 static final long ACTIVITY_BG_START_GRACE_PERIOD_MS = 10 * 1000; 320 321 /** Used to indicate that an app transition should be animated. */ 322 static final boolean ANIMATE = true; 323 324 /** Hardware-reported OpenGLES version. */ 325 final int GL_ES_VERSION; 326 327 public static final String DUMP_ACTIVITIES_CMD = "activities" ; 328 public static final String DUMP_ACTIVITIES_SHORT_CMD = "a" ; 329 public static final String DUMP_LASTANR_CMD = "lastanr" ; 330 public static final String DUMP_LASTANR_TRACES_CMD = "lastanr-traces" ; 331 public static final String DUMP_STARTER_CMD = "starter" ; 332 public static final String DUMP_CONTAINERS_CMD = "containers" ; 333 public static final String DUMP_RECENTS_CMD = "recents" ; 334 public static final String DUMP_RECENTS_SHORT_CMD = "r" ; 335 336 /** This activity is not being relaunched, or being relaunched for a non-resize reason. */ 337 public static final int RELAUNCH_REASON_NONE = 0; 338 /** This activity is being relaunched due to windowing mode change. */ 339 public static final int RELAUNCH_REASON_WINDOWING_MODE_RESIZE = 1; 340 /** This activity is being relaunched due to a free-resize operation. */ 341 public static final int RELAUNCH_REASON_FREE_RESIZE = 2; 342 343 Context mContext; 344 345 /** 346 * This Context is themable and meant for UI display (AlertDialogs, etc.). The theme can 347 * change at runtime. Use mContext for non-UI purposes. 348 */ 349 final Context mUiContext; 350 final ActivityThread mSystemThread; 351 H mH; 352 UiHandler mUiHandler; 353 ActivityManagerInternal mAmInternal; 354 UriGrantsManagerInternal mUgmInternal; 355 private PackageManagerInternal mPmInternal; 356 private PermissionPolicyInternal mPermissionPolicyInternal; 357 @VisibleForTesting 358 final ActivityTaskManagerInternal mInternal; 359 PowerManagerInternal mPowerManagerInternal; 360 private UsageStatsManagerInternal mUsageStatsInternal; 361 362 PendingIntentController mPendingIntentController; 363 IntentFirewall mIntentFirewall; 364 365 /* Global service lock used by the package the owns this service. */ 366 final WindowManagerGlobalLock mGlobalLock = new WindowManagerGlobalLock(); 367 /** 368 * It is the same instance as {@link mGlobalLock}, just declared as a type that the 369 * locked-region-code-injection does't recognize it. It is used to skip wrapping priority 370 * booster for places that are already in the scope of another booster (e.g. computing oom-adj). 371 * 372 * @see WindowManagerThreadPriorityBooster 373 */ 374 final Object mGlobalLockWithoutBoost = mGlobalLock; 375 ActivityStackSupervisor mStackSupervisor; 376 RootActivityContainer mRootActivityContainer; 377 WindowManagerService mWindowManager; 378 private UserManagerService mUserManager; 379 private AppOpsService mAppOpsService; 380 /** All active uids in the system. */ 381 private final MirrorActiveUids mActiveUids = new MirrorActiveUids(); 382 private final SparseArray<String> mPendingTempWhitelist = new SparseArray<>(); 383 /** All processes currently running that might have a window organized by name. */ 384 final ProcessMap<WindowProcessController> mProcessNames = new ProcessMap<>(); 385 /** All processes we currently have running mapped by pid and uid */ 386 final WindowProcessControllerMap mProcessMap = new WindowProcessControllerMap(); 387 /** This is the process holding what we currently consider to be the "home" activity. */ 388 WindowProcessController mHomeProcess; 389 /** The currently running heavy-weight process, if any. */ 390 WindowProcessController mHeavyWeightProcess = null; 391 boolean mHasHeavyWeightFeature; 392 /** 393 * This is the process holding the activity the user last visited that is in a different process 394 * from the one they are currently in. 395 */ 396 WindowProcessController mPreviousProcess; 397 /** The time at which the previous process was last visible. */ 398 long mPreviousProcessVisibleTime; 399 400 /** List of intents that were used to start the most recent tasks. */ 401 private RecentTasks mRecentTasks; 402 /** State of external calls telling us if the device is awake or asleep. */ 403 private boolean mKeyguardShown = false; 404 405 // Wrapper around VoiceInteractionServiceManager 406 private AssistUtils mAssistUtils; 407 408 // VoiceInteraction session ID that changes for each new request except when 409 // being called for multi-window assist in a single session. 410 private int mViSessionId = 1000; 411 412 // How long to wait in getAssistContextExtras for the activity and foreground services 413 // to respond with the result. 414 private static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500; 415 416 // How long top wait when going through the modern assist (which doesn't need to block 417 // on getting this result before starting to launch its UI). 418 private static final int PENDING_ASSIST_EXTRAS_LONG_TIMEOUT = 2000; 419 420 // How long to wait in getAutofillAssistStructure() for the activity to respond with the result. 421 private static final int PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT = 2000; 422 423 // Permission tokens are used to temporarily granted a trusted app the ability to call 424 // #startActivityAsCaller. A client is expected to dump its token after this time has elapsed, 425 // showing any appropriate error messages to the user. 426 private static final long START_AS_CALLER_TOKEN_TIMEOUT = 427 10 * MINUTE_IN_MILLIS; 428 429 // How long before the service actually expires a token. This is slightly longer than 430 // START_AS_CALLER_TOKEN_TIMEOUT, to provide a buffer so clients will rarely encounter the 431 // expiration exception. 432 private static final long START_AS_CALLER_TOKEN_TIMEOUT_IMPL = 433 START_AS_CALLER_TOKEN_TIMEOUT + 2 * 1000; 434 435 // How long the service will remember expired tokens, for the purpose of providing error 436 // messaging when a client uses an expired token. 437 private static final long START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT = 438 START_AS_CALLER_TOKEN_TIMEOUT_IMPL + 20 * MINUTE_IN_MILLIS; 439 440 // How long to whitelist the Services for when requested. 441 private static final int SERVICE_LAUNCH_IDLE_WHITELIST_DURATION_MS = 5 * 1000; 442 443 // Activity tokens of system activities that are delegating their call to 444 // #startActivityByCaller, keyed by the permissionToken granted to the delegate. 445 final HashMap<IBinder, IBinder> mStartActivitySources = new HashMap<>(); 446 447 // Permission tokens that have expired, but we remember for error reporting. 448 final ArrayList<IBinder> mExpiredStartAsCallerTokens = new ArrayList<>(); 449 450 private final ArrayList<PendingAssistExtras> mPendingAssistExtras = new ArrayList<>(); 451 452 // Keeps track of the active voice interaction service component, notified from 453 // VoiceInteractionManagerService 454 ComponentName mActiveVoiceInteractionServiceComponent; 455 456 // A map userId and all its companion app uids 457 private final Map<Integer, Set<Integer>> mCompanionAppUidsMap = new ArrayMap<>(); 458 459 VrController mVrController; 460 KeyguardController mKeyguardController; 461 private final ClientLifecycleManager mLifecycleManager; 462 private TaskChangeNotificationController mTaskChangeNotificationController; 463 /** The controller for all operations related to locktask. */ 464 private LockTaskController mLockTaskController; 465 private ActivityStartController mActivityStartController; 466 467 boolean mSuppressResizeConfigChanges; 468 469 private final UpdateConfigurationResult mTmpUpdateConfigurationResult = 470 new UpdateConfigurationResult(); 471 472 static final class UpdateConfigurationResult { 473 // Configuration changes that were updated. 474 int changes; 475 // If the activity was relaunched to match the new configuration. 476 boolean activityRelaunched; 477 reset()478 void reset() { 479 changes = 0; 480 activityRelaunched = false; 481 } 482 } 483 484 /** Current sequencing integer of the configuration, for skipping old configurations. */ 485 private int mConfigurationSeq; 486 // To cache the list of supported system locales 487 private String[] mSupportedSystemLocales = null; 488 489 /** 490 * Temp object used when global and/or display override configuration is updated. It is also 491 * sent to outer world instead of {@link #getGlobalConfiguration} because we don't trust 492 * anyone... 493 */ 494 private Configuration mTempConfig = new Configuration(); 495 496 /** Temporary to avoid allocations. */ 497 final StringBuilder mStringBuilder = new StringBuilder(256); 498 499 // Amount of time after a call to stopAppSwitches() during which we will 500 // prevent further untrusted switches from happening. 501 private static final long APP_SWITCH_DELAY_TIME = 5 * 1000; 502 503 /** 504 * The time at which we will allow normal application switches again, 505 * after a call to {@link #stopAppSwitches()}. 506 */ 507 private long mAppSwitchesAllowedTime; 508 /** 509 * This is set to true after the first switch after mAppSwitchesAllowedTime 510 * is set; any switches after that will clear the time. 511 */ 512 private boolean mDidAppSwitch; 513 514 /** 515 * Last stop app switches time, apps finished before this time cannot start background activity 516 * even if they are in grace period. 517 */ 518 private long mLastStopAppSwitchesTime; 519 520 IActivityController mController = null; 521 boolean mControllerIsAMonkey = false; 522 523 final int mFactoryTest; 524 525 /** Used to control how we initialize the service. */ 526 ComponentName mTopComponent; 527 String mTopAction = Intent.ACTION_MAIN; 528 String mTopData; 529 530 /** Profiling app information. */ 531 String mProfileApp = null; 532 WindowProcessController mProfileProc = null; 533 ProfilerInfo mProfilerInfo = null; 534 535 /** 536 * Dump of the activity state at the time of the last ANR. Cleared after 537 * {@link WindowManagerService#LAST_ANR_LIFETIME_DURATION_MSECS} 538 */ 539 String mLastANRState; 540 541 /** 542 * Used to retain an update lock when the foreground activity is in 543 * immersive mode. 544 */ 545 private final UpdateLock mUpdateLock = new UpdateLock("immersive"); 546 547 /** 548 * Packages that are being allowed to perform unrestricted app switches. Mapping is 549 * User -> Type -> uid. 550 */ 551 final SparseArray<ArrayMap<String, Integer>> mAllowAppSwitchUids = new SparseArray<>(); 552 553 /** The dimensions of the thumbnails in the Recents UI. */ 554 private int mThumbnailWidth; 555 private int mThumbnailHeight; 556 private float mFullscreenThumbnailScale; 557 558 /** 559 * Flag that indicates if multi-window is enabled. 560 * 561 * For any particular form of multi-window to be enabled, generic multi-window must be enabled 562 * in {@link com.android.internal.R.bool#config_supportsMultiWindow} config or 563 * {@link Settings.Global#DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES} development option set. 564 * At least one of the forms of multi-window must be enabled in order for this flag to be 565 * initialized to 'true'. 566 * 567 * @see #mSupportsSplitScreenMultiWindow 568 * @see #mSupportsFreeformWindowManagement 569 * @see #mSupportsPictureInPicture 570 * @see #mSupportsMultiDisplay 571 */ 572 boolean mSupportsMultiWindow; 573 boolean mSupportsSplitScreenMultiWindow; 574 boolean mSupportsFreeformWindowManagement; 575 boolean mSupportsPictureInPicture; 576 boolean mSupportsMultiDisplay; 577 boolean mForceResizableActivities; 578 579 final List<ActivityTaskManagerInternal.ScreenObserver> mScreenObservers = new ArrayList<>(); 580 581 // VR Vr2d Display Id. 582 int mVr2dDisplayId = INVALID_DISPLAY; 583 584 /** 585 * Set while we are wanting to sleep, to prevent any 586 * activities from being started/resumed. 587 * 588 * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping. 589 * 590 * Currently mSleeping is set to true when transitioning into the sleep state, and remains true 591 * while in the sleep state until there is a pending transition out of sleep, in which case 592 * mSleeping is set to false, and remains false while awake. 593 * 594 * Whether mSleeping can quickly toggled between true/false without the device actually 595 * display changing states is undefined. 596 */ 597 private boolean mSleeping = false; 598 599 /** 600 * The process state used for processes that are running the top activities. 601 * This changes between TOP and TOP_SLEEPING to following mSleeping. 602 */ 603 int mTopProcessState = ActivityManager.PROCESS_STATE_TOP; 604 605 // Whether we should show our dialogs (ANR, crash, etc) or just perform their default action 606 // automatically. Important for devices without direct input devices. 607 private boolean mShowDialogs = true; 608 609 /** Set if we are shutting down the system, similar to sleeping. */ 610 boolean mShuttingDown = false; 611 612 /** 613 * We want to hold a wake lock while running a voice interaction session, since 614 * this may happen with the screen off and we need to keep the CPU running to 615 * be able to continue to interact with the user. 616 */ 617 PowerManager.WakeLock mVoiceWakeLock; 618 619 /** 620 * Set while we are running a voice interaction. This overrides sleeping while it is active. 621 */ 622 IVoiceInteractionSession mRunningVoice; 623 624 /** 625 * The last resumed activity. This is identical to the current resumed activity most 626 * of the time but could be different when we're pausing one activity before we resume 627 * another activity. 628 */ 629 ActivityRecord mLastResumedActivity; 630 631 /** 632 * The activity that is currently being traced as the active resumed activity. 633 * 634 * @see #updateResumedAppTrace 635 */ 636 private @Nullable ActivityRecord mTracedResumedActivity; 637 638 /** If non-null, we are tracking the time the user spends in the currently focused app. */ 639 AppTimeTracker mCurAppTimeTracker; 640 641 private AppWarnings mAppWarnings; 642 643 /** 644 * Packages that the user has asked to have run in screen size 645 * compatibility mode instead of filling the screen. 646 */ 647 CompatModePackages mCompatModePackages; 648 649 private FontScaleSettingObserver mFontScaleSettingObserver; 650 651 private int mDeviceOwnerUid = Process.INVALID_UID; 652 653 private final class FontScaleSettingObserver extends ContentObserver { 654 private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE); 655 private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS); 656 FontScaleSettingObserver()657 public FontScaleSettingObserver() { 658 super(mH); 659 final ContentResolver resolver = mContext.getContentResolver(); 660 resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL); 661 resolver.registerContentObserver(mHideErrorDialogsUri, false, this, 662 UserHandle.USER_ALL); 663 } 664 665 @Override onChange(boolean selfChange, Uri uri, @UserIdInt int userId)666 public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) { 667 if (mFontScaleUri.equals(uri)) { 668 updateFontScaleIfNeeded(userId); 669 } else if (mHideErrorDialogsUri.equals(uri)) { 670 synchronized (mGlobalLock) { 671 updateShouldShowDialogsLocked(getGlobalConfiguration()); 672 } 673 } 674 } 675 } 676 677 /** Indicates that the method may be invoked frequently or is sensitive to performance. */ 678 @Target(ElementType.METHOD) 679 @Retention(RetentionPolicy.SOURCE) 680 @interface HotPath { 681 int NONE = 0; 682 int OOM_ADJUSTMENT = 1; 683 int LRU_UPDATE = 2; 684 int PROCESS_CHANGE = 3; caller()685 int caller() default NONE; 686 } 687 688 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) ActivityTaskManagerService(Context context)689 public ActivityTaskManagerService(Context context) { 690 mContext = context; 691 mFactoryTest = FactoryTest.getMode(); 692 mSystemThread = ActivityThread.currentActivityThread(); 693 mUiContext = mSystemThread.getSystemUiContext(); 694 mLifecycleManager = new ClientLifecycleManager(); 695 mInternal = new LocalService(); 696 GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", GL_ES_VERSION_UNDEFINED); 697 } 698 onSystemReady()699 public void onSystemReady() { 700 synchronized (mGlobalLock) { 701 mHasHeavyWeightFeature = mContext.getPackageManager().hasSystemFeature( 702 PackageManager.FEATURE_CANT_SAVE_STATE); 703 mAssistUtils = new AssistUtils(mContext); 704 mVrController.onSystemReady(); 705 mRecentTasks.onSystemReadyLocked(); 706 mStackSupervisor.onSystemReady(); 707 } 708 } 709 onInitPowerManagement()710 public void onInitPowerManagement() { 711 synchronized (mGlobalLock) { 712 mStackSupervisor.initPowerManagement(); 713 final PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE); 714 mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); 715 mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*"); 716 mVoiceWakeLock.setReferenceCounted(false); 717 } 718 } 719 installSystemProviders()720 public void installSystemProviders() { 721 mFontScaleSettingObserver = new FontScaleSettingObserver(); 722 } 723 retrieveSettings(ContentResolver resolver)724 public void retrieveSettings(ContentResolver resolver) { 725 final boolean freeformWindowManagement = 726 mContext.getPackageManager().hasSystemFeature(FEATURE_FREEFORM_WINDOW_MANAGEMENT) 727 || Settings.Global.getInt( 728 resolver, DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0; 729 730 final boolean supportsMultiWindow = ActivityTaskManager.supportsMultiWindow(mContext); 731 final boolean supportsPictureInPicture = supportsMultiWindow && 732 mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE); 733 final boolean supportsSplitScreenMultiWindow = 734 ActivityTaskManager.supportsSplitScreenMultiWindow(mContext); 735 final boolean supportsMultiDisplay = mContext.getPackageManager() 736 .hasSystemFeature(FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS); 737 final boolean forceRtl = Settings.Global.getInt(resolver, DEVELOPMENT_FORCE_RTL, 0) != 0; 738 final boolean forceResizable = Settings.Global.getInt( 739 resolver, DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES, 0) != 0; 740 final boolean isPc = mContext.getPackageManager().hasSystemFeature(FEATURE_PC); 741 742 // Transfer any global setting for forcing RTL layout, into a System Property 743 DisplayProperties.debug_force_rtl(forceRtl); 744 745 final Configuration configuration = new Configuration(); 746 Settings.System.getConfiguration(resolver, configuration); 747 if (forceRtl) { 748 // This will take care of setting the correct layout direction flags 749 configuration.setLayoutDirection(configuration.locale); 750 } 751 752 synchronized (mGlobalLock) { 753 mForceResizableActivities = forceResizable; 754 final boolean multiWindowFormEnabled = freeformWindowManagement 755 || supportsSplitScreenMultiWindow 756 || supportsPictureInPicture 757 || supportsMultiDisplay; 758 if ((supportsMultiWindow || forceResizable) && multiWindowFormEnabled) { 759 mSupportsMultiWindow = true; 760 mSupportsFreeformWindowManagement = freeformWindowManagement; 761 mSupportsSplitScreenMultiWindow = supportsSplitScreenMultiWindow; 762 mSupportsPictureInPicture = supportsPictureInPicture; 763 mSupportsMultiDisplay = supportsMultiDisplay; 764 } else { 765 mSupportsMultiWindow = false; 766 mSupportsFreeformWindowManagement = false; 767 mSupportsSplitScreenMultiWindow = false; 768 mSupportsPictureInPicture = false; 769 mSupportsMultiDisplay = false; 770 } 771 mWindowManager.setForceResizableTasks(mForceResizableActivities); 772 mWindowManager.setSupportsPictureInPicture(mSupportsPictureInPicture); 773 mWindowManager.setSupportsFreeformWindowManagement(mSupportsFreeformWindowManagement); 774 mWindowManager.setIsPc(isPc); 775 mWindowManager.mRoot.onSettingsRetrieved(); 776 // This happens before any activities are started, so we can change global configuration 777 // in-place. 778 updateConfigurationLocked(configuration, null, true); 779 final Configuration globalConfig = getGlobalConfiguration(); 780 if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Initial config: " + globalConfig); 781 782 // Load resources only after the current configuration has been set. 783 final Resources res = mContext.getResources(); 784 mThumbnailWidth = res.getDimensionPixelSize( 785 com.android.internal.R.dimen.thumbnail_width); 786 mThumbnailHeight = res.getDimensionPixelSize( 787 com.android.internal.R.dimen.thumbnail_height); 788 789 if ((globalConfig.uiMode & UI_MODE_TYPE_TELEVISION) == UI_MODE_TYPE_TELEVISION) { 790 mFullscreenThumbnailScale = (float) res 791 .getInteger(com.android.internal.R.integer.thumbnail_width_tv) / 792 (float) globalConfig.screenWidthDp; 793 } else { 794 mFullscreenThumbnailScale = res.getFraction( 795 com.android.internal.R.fraction.thumbnail_fullscreen_scale, 1, 1); 796 } 797 } 798 } 799 getGlobalLock()800 public WindowManagerGlobalLock getGlobalLock() { 801 return mGlobalLock; 802 } 803 804 /** For test purpose only. */ 805 @VisibleForTesting getAtmInternal()806 public ActivityTaskManagerInternal getAtmInternal() { 807 return mInternal; 808 } 809 initialize(IntentFirewall intentFirewall, PendingIntentController intentController, Looper looper)810 public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController, 811 Looper looper) { 812 mH = new H(looper); 813 mUiHandler = new UiHandler(); 814 mIntentFirewall = intentFirewall; 815 final File systemDir = SystemServiceManager.ensureSystemDir(); 816 mAppWarnings = new AppWarnings(this, mUiContext, mH, mUiHandler, systemDir); 817 mCompatModePackages = new CompatModePackages(this, systemDir, mH); 818 mPendingIntentController = intentController; 819 820 mTempConfig.setToDefaults(); 821 mTempConfig.setLocales(LocaleList.getDefault()); 822 mConfigurationSeq = mTempConfig.seq = 1; 823 mStackSupervisor = createStackSupervisor(); 824 mRootActivityContainer = new RootActivityContainer(this); 825 mRootActivityContainer.onConfigurationChanged(mTempConfig); 826 827 mTaskChangeNotificationController = 828 new TaskChangeNotificationController(mGlobalLock, mStackSupervisor, mH); 829 mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH); 830 mActivityStartController = new ActivityStartController(this); 831 mRecentTasks = createRecentTasks(); 832 mStackSupervisor.setRecentTasks(mRecentTasks); 833 mVrController = new VrController(mGlobalLock); 834 mKeyguardController = mStackSupervisor.getKeyguardController(); 835 } 836 onActivityManagerInternalAdded()837 public void onActivityManagerInternalAdded() { 838 synchronized (mGlobalLock) { 839 mAmInternal = LocalServices.getService(ActivityManagerInternal.class); 840 mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class); 841 } 842 } 843 increaseConfigurationSeqLocked()844 int increaseConfigurationSeqLocked() { 845 mConfigurationSeq = Math.max(++mConfigurationSeq, 1); 846 return mConfigurationSeq; 847 } 848 createStackSupervisor()849 protected ActivityStackSupervisor createStackSupervisor() { 850 final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mH.getLooper()); 851 supervisor.initialize(); 852 return supervisor; 853 } 854 setWindowManager(WindowManagerService wm)855 public void setWindowManager(WindowManagerService wm) { 856 synchronized (mGlobalLock) { 857 mWindowManager = wm; 858 mLockTaskController.setWindowManager(wm); 859 mStackSupervisor.setWindowManager(wm); 860 mRootActivityContainer.setWindowManager(wm); 861 } 862 } 863 setUsageStatsManager(UsageStatsManagerInternal usageStatsManager)864 public void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) { 865 synchronized (mGlobalLock) { 866 mUsageStatsInternal = usageStatsManager; 867 } 868 } 869 getUserManager()870 UserManagerService getUserManager() { 871 if (mUserManager == null) { 872 IBinder b = ServiceManager.getService(Context.USER_SERVICE); 873 mUserManager = (UserManagerService) IUserManager.Stub.asInterface(b); 874 } 875 return mUserManager; 876 } 877 getAppOpsService()878 AppOpsService getAppOpsService() { 879 if (mAppOpsService == null) { 880 IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE); 881 mAppOpsService = (AppOpsService) IAppOpsService.Stub.asInterface(b); 882 } 883 return mAppOpsService; 884 } 885 hasUserRestriction(String restriction, int userId)886 boolean hasUserRestriction(String restriction, int userId) { 887 return getUserManager().hasUserRestriction(restriction, userId); 888 } 889 hasSystemAlertWindowPermission(int callingUid, int callingPid, String callingPackage)890 boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, String callingPackage) { 891 final int mode = getAppOpsService().noteOperation(AppOpsManager.OP_SYSTEM_ALERT_WINDOW, 892 callingUid, callingPackage); 893 if (mode == AppOpsManager.MODE_DEFAULT) { 894 return checkPermission(Manifest.permission.SYSTEM_ALERT_WINDOW, callingPid, callingUid) 895 == PERMISSION_GRANTED; 896 } 897 return mode == AppOpsManager.MODE_ALLOWED; 898 } 899 createRecentTasks()900 protected RecentTasks createRecentTasks() { 901 return new RecentTasks(this, mStackSupervisor); 902 } 903 getRecentTasks()904 RecentTasks getRecentTasks() { 905 return mRecentTasks; 906 } 907 getLifecycleManager()908 ClientLifecycleManager getLifecycleManager() { 909 return mLifecycleManager; 910 } 911 getActivityStartController()912 ActivityStartController getActivityStartController() { 913 return mActivityStartController; 914 } 915 getTaskChangeNotificationController()916 TaskChangeNotificationController getTaskChangeNotificationController() { 917 return mTaskChangeNotificationController; 918 } 919 getLockTaskController()920 LockTaskController getLockTaskController() { 921 return mLockTaskController; 922 } 923 924 /** 925 * Return the global configuration used by the process corresponding to the input pid. This is 926 * usually the global configuration with some overrides specific to that process. 927 */ getGlobalConfigurationForCallingPid()928 Configuration getGlobalConfigurationForCallingPid() { 929 final int pid = Binder.getCallingPid(); 930 return getGlobalConfigurationForPid(pid); 931 } 932 933 /** 934 * Return the global configuration used by the process corresponding to the given pid. 935 */ getGlobalConfigurationForPid(int pid)936 Configuration getGlobalConfigurationForPid(int pid) { 937 if (pid == MY_PID || pid < 0) { 938 return getGlobalConfiguration(); 939 } 940 synchronized (mGlobalLock) { 941 final WindowProcessController app = mProcessMap.getProcess(pid); 942 return app != null ? app.getConfiguration() : getGlobalConfiguration(); 943 } 944 } 945 946 /** 947 * Return the device configuration info used by the process corresponding to the input pid. 948 * The value is consistent with the global configuration for the process. 949 */ 950 @Override getDeviceConfigurationInfo()951 public ConfigurationInfo getDeviceConfigurationInfo() { 952 ConfigurationInfo config = new ConfigurationInfo(); 953 synchronized (mGlobalLock) { 954 final Configuration globalConfig = getGlobalConfigurationForCallingPid(); 955 config.reqTouchScreen = globalConfig.touchscreen; 956 config.reqKeyboardType = globalConfig.keyboard; 957 config.reqNavigation = globalConfig.navigation; 958 if (globalConfig.navigation == Configuration.NAVIGATION_DPAD 959 || globalConfig.navigation == Configuration.NAVIGATION_TRACKBALL) { 960 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV; 961 } 962 if (globalConfig.keyboard != Configuration.KEYBOARD_UNDEFINED 963 && globalConfig.keyboard != Configuration.KEYBOARD_NOKEYS) { 964 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; 965 } 966 config.reqGlEsVersion = GL_ES_VERSION; 967 } 968 return config; 969 } 970 start()971 private void start() { 972 LocalServices.addService(ActivityTaskManagerInternal.class, mInternal); 973 } 974 975 public static final class Lifecycle extends SystemService { 976 private final ActivityTaskManagerService mService; 977 Lifecycle(Context context)978 public Lifecycle(Context context) { 979 super(context); 980 mService = new ActivityTaskManagerService(context); 981 } 982 983 @Override onStart()984 public void onStart() { 985 publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService); 986 mService.start(); 987 } 988 989 @Override onUnlockUser(int userId)990 public void onUnlockUser(int userId) { 991 synchronized (mService.getGlobalLock()) { 992 mService.mStackSupervisor.onUserUnlocked(userId); 993 } 994 } 995 996 @Override onCleanupUser(int userId)997 public void onCleanupUser(int userId) { 998 synchronized (mService.getGlobalLock()) { 999 mService.mStackSupervisor.mLaunchParamsPersister.onCleanupUser(userId); 1000 } 1001 } 1002 getService()1003 public ActivityTaskManagerService getService() { 1004 return mService; 1005 } 1006 } 1007 1008 @Override startActivity(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions)1009 public final int startActivity(IApplicationThread caller, String callingPackage, 1010 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, 1011 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) { 1012 return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo, 1013 resultWho, requestCode, startFlags, profilerInfo, bOptions, 1014 UserHandle.getCallingUserId()); 1015 } 1016 1017 @Override startActivities(IApplicationThread caller, String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions, int userId)1018 public final int startActivities(IApplicationThread caller, String callingPackage, 1019 Intent[] intents, String[] resolvedTypes, IBinder resultTo, Bundle bOptions, 1020 int userId) { 1021 final String reason = "startActivities"; 1022 enforceNotIsolatedCaller(reason); 1023 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, reason); 1024 // TODO: Switch to user app stacks here. 1025 return getActivityStartController().startActivities(caller, -1, 0, -1, callingPackage, 1026 intents, resolvedTypes, resultTo, SafeActivityOptions.fromBundle(bOptions), userId, 1027 reason, null /* originatingPendingIntent */, 1028 false /* allowBackgroundActivityStart */); 1029 } 1030 1031 @Override startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId)1032 public int startActivityAsUser(IApplicationThread caller, String callingPackage, 1033 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, 1034 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) { 1035 return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo, 1036 resultWho, requestCode, startFlags, profilerInfo, bOptions, userId, 1037 true /*validateIncomingUser*/); 1038 } 1039 startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser)1040 int startActivityAsUser(IApplicationThread caller, String callingPackage, 1041 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, 1042 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId, 1043 boolean validateIncomingUser) { 1044 enforceNotIsolatedCaller("startActivityAsUser"); 1045 1046 userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser, 1047 Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser"); 1048 1049 // TODO: Switch to user app stacks here. 1050 return getActivityStartController().obtainStarter(intent, "startActivityAsUser") 1051 .setCaller(caller) 1052 .setCallingPackage(callingPackage) 1053 .setResolvedType(resolvedType) 1054 .setResultTo(resultTo) 1055 .setResultWho(resultWho) 1056 .setRequestCode(requestCode) 1057 .setStartFlags(startFlags) 1058 .setProfilerInfo(profilerInfo) 1059 .setActivityOptions(bOptions) 1060 .setMayWait(userId) 1061 .execute(); 1062 1063 } 1064 1065 @Override startActivityIntentSender(IApplicationThread caller, IIntentSender target, IBinder whitelistToken, Intent fillInIntent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle bOptions)1066 public int startActivityIntentSender(IApplicationThread caller, IIntentSender target, 1067 IBinder whitelistToken, Intent fillInIntent, String resolvedType, IBinder resultTo, 1068 String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle bOptions) { 1069 enforceNotIsolatedCaller("startActivityIntentSender"); 1070 // Refuse possible leaked file descriptors 1071 if (fillInIntent != null && fillInIntent.hasFileDescriptors()) { 1072 throw new IllegalArgumentException("File descriptors passed in Intent"); 1073 } 1074 1075 if (!(target instanceof PendingIntentRecord)) { 1076 throw new IllegalArgumentException("Bad PendingIntent object"); 1077 } 1078 1079 PendingIntentRecord pir = (PendingIntentRecord)target; 1080 1081 synchronized (mGlobalLock) { 1082 // If this is coming from the currently resumed activity, it is 1083 // effectively saying that app switches are allowed at this point. 1084 final ActivityStack stack = getTopDisplayFocusedStack(); 1085 if (stack.mResumedActivity != null && 1086 stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) { 1087 mAppSwitchesAllowedTime = 0; 1088 } 1089 } 1090 return pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null, 1091 resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions); 1092 } 1093 1094 @Override startNextMatchingActivity(IBinder callingActivity, Intent intent, Bundle bOptions)1095 public boolean startNextMatchingActivity(IBinder callingActivity, Intent intent, 1096 Bundle bOptions) { 1097 // Refuse possible leaked file descriptors 1098 if (intent != null && intent.hasFileDescriptors()) { 1099 throw new IllegalArgumentException("File descriptors passed in Intent"); 1100 } 1101 SafeActivityOptions options = SafeActivityOptions.fromBundle(bOptions); 1102 1103 synchronized (mGlobalLock) { 1104 final ActivityRecord r = ActivityRecord.isInStackLocked(callingActivity); 1105 if (r == null) { 1106 SafeActivityOptions.abort(options); 1107 return false; 1108 } 1109 if (!r.attachedToProcess()) { 1110 // The caller is not running... d'oh! 1111 SafeActivityOptions.abort(options); 1112 return false; 1113 } 1114 intent = new Intent(intent); 1115 // The caller is not allowed to change the data. 1116 intent.setDataAndType(r.intent.getData(), r.intent.getType()); 1117 // And we are resetting to find the next component... 1118 intent.setComponent(null); 1119 1120 final boolean debug = ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0); 1121 1122 ActivityInfo aInfo = null; 1123 try { 1124 List<ResolveInfo> resolves = 1125 AppGlobals.getPackageManager().queryIntentActivities( 1126 intent, r.resolvedType, 1127 PackageManager.MATCH_DEFAULT_ONLY | STOCK_PM_FLAGS, 1128 UserHandle.getCallingUserId()).getList(); 1129 1130 // Look for the original activity in the list... 1131 final int N = resolves != null ? resolves.size() : 0; 1132 for (int i=0; i<N; i++) { 1133 ResolveInfo rInfo = resolves.get(i); 1134 if (rInfo.activityInfo.packageName.equals(r.packageName) 1135 && rInfo.activityInfo.name.equals(r.info.name)) { 1136 // We found the current one... the next matching is 1137 // after it. 1138 i++; 1139 if (i<N) { 1140 aInfo = resolves.get(i).activityInfo; 1141 } 1142 if (debug) { 1143 Slog.v(TAG, "Next matching activity: found current " + r.packageName 1144 + "/" + r.info.name); 1145 Slog.v(TAG, "Next matching activity: next is " + ((aInfo == null) 1146 ? "null" : aInfo.packageName + "/" + aInfo.name)); 1147 } 1148 break; 1149 } 1150 } 1151 } catch (RemoteException e) { 1152 } 1153 1154 if (aInfo == null) { 1155 // Nobody who is next! 1156 SafeActivityOptions.abort(options); 1157 if (debug) Slog.d(TAG, "Next matching activity: nothing found"); 1158 return false; 1159 } 1160 1161 intent.setComponent(new ComponentName( 1162 aInfo.applicationInfo.packageName, aInfo.name)); 1163 intent.setFlags(intent.getFlags()&~( 1164 Intent.FLAG_ACTIVITY_FORWARD_RESULT| 1165 Intent.FLAG_ACTIVITY_CLEAR_TOP| 1166 Intent.FLAG_ACTIVITY_MULTIPLE_TASK| 1167 FLAG_ACTIVITY_NEW_TASK)); 1168 1169 // Okay now we need to start the new activity, replacing the currently running activity. 1170 // This is a little tricky because we want to start the new one as if the current one is 1171 // finished, but not finish the current one first so that there is no flicker. 1172 // And thus... 1173 final boolean wasFinishing = r.finishing; 1174 r.finishing = true; 1175 1176 // Propagate reply information over to the new activity. 1177 final ActivityRecord resultTo = r.resultTo; 1178 final String resultWho = r.resultWho; 1179 final int requestCode = r.requestCode; 1180 r.resultTo = null; 1181 if (resultTo != null) { 1182 resultTo.removeResultsLocked(r, resultWho, requestCode); 1183 } 1184 1185 final long origId = Binder.clearCallingIdentity(); 1186 // TODO(b/64750076): Check if calling pid should really be -1. 1187 final int res = getActivityStartController() 1188 .obtainStarter(intent, "startNextMatchingActivity") 1189 .setCaller(r.app.getThread()) 1190 .setResolvedType(r.resolvedType) 1191 .setActivityInfo(aInfo) 1192 .setResultTo(resultTo != null ? resultTo.appToken : null) 1193 .setResultWho(resultWho) 1194 .setRequestCode(requestCode) 1195 .setCallingPid(-1) 1196 .setCallingUid(r.launchedFromUid) 1197 .setCallingPackage(r.launchedFromPackage) 1198 .setRealCallingPid(-1) 1199 .setRealCallingUid(r.launchedFromUid) 1200 .setActivityOptions(options) 1201 .execute(); 1202 Binder.restoreCallingIdentity(origId); 1203 1204 r.finishing = wasFinishing; 1205 if (res != ActivityManager.START_SUCCESS) { 1206 return false; 1207 } 1208 return true; 1209 } 1210 } 1211 1212 @Override startActivityAndWait(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId)1213 public final WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage, 1214 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, 1215 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) { 1216 final WaitResult res = new WaitResult(); 1217 synchronized (mGlobalLock) { 1218 enforceNotIsolatedCaller("startActivityAndWait"); 1219 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), 1220 userId, "startActivityAndWait"); 1221 // TODO: Switch to user app stacks here. 1222 getActivityStartController().obtainStarter(intent, "startActivityAndWait") 1223 .setCaller(caller) 1224 .setCallingPackage(callingPackage) 1225 .setResolvedType(resolvedType) 1226 .setResultTo(resultTo) 1227 .setResultWho(resultWho) 1228 .setRequestCode(requestCode) 1229 .setStartFlags(startFlags) 1230 .setActivityOptions(bOptions) 1231 .setMayWait(userId) 1232 .setProfilerInfo(profilerInfo) 1233 .setWaitResult(res) 1234 .execute(); 1235 } 1236 return res; 1237 } 1238 1239 @Override startActivityWithConfig(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, Configuration config, Bundle bOptions, int userId)1240 public final int startActivityWithConfig(IApplicationThread caller, String callingPackage, 1241 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, 1242 int startFlags, Configuration config, Bundle bOptions, int userId) { 1243 synchronized (mGlobalLock) { 1244 enforceNotIsolatedCaller("startActivityWithConfig"); 1245 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, 1246 "startActivityWithConfig"); 1247 // TODO: Switch to user app stacks here. 1248 return getActivityStartController().obtainStarter(intent, "startActivityWithConfig") 1249 .setCaller(caller) 1250 .setCallingPackage(callingPackage) 1251 .setResolvedType(resolvedType) 1252 .setResultTo(resultTo) 1253 .setResultWho(resultWho) 1254 .setRequestCode(requestCode) 1255 .setStartFlags(startFlags) 1256 .setGlobalConfiguration(config) 1257 .setActivityOptions(bOptions) 1258 .setMayWait(userId) 1259 .execute(); 1260 } 1261 } 1262 1263 1264 @Override requestStartActivityPermissionToken(IBinder delegatorToken)1265 public IBinder requestStartActivityPermissionToken(IBinder delegatorToken) { 1266 int callingUid = Binder.getCallingUid(); 1267 if (UserHandle.getAppId(callingUid) != SYSTEM_UID) { 1268 throw new SecurityException("Only the system process can request a permission token, " 1269 + "received request from uid: " + callingUid); 1270 } 1271 IBinder permissionToken = new Binder(); 1272 synchronized (mGlobalLock) { 1273 mStartActivitySources.put(permissionToken, delegatorToken); 1274 } 1275 1276 Message expireMsg = PooledLambda.obtainMessage( 1277 ActivityTaskManagerService::expireStartAsCallerTokenMsg, this, permissionToken); 1278 mUiHandler.sendMessageDelayed(expireMsg, START_AS_CALLER_TOKEN_TIMEOUT_IMPL); 1279 1280 Message forgetMsg = PooledLambda.obtainMessage( 1281 ActivityTaskManagerService::forgetStartAsCallerTokenMsg, this, permissionToken); 1282 mUiHandler.sendMessageDelayed(forgetMsg, START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT); 1283 1284 return permissionToken; 1285 } 1286 1287 @Override startActivityAsCaller(IApplicationThread caller, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, IBinder permissionToken, boolean ignoreTargetSecurity, int userId)1288 public final int startActivityAsCaller(IApplicationThread caller, String callingPackage, 1289 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, 1290 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, IBinder permissionToken, 1291 boolean ignoreTargetSecurity, int userId) { 1292 // This is very dangerous -- it allows you to perform a start activity (including 1293 // permission grants) as any app that may launch one of your own activities. So we only 1294 // allow this in two cases: 1295 // 1) The caller is an activity that is part of the core framework, and then only when it 1296 // is running as the system. 1297 // 2) The caller provides a valid permissionToken. Permission tokens are one-time use and 1298 // can only be requested by a system activity, which may then delegate this call to 1299 // another app. 1300 final ActivityRecord sourceRecord; 1301 final int targetUid; 1302 final String targetPackage; 1303 final boolean isResolver; 1304 synchronized (mGlobalLock) { 1305 if (resultTo == null) { 1306 throw new SecurityException("Must be called from an activity"); 1307 } 1308 final IBinder sourceToken; 1309 if (permissionToken != null) { 1310 // To even attempt to use a permissionToken, an app must also have this signature 1311 // permission. 1312 mAmInternal.enforceCallingPermission( 1313 android.Manifest.permission.START_ACTIVITY_AS_CALLER, 1314 "startActivityAsCaller"); 1315 // If called with a permissionToken, we want the sourceRecord from the delegator 1316 // activity that requested this token. 1317 sourceToken = mStartActivitySources.remove(permissionToken); 1318 if (sourceToken == null) { 1319 // Invalid permissionToken, check if it recently expired. 1320 if (mExpiredStartAsCallerTokens.contains(permissionToken)) { 1321 throw new SecurityException("Called with expired permission token: " 1322 + permissionToken); 1323 } else { 1324 throw new SecurityException("Called with invalid permission token: " 1325 + permissionToken); 1326 } 1327 } 1328 } else { 1329 // This method was called directly by the source. 1330 sourceToken = resultTo; 1331 } 1332 1333 sourceRecord = mRootActivityContainer.isInAnyStack(sourceToken); 1334 if (sourceRecord == null) { 1335 throw new SecurityException("Called with bad activity token: " + sourceToken); 1336 } 1337 if (sourceRecord.app == null) { 1338 throw new SecurityException("Called without a process attached to activity"); 1339 } 1340 1341 // Whether called directly or from a delegate, the source activity must be from the 1342 // android package. 1343 if (!sourceRecord.info.packageName.equals("android")) { 1344 throw new SecurityException("Must be called from an activity that is " 1345 + "declared in the android package"); 1346 } 1347 1348 if (UserHandle.getAppId(sourceRecord.app.mUid) != SYSTEM_UID) { 1349 // This is still okay, as long as this activity is running under the 1350 // uid of the original calling activity. 1351 if (sourceRecord.app.mUid != sourceRecord.launchedFromUid) { 1352 throw new SecurityException( 1353 "Calling activity in uid " + sourceRecord.app.mUid 1354 + " must be system uid or original calling uid " 1355 + sourceRecord.launchedFromUid); 1356 } 1357 } 1358 if (ignoreTargetSecurity) { 1359 if (intent.getComponent() == null) { 1360 throw new SecurityException( 1361 "Component must be specified with ignoreTargetSecurity"); 1362 } 1363 if (intent.getSelector() != null) { 1364 throw new SecurityException( 1365 "Selector not allowed with ignoreTargetSecurity"); 1366 } 1367 } 1368 targetUid = sourceRecord.launchedFromUid; 1369 targetPackage = sourceRecord.launchedFromPackage; 1370 isResolver = sourceRecord.isResolverOrChildActivity(); 1371 } 1372 1373 if (userId == UserHandle.USER_NULL) { 1374 userId = UserHandle.getUserId(sourceRecord.app.mUid); 1375 } 1376 1377 // TODO: Switch to user app stacks here. 1378 try { 1379 return getActivityStartController().obtainStarter(intent, "startActivityAsCaller") 1380 .setCallingUid(targetUid) 1381 .setCallingPackage(targetPackage) 1382 .setResolvedType(resolvedType) 1383 .setResultTo(resultTo) 1384 .setResultWho(resultWho) 1385 .setRequestCode(requestCode) 1386 .setStartFlags(startFlags) 1387 .setActivityOptions(bOptions) 1388 .setMayWait(userId) 1389 .setIgnoreTargetSecurity(ignoreTargetSecurity) 1390 .setFilterCallingUid(isResolver ? 0 /* system */ : targetUid) 1391 // The target may well be in the background, which would normally prevent it 1392 // from starting an activity. Here we definitely want the start to succeed. 1393 .setAllowBackgroundActivityStart(true) 1394 .execute(); 1395 } catch (SecurityException e) { 1396 // XXX need to figure out how to propagate to original app. 1397 // A SecurityException here is generally actually a fault of the original 1398 // calling activity (such as a fairly granting permissions), so propagate it 1399 // back to them. 1400 /* 1401 StringBuilder msg = new StringBuilder(); 1402 msg.append("While launching"); 1403 msg.append(intent.toString()); 1404 msg.append(": "); 1405 msg.append(e.getMessage()); 1406 */ 1407 throw e; 1408 } 1409 } 1410 handleIncomingUser(int callingPid, int callingUid, int userId, String name)1411 int handleIncomingUser(int callingPid, int callingUid, int userId, String name) { 1412 return mAmInternal.handleIncomingUser(callingPid, callingUid, userId, false /* allowAll */, 1413 ALLOW_FULL_ONLY, name, null /* callerPackage */); 1414 } 1415 1416 @Override startVoiceActivity(String callingPackage, int callingPid, int callingUid, Intent intent, String resolvedType, IVoiceInteractionSession session, IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId)1417 public int startVoiceActivity(String callingPackage, int callingPid, int callingUid, 1418 Intent intent, String resolvedType, IVoiceInteractionSession session, 1419 IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo, 1420 Bundle bOptions, int userId) { 1421 mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startVoiceActivity()"); 1422 if (session == null || interactor == null) { 1423 throw new NullPointerException("null session or interactor"); 1424 } 1425 userId = handleIncomingUser(callingPid, callingUid, userId, "startVoiceActivity"); 1426 // TODO: Switch to user app stacks here. 1427 return getActivityStartController().obtainStarter(intent, "startVoiceActivity") 1428 .setCallingUid(callingUid) 1429 .setCallingPackage(callingPackage) 1430 .setResolvedType(resolvedType) 1431 .setVoiceSession(session) 1432 .setVoiceInteractor(interactor) 1433 .setStartFlags(startFlags) 1434 .setProfilerInfo(profilerInfo) 1435 .setActivityOptions(bOptions) 1436 .setMayWait(userId) 1437 .setAllowBackgroundActivityStart(true) 1438 .execute(); 1439 } 1440 1441 @Override startAssistantActivity(String callingPackage, int callingPid, int callingUid, Intent intent, String resolvedType, Bundle bOptions, int userId)1442 public int startAssistantActivity(String callingPackage, int callingPid, int callingUid, 1443 Intent intent, String resolvedType, Bundle bOptions, int userId) { 1444 mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startAssistantActivity()"); 1445 userId = handleIncomingUser(callingPid, callingUid, userId, "startAssistantActivity"); 1446 1447 return getActivityStartController().obtainStarter(intent, "startAssistantActivity") 1448 .setCallingUid(callingUid) 1449 .setCallingPackage(callingPackage) 1450 .setResolvedType(resolvedType) 1451 .setActivityOptions(bOptions) 1452 .setMayWait(userId) 1453 .setAllowBackgroundActivityStart(true) 1454 .execute(); 1455 } 1456 1457 /** 1458 * Start the recents activity to perform the recents animation. 1459 * 1460 * @param intent The intent to start the recents activity. 1461 * @param recentsAnimationRunner Pass {@code null} to only preload the activity. 1462 */ 1463 @Override startRecentsActivity(Intent intent, @Deprecated IAssistDataReceiver unused, @Nullable IRecentsAnimationRunner recentsAnimationRunner)1464 public void startRecentsActivity(Intent intent, @Deprecated IAssistDataReceiver unused, 1465 @Nullable IRecentsAnimationRunner recentsAnimationRunner) { 1466 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()"); 1467 final int callingPid = Binder.getCallingPid(); 1468 final int callingUid = Binder.getCallingUid(); 1469 final long origId = Binder.clearCallingIdentity(); 1470 try { 1471 synchronized (mGlobalLock) { 1472 final ComponentName recentsComponent = mRecentTasks.getRecentsComponent(); 1473 final int recentsUid = mRecentTasks.getRecentsComponentUid(); 1474 final WindowProcessController caller = getProcessController(callingPid, callingUid); 1475 1476 // Start a new recents animation 1477 final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor, 1478 getActivityStartController(), mWindowManager, intent, recentsComponent, 1479 recentsUid, caller); 1480 if (recentsAnimationRunner == null) { 1481 anim.preloadRecentsActivity(); 1482 } else { 1483 anim.startRecentsActivity(recentsAnimationRunner); 1484 } 1485 } 1486 } finally { 1487 Binder.restoreCallingIdentity(origId); 1488 } 1489 } 1490 1491 @Override startActivityFromRecents(int taskId, Bundle bOptions)1492 public final int startActivityFromRecents(int taskId, Bundle bOptions) { 1493 enforceCallerIsRecentsOrHasPermission(START_TASKS_FROM_RECENTS, 1494 "startActivityFromRecents()"); 1495 1496 final int callingPid = Binder.getCallingPid(); 1497 final int callingUid = Binder.getCallingUid(); 1498 final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(bOptions); 1499 final long origId = Binder.clearCallingIdentity(); 1500 try { 1501 synchronized (mGlobalLock) { 1502 return mStackSupervisor.startActivityFromRecents(callingPid, callingUid, taskId, 1503 safeOptions); 1504 } 1505 } finally { 1506 Binder.restoreCallingIdentity(origId); 1507 } 1508 } 1509 1510 /** 1511 * Public API to check if the client is allowed to start an activity on specified display. 1512 * 1513 * If the target display is private or virtual, some restrictions will apply. 1514 * 1515 * @param displayId Target display id. 1516 * @param intent Intent used to launch the activity. 1517 * @param resolvedType The MIME type of the intent. 1518 * @param userId The id of the user for whom the call is made. 1519 * @return {@code true} if a call to start an activity on the target display should succeed and 1520 * no {@link SecurityException} will be thrown, {@code false} otherwise. 1521 */ 1522 @Override isActivityStartAllowedOnDisplay(int displayId, Intent intent, String resolvedType, int userId)1523 public final boolean isActivityStartAllowedOnDisplay(int displayId, Intent intent, 1524 String resolvedType, int userId) { 1525 final int callingUid = Binder.getCallingUid(); 1526 final int callingPid = Binder.getCallingPid(); 1527 final long origId = Binder.clearCallingIdentity(); 1528 1529 try { 1530 // Collect information about the target of the Intent. 1531 ActivityInfo aInfo = mStackSupervisor.resolveActivity(intent, resolvedType, 1532 0 /* startFlags */, null /* profilerInfo */, userId, 1533 ActivityStarter.computeResolveFilterUid(callingUid, callingUid, 1534 UserHandle.USER_NULL)); 1535 aInfo = mAmInternal.getActivityInfoForUser(aInfo, userId); 1536 1537 synchronized (mGlobalLock) { 1538 return mStackSupervisor.canPlaceEntityOnDisplay(displayId, callingPid, callingUid, 1539 aInfo); 1540 } 1541 } finally { 1542 Binder.restoreCallingIdentity(origId); 1543 } 1544 } 1545 1546 /** 1547 * This is the internal entry point for handling Activity.finish(). 1548 * 1549 * @param token The Binder token referencing the Activity we want to finish. 1550 * @param resultCode Result code, if any, from this Activity. 1551 * @param resultData Result data (Intent), if any, from this Activity. 1552 * @param finishTask Whether to finish the task associated with this Activity. 1553 * 1554 * @return Returns true if the activity successfully finished, or false if it is still running. 1555 */ 1556 @Override finishActivity(IBinder token, int resultCode, Intent resultData, int finishTask)1557 public final boolean finishActivity(IBinder token, int resultCode, Intent resultData, 1558 int finishTask) { 1559 // Refuse possible leaked file descriptors 1560 if (resultData != null && resultData.hasFileDescriptors()) { 1561 throw new IllegalArgumentException("File descriptors passed in Intent"); 1562 } 1563 1564 synchronized (mGlobalLock) { 1565 ActivityRecord r = ActivityRecord.isInStackLocked(token); 1566 if (r == null) { 1567 return true; 1568 } 1569 // Keep track of the root activity of the task before we finish it 1570 final TaskRecord tr = r.getTaskRecord(); 1571 ActivityRecord rootR = tr.getRootActivity(); 1572 if (rootR == null) { 1573 Slog.w(TAG, "Finishing task with all activities already finished"); 1574 } 1575 // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps can 1576 // finish. 1577 if (getLockTaskController().activityBlockedFromFinish(r)) { 1578 return false; 1579 } 1580 1581 // TODO: There is a dup. of this block of code in ActivityStack.navigateUpToLocked 1582 // We should consolidate. 1583 if (mController != null) { 1584 // Find the first activity that is not finishing. 1585 final ActivityRecord next = r.getActivityStack().topRunningActivityLocked(token, 0); 1586 if (next != null) { 1587 // ask watcher if this is allowed 1588 boolean resumeOK = true; 1589 try { 1590 resumeOK = mController.activityResuming(next.packageName); 1591 } catch (RemoteException e) { 1592 mController = null; 1593 Watchdog.getInstance().setActivityController(null); 1594 } 1595 1596 if (!resumeOK) { 1597 Slog.i(TAG, "Not finishing activity because controller resumed"); 1598 return false; 1599 } 1600 } 1601 } 1602 1603 // note down that the process has finished an activity and is in background activity 1604 // starts grace period 1605 if (r.app != null) { 1606 r.app.setLastActivityFinishTimeIfNeeded(SystemClock.uptimeMillis()); 1607 } 1608 1609 final long origId = Binder.clearCallingIdentity(); 1610 try { 1611 boolean res; 1612 final boolean finishWithRootActivity = 1613 finishTask == Activity.FINISH_TASK_WITH_ROOT_ACTIVITY; 1614 if (finishTask == Activity.FINISH_TASK_WITH_ACTIVITY 1615 || (finishWithRootActivity && r == rootR)) { 1616 // If requested, remove the task that is associated to this activity only if it 1617 // was the root activity in the task. The result code and data is ignored 1618 // because we don't support returning them across task boundaries. Also, to 1619 // keep backwards compatibility we remove the task from recents when finishing 1620 // task with root activity. 1621 res = mStackSupervisor.removeTaskByIdLocked(tr.taskId, false, 1622 finishWithRootActivity, "finish-activity"); 1623 if (!res) { 1624 Slog.i(TAG, "Removing task failed to finish activity"); 1625 } 1626 // Explicitly dismissing the activity so reset its relaunch flag. 1627 r.mRelaunchReason = RELAUNCH_REASON_NONE; 1628 } else { 1629 res = tr.getStack().requestFinishActivityLocked(token, resultCode, 1630 resultData, "app-request", true); 1631 if (!res) { 1632 Slog.i(TAG, "Failed to finish by app-request"); 1633 } 1634 } 1635 return res; 1636 } finally { 1637 Binder.restoreCallingIdentity(origId); 1638 } 1639 } 1640 } 1641 1642 @Override finishActivityAffinity(IBinder token)1643 public boolean finishActivityAffinity(IBinder token) { 1644 synchronized (mGlobalLock) { 1645 final long origId = Binder.clearCallingIdentity(); 1646 try { 1647 ActivityRecord r = ActivityRecord.isInStackLocked(token); 1648 if (r == null) { 1649 return false; 1650 } 1651 1652 // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps 1653 // can finish. 1654 final TaskRecord task = r.getTaskRecord(); 1655 if (getLockTaskController().activityBlockedFromFinish(r)) { 1656 return false; 1657 } 1658 return task.getStack().finishActivityAffinityLocked(r); 1659 } finally { 1660 Binder.restoreCallingIdentity(origId); 1661 } 1662 } 1663 } 1664 1665 @Override activityIdle(IBinder token, Configuration config, boolean stopProfiling)1666 public final void activityIdle(IBinder token, Configuration config, boolean stopProfiling) { 1667 final long origId = Binder.clearCallingIdentity(); 1668 try { 1669 WindowProcessController proc = null; 1670 synchronized (mGlobalLock) { 1671 ActivityStack stack = ActivityRecord.getStackLocked(token); 1672 if (stack == null) { 1673 return; 1674 } 1675 final ActivityRecord r = mStackSupervisor.activityIdleInternalLocked(token, 1676 false /* fromTimeout */, false /* processPausingActivities */, config); 1677 if (r != null) { 1678 proc = r.app; 1679 } 1680 if (stopProfiling && proc != null) { 1681 proc.clearProfilerIfNeeded(); 1682 } 1683 } 1684 } finally { 1685 Binder.restoreCallingIdentity(origId); 1686 } 1687 } 1688 1689 @Override activityResumed(IBinder token)1690 public final void activityResumed(IBinder token) { 1691 final long origId = Binder.clearCallingIdentity(); 1692 synchronized (mGlobalLock) { 1693 ActivityRecord.activityResumedLocked(token); 1694 mWindowManager.notifyAppResumedFinished(token); 1695 } 1696 Binder.restoreCallingIdentity(origId); 1697 } 1698 1699 @Override activityTopResumedStateLost()1700 public final void activityTopResumedStateLost() { 1701 final long origId = Binder.clearCallingIdentity(); 1702 synchronized (mGlobalLock) { 1703 mStackSupervisor.handleTopResumedStateReleased(false /* timeout */); 1704 } 1705 Binder.restoreCallingIdentity(origId); 1706 } 1707 1708 @Override activityPaused(IBinder token)1709 public final void activityPaused(IBinder token) { 1710 final long origId = Binder.clearCallingIdentity(); 1711 synchronized (mGlobalLock) { 1712 ActivityStack stack = ActivityRecord.getStackLocked(token); 1713 if (stack != null) { 1714 stack.activityPausedLocked(token, false); 1715 } 1716 } 1717 Binder.restoreCallingIdentity(origId); 1718 } 1719 1720 @Override activityStopped(IBinder token, Bundle icicle, PersistableBundle persistentState, CharSequence description)1721 public final void activityStopped(IBinder token, Bundle icicle, 1722 PersistableBundle persistentState, CharSequence description) { 1723 if (DEBUG_ALL) Slog.v(TAG, "Activity stopped: token=" + token); 1724 1725 // Refuse possible leaked file descriptors 1726 if (icicle != null && icicle.hasFileDescriptors()) { 1727 throw new IllegalArgumentException("File descriptors passed in Bundle"); 1728 } 1729 1730 final long origId = Binder.clearCallingIdentity(); 1731 1732 String restartingName = null; 1733 int restartingUid = 0; 1734 final ActivityRecord r; 1735 synchronized (mGlobalLock) { 1736 r = ActivityRecord.isInStackLocked(token); 1737 if (r != null) { 1738 if (r.attachedToProcess() 1739 && r.isState(ActivityStack.ActivityState.RESTARTING_PROCESS)) { 1740 // The activity was requested to restart from 1741 // {@link #restartActivityProcessIfVisible}. 1742 restartingName = r.app.mName; 1743 restartingUid = r.app.mUid; 1744 } 1745 r.activityStoppedLocked(icicle, persistentState, description); 1746 } 1747 } 1748 1749 if (restartingName != null) { 1750 // In order to let the foreground activity can be restarted with its saved state from 1751 // {@link android.app.Activity#onSaveInstanceState}, the kill operation is postponed 1752 // until the activity reports stopped with the state. And the activity record will be 1753 // kept because the record state is restarting, then the activity will be restarted 1754 // immediately if it is still the top one. 1755 mStackSupervisor.removeRestartTimeouts(r); 1756 mAmInternal.killProcess(restartingName, restartingUid, "restartActivityProcess"); 1757 } 1758 mAmInternal.trimApplications(); 1759 1760 Binder.restoreCallingIdentity(origId); 1761 } 1762 1763 @Override activityDestroyed(IBinder token)1764 public final void activityDestroyed(IBinder token) { 1765 if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "ACTIVITY DESTROYED: " + token); 1766 synchronized (mGlobalLock) { 1767 ActivityStack stack = ActivityRecord.getStackLocked(token); 1768 if (stack != null) { 1769 stack.activityDestroyedLocked(token, "activityDestroyed"); 1770 } 1771 } 1772 } 1773 1774 @Override activityRelaunched(IBinder token)1775 public final void activityRelaunched(IBinder token) { 1776 final long origId = Binder.clearCallingIdentity(); 1777 synchronized (mGlobalLock) { 1778 mStackSupervisor.activityRelaunchedLocked(token); 1779 } 1780 Binder.restoreCallingIdentity(origId); 1781 } 1782 activitySlept(IBinder token)1783 public final void activitySlept(IBinder token) { 1784 if (DEBUG_ALL) Slog.v(TAG, "Activity slept: token=" + token); 1785 1786 final long origId = Binder.clearCallingIdentity(); 1787 1788 synchronized (mGlobalLock) { 1789 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 1790 if (r != null) { 1791 mStackSupervisor.activitySleptLocked(r); 1792 } 1793 } 1794 1795 Binder.restoreCallingIdentity(origId); 1796 } 1797 1798 @Override setRequestedOrientation(IBinder token, int requestedOrientation)1799 public void setRequestedOrientation(IBinder token, int requestedOrientation) { 1800 synchronized (mGlobalLock) { 1801 ActivityRecord r = ActivityRecord.isInStackLocked(token); 1802 if (r == null) { 1803 return; 1804 } 1805 final long origId = Binder.clearCallingIdentity(); 1806 try { 1807 r.setRequestedOrientation(requestedOrientation); 1808 } finally { 1809 Binder.restoreCallingIdentity(origId); 1810 } 1811 } 1812 } 1813 1814 @Override getRequestedOrientation(IBinder token)1815 public int getRequestedOrientation(IBinder token) { 1816 synchronized (mGlobalLock) { 1817 ActivityRecord r = ActivityRecord.isInStackLocked(token); 1818 if (r == null) { 1819 return ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; 1820 } 1821 return r.getOrientation(); 1822 } 1823 } 1824 1825 @Override setImmersive(IBinder token, boolean immersive)1826 public void setImmersive(IBinder token, boolean immersive) { 1827 synchronized (mGlobalLock) { 1828 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 1829 if (r == null) { 1830 throw new IllegalArgumentException(); 1831 } 1832 r.immersive = immersive; 1833 1834 // update associated state if we're frontmost 1835 if (r.isResumedActivityOnDisplay()) { 1836 if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, "Frontmost changed immersion: "+ r); 1837 applyUpdateLockStateLocked(r); 1838 } 1839 } 1840 } 1841 applyUpdateLockStateLocked(ActivityRecord r)1842 void applyUpdateLockStateLocked(ActivityRecord r) { 1843 // Modifications to the UpdateLock state are done on our handler, outside 1844 // the activity manager's locks. The new state is determined based on the 1845 // state *now* of the relevant activity record. The object is passed to 1846 // the handler solely for logging detail, not to be consulted/modified. 1847 final boolean nextState = r != null && r.immersive; 1848 mH.post(() -> { 1849 if (mUpdateLock.isHeld() != nextState) { 1850 if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, 1851 "Applying new update lock state '" + nextState + "' for " + r); 1852 if (nextState) { 1853 mUpdateLock.acquire(); 1854 } else { 1855 mUpdateLock.release(); 1856 } 1857 } 1858 }); 1859 } 1860 1861 @Override isImmersive(IBinder token)1862 public boolean isImmersive(IBinder token) { 1863 synchronized (mGlobalLock) { 1864 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 1865 if (r == null) { 1866 throw new IllegalArgumentException(); 1867 } 1868 return r.immersive; 1869 } 1870 } 1871 1872 @Override isTopActivityImmersive()1873 public boolean isTopActivityImmersive() { 1874 enforceNotIsolatedCaller("isTopActivityImmersive"); 1875 synchronized (mGlobalLock) { 1876 final ActivityRecord r = getTopDisplayFocusedStack().topRunningActivityLocked(); 1877 return (r != null) ? r.immersive : false; 1878 } 1879 } 1880 1881 @Override overridePendingTransition(IBinder token, String packageName, int enterAnim, int exitAnim)1882 public void overridePendingTransition(IBinder token, String packageName, 1883 int enterAnim, int exitAnim) { 1884 synchronized (mGlobalLock) { 1885 ActivityRecord self = ActivityRecord.isInStackLocked(token); 1886 if (self == null) { 1887 return; 1888 } 1889 1890 final long origId = Binder.clearCallingIdentity(); 1891 1892 if (self.isState( 1893 ActivityStack.ActivityState.RESUMED, ActivityStack.ActivityState.PAUSING)) { 1894 self.getDisplay().mDisplayContent.mAppTransition.overridePendingAppTransition( 1895 packageName, enterAnim, exitAnim, null); 1896 } 1897 1898 Binder.restoreCallingIdentity(origId); 1899 } 1900 } 1901 1902 @Override getFrontActivityScreenCompatMode()1903 public int getFrontActivityScreenCompatMode() { 1904 enforceNotIsolatedCaller("getFrontActivityScreenCompatMode"); 1905 synchronized (mGlobalLock) { 1906 final ActivityRecord r = getTopDisplayFocusedStack().topRunningActivityLocked(); 1907 if (r == null) { 1908 return ActivityManager.COMPAT_MODE_UNKNOWN; 1909 } 1910 return mCompatModePackages.computeCompatModeLocked(r.info.applicationInfo); 1911 } 1912 } 1913 1914 @Override setFrontActivityScreenCompatMode(int mode)1915 public void setFrontActivityScreenCompatMode(int mode) { 1916 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY, 1917 "setFrontActivityScreenCompatMode"); 1918 ApplicationInfo ai; 1919 synchronized (mGlobalLock) { 1920 final ActivityRecord r = getTopDisplayFocusedStack().topRunningActivityLocked(); 1921 if (r == null) { 1922 Slog.w(TAG, "setFrontActivityScreenCompatMode failed: no top activity"); 1923 return; 1924 } 1925 ai = r.info.applicationInfo; 1926 mCompatModePackages.setPackageScreenCompatModeLocked(ai, mode); 1927 } 1928 } 1929 1930 @Override getLaunchedFromUid(IBinder activityToken)1931 public int getLaunchedFromUid(IBinder activityToken) { 1932 ActivityRecord srec; 1933 synchronized (mGlobalLock) { 1934 srec = ActivityRecord.forTokenLocked(activityToken); 1935 } 1936 if (srec == null) { 1937 return -1; 1938 } 1939 return srec.launchedFromUid; 1940 } 1941 1942 @Override getLaunchedFromPackage(IBinder activityToken)1943 public String getLaunchedFromPackage(IBinder activityToken) { 1944 ActivityRecord srec; 1945 synchronized (mGlobalLock) { 1946 srec = ActivityRecord.forTokenLocked(activityToken); 1947 } 1948 if (srec == null) { 1949 return null; 1950 } 1951 return srec.launchedFromPackage; 1952 } 1953 1954 @Override convertFromTranslucent(IBinder token)1955 public boolean convertFromTranslucent(IBinder token) { 1956 final long origId = Binder.clearCallingIdentity(); 1957 try { 1958 synchronized (mGlobalLock) { 1959 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 1960 if (r == null) { 1961 return false; 1962 } 1963 final boolean translucentChanged = r.changeWindowTranslucency(true); 1964 if (translucentChanged) { 1965 mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); 1966 } 1967 mWindowManager.setAppFullscreen(token, true); 1968 return translucentChanged; 1969 } 1970 } finally { 1971 Binder.restoreCallingIdentity(origId); 1972 } 1973 } 1974 1975 @Override convertToTranslucent(IBinder token, Bundle options)1976 public boolean convertToTranslucent(IBinder token, Bundle options) { 1977 SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(options); 1978 final long origId = Binder.clearCallingIdentity(); 1979 try { 1980 synchronized (mGlobalLock) { 1981 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 1982 if (r == null) { 1983 return false; 1984 } 1985 final TaskRecord task = r.getTaskRecord(); 1986 int index = task.mActivities.lastIndexOf(r); 1987 if (index > 0) { 1988 ActivityRecord under = task.mActivities.get(index - 1); 1989 under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null; 1990 } 1991 final boolean translucentChanged = r.changeWindowTranslucency(false); 1992 if (translucentChanged) { 1993 r.getActivityStack().convertActivityToTranslucent(r); 1994 } 1995 mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); 1996 mWindowManager.setAppFullscreen(token, false); 1997 return translucentChanged; 1998 } 1999 } finally { 2000 Binder.restoreCallingIdentity(origId); 2001 } 2002 } 2003 2004 @Override notifyActivityDrawn(IBinder token)2005 public void notifyActivityDrawn(IBinder token) { 2006 if (DEBUG_VISIBILITY) Slog.d(TAG_VISIBILITY, "notifyActivityDrawn: token=" + token); 2007 synchronized (mGlobalLock) { 2008 ActivityRecord r = mRootActivityContainer.isInAnyStack(token); 2009 if (r != null) { 2010 r.getActivityStack().notifyActivityDrawnLocked(r); 2011 } 2012 } 2013 } 2014 2015 @Override reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle)2016 public void reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle) { 2017 synchronized (mGlobalLock) { 2018 ActivityRecord r = ActivityRecord.isInStackLocked(token); 2019 if (r == null) { 2020 return; 2021 } 2022 r.reportFullyDrawnLocked(restoredFromBundle); 2023 } 2024 } 2025 2026 @Override getActivityDisplayId(IBinder activityToken)2027 public int getActivityDisplayId(IBinder activityToken) throws RemoteException { 2028 synchronized (mGlobalLock) { 2029 final ActivityStack stack = ActivityRecord.getStackLocked(activityToken); 2030 if (stack != null && stack.mDisplayId != INVALID_DISPLAY) { 2031 return stack.mDisplayId; 2032 } 2033 return DEFAULT_DISPLAY; 2034 } 2035 } 2036 2037 @Override getFocusedStackInfo()2038 public ActivityManager.StackInfo getFocusedStackInfo() throws RemoteException { 2039 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()"); 2040 long ident = Binder.clearCallingIdentity(); 2041 try { 2042 synchronized (mGlobalLock) { 2043 ActivityStack focusedStack = getTopDisplayFocusedStack(); 2044 if (focusedStack != null) { 2045 return mRootActivityContainer.getStackInfo(focusedStack.mStackId); 2046 } 2047 return null; 2048 } 2049 } finally { 2050 Binder.restoreCallingIdentity(ident); 2051 } 2052 } 2053 2054 @Override setFocusedStack(int stackId)2055 public void setFocusedStack(int stackId) { 2056 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedStack()"); 2057 if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedStack: stackId=" + stackId); 2058 final long callingId = Binder.clearCallingIdentity(); 2059 try { 2060 synchronized (mGlobalLock) { 2061 final ActivityStack stack = mRootActivityContainer.getStack(stackId); 2062 if (stack == null) { 2063 Slog.w(TAG, "setFocusedStack: No stack with id=" + stackId); 2064 return; 2065 } 2066 final ActivityRecord r = stack.topRunningActivityLocked(); 2067 if (r != null && r.moveFocusableActivityToTop("setFocusedStack")) { 2068 mRootActivityContainer.resumeFocusedStacksTopActivities(); 2069 } 2070 } 2071 } finally { 2072 Binder.restoreCallingIdentity(callingId); 2073 } 2074 } 2075 2076 @Override setFocusedTask(int taskId)2077 public void setFocusedTask(int taskId) { 2078 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedTask()"); 2079 if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedTask: taskId=" + taskId); 2080 final long callingId = Binder.clearCallingIdentity(); 2081 try { 2082 synchronized (mGlobalLock) { 2083 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId, 2084 MATCH_TASK_IN_STACKS_ONLY); 2085 if (task == null) { 2086 return; 2087 } 2088 final ActivityRecord r = task.topRunningActivityLocked(); 2089 if (r != null && r.moveFocusableActivityToTop("setFocusedTask")) { 2090 mRootActivityContainer.resumeFocusedStacksTopActivities(); 2091 } 2092 } 2093 } finally { 2094 Binder.restoreCallingIdentity(callingId); 2095 } 2096 } 2097 2098 @Override restartActivityProcessIfVisible(IBinder activityToken)2099 public void restartActivityProcessIfVisible(IBinder activityToken) { 2100 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "restartActivityProcess()"); 2101 final long callingId = Binder.clearCallingIdentity(); 2102 try { 2103 synchronized (mGlobalLock) { 2104 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken); 2105 if (r == null) { 2106 return; 2107 } 2108 r.restartProcessIfVisible(); 2109 } 2110 } finally { 2111 Binder.restoreCallingIdentity(callingId); 2112 } 2113 } 2114 2115 @Override removeTask(int taskId)2116 public boolean removeTask(int taskId) { 2117 enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeTask()"); 2118 synchronized (mGlobalLock) { 2119 final long ident = Binder.clearCallingIdentity(); 2120 try { 2121 return mStackSupervisor.removeTaskByIdLocked(taskId, true, REMOVE_FROM_RECENTS, 2122 "remove-task"); 2123 } finally { 2124 Binder.restoreCallingIdentity(ident); 2125 } 2126 } 2127 } 2128 2129 @Override removeAllVisibleRecentTasks()2130 public void removeAllVisibleRecentTasks() { 2131 enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeAllVisibleRecentTasks()"); 2132 synchronized (mGlobalLock) { 2133 final long ident = Binder.clearCallingIdentity(); 2134 try { 2135 getRecentTasks().removeAllVisibleTasks(mAmInternal.getCurrentUserId()); 2136 } finally { 2137 Binder.restoreCallingIdentity(ident); 2138 } 2139 } 2140 } 2141 2142 @Override shouldUpRecreateTask(IBinder token, String destAffinity)2143 public boolean shouldUpRecreateTask(IBinder token, String destAffinity) { 2144 synchronized (mGlobalLock) { 2145 final ActivityRecord srec = ActivityRecord.forTokenLocked(token); 2146 if (srec != null) { 2147 return srec.getActivityStack().shouldUpRecreateTaskLocked(srec, destAffinity); 2148 } 2149 } 2150 return false; 2151 } 2152 2153 @Override navigateUpTo(IBinder token, Intent destIntent, int resultCode, Intent resultData)2154 public boolean navigateUpTo(IBinder token, Intent destIntent, int resultCode, 2155 Intent resultData) { 2156 2157 synchronized (mGlobalLock) { 2158 final ActivityRecord r = ActivityRecord.forTokenLocked(token); 2159 if (r != null) { 2160 return r.getActivityStack().navigateUpToLocked( 2161 r, destIntent, resultCode, resultData); 2162 } 2163 return false; 2164 } 2165 } 2166 2167 /** 2168 * Attempts to move a task backwards in z-order (the order of activities within the task is 2169 * unchanged). 2170 * 2171 * There are several possible results of this call: 2172 * - if the task is locked, then we will show the lock toast 2173 * - if there is a task behind the provided task, then that task is made visible and resumed as 2174 * this task is moved to the back 2175 * - otherwise, if there are no other tasks in the stack: 2176 * - if this task is in the pinned stack, then we remove the stack completely, which will 2177 * have the effect of moving the task to the top or bottom of the fullscreen stack 2178 * (depending on whether it is visible) 2179 * - otherwise, we simply return home and hide this task 2180 * 2181 * @param token A reference to the activity we wish to move 2182 * @param nonRoot If false then this only works if the activity is the root 2183 * of a task; if true it will work for any activity in a task. 2184 * @return Returns true if the move completed, false if not. 2185 */ 2186 @Override moveActivityTaskToBack(IBinder token, boolean nonRoot)2187 public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot) { 2188 enforceNotIsolatedCaller("moveActivityTaskToBack"); 2189 synchronized (mGlobalLock) { 2190 final long origId = Binder.clearCallingIdentity(); 2191 try { 2192 int taskId = ActivityRecord.getTaskForActivityLocked(token, !nonRoot); 2193 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId); 2194 if (task != null) { 2195 return ActivityRecord.getStackLocked(token).moveTaskToBackLocked(taskId); 2196 } 2197 } finally { 2198 Binder.restoreCallingIdentity(origId); 2199 } 2200 } 2201 return false; 2202 } 2203 2204 @Override getTaskBounds(int taskId)2205 public Rect getTaskBounds(int taskId) { 2206 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "getTaskBounds()"); 2207 long ident = Binder.clearCallingIdentity(); 2208 Rect rect = new Rect(); 2209 try { 2210 synchronized (mGlobalLock) { 2211 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId, 2212 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS); 2213 if (task == null) { 2214 Slog.w(TAG, "getTaskBounds: taskId=" + taskId + " not found"); 2215 return rect; 2216 } 2217 if (task.getStack() != null) { 2218 // Return the bounds from window manager since it will be adjusted for various 2219 // things like the presense of a docked stack for tasks that aren't resizeable. 2220 task.getWindowContainerBounds(rect); 2221 } else { 2222 // Task isn't in window manager yet since it isn't associated with a stack. 2223 // Return the persist value from activity manager 2224 if (!task.matchParentBounds()) { 2225 rect.set(task.getBounds()); 2226 } else if (task.mLastNonFullscreenBounds != null) { 2227 rect.set(task.mLastNonFullscreenBounds); 2228 } 2229 } 2230 } 2231 } finally { 2232 Binder.restoreCallingIdentity(ident); 2233 } 2234 return rect; 2235 } 2236 2237 @Override getTaskDescription(int id)2238 public ActivityManager.TaskDescription getTaskDescription(int id) { 2239 synchronized (mGlobalLock) { 2240 enforceCallerIsRecentsOrHasPermission( 2241 MANAGE_ACTIVITY_STACKS, "getTaskDescription()"); 2242 final TaskRecord tr = mRootActivityContainer.anyTaskForId(id, 2243 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS); 2244 if (tr != null) { 2245 return tr.lastTaskDescription; 2246 } 2247 } 2248 return null; 2249 } 2250 2251 @Override setTaskWindowingMode(int taskId, int windowingMode, boolean toTop)2252 public void setTaskWindowingMode(int taskId, int windowingMode, boolean toTop) { 2253 if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) { 2254 setTaskWindowingModeSplitScreenPrimary(taskId, SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT, 2255 toTop, ANIMATE, null /* initialBounds */, true /* showRecents */); 2256 return; 2257 } 2258 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setTaskWindowingMode()"); 2259 synchronized (mGlobalLock) { 2260 final long ident = Binder.clearCallingIdentity(); 2261 try { 2262 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId, 2263 MATCH_TASK_IN_STACKS_ONLY); 2264 if (task == null) { 2265 Slog.w(TAG, "setTaskWindowingMode: No task for id=" + taskId); 2266 return; 2267 } 2268 2269 if (DEBUG_STACK) Slog.d(TAG_STACK, "setTaskWindowingMode: moving task=" + taskId 2270 + " to windowingMode=" + windowingMode + " toTop=" + toTop); 2271 2272 if (!task.isActivityTypeStandardOrUndefined()) { 2273 throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move" 2274 + " non-standard task " + taskId + " to windowing mode=" 2275 + windowingMode); 2276 } 2277 2278 final ActivityStack stack = task.getStack(); 2279 if (toTop) { 2280 stack.moveToFront("setTaskWindowingMode", task); 2281 } 2282 stack.setWindowingMode(windowingMode); 2283 } finally { 2284 Binder.restoreCallingIdentity(ident); 2285 } 2286 } 2287 } 2288 2289 @Override getCallingPackage(IBinder token)2290 public String getCallingPackage(IBinder token) { 2291 synchronized (mGlobalLock) { 2292 ActivityRecord r = getCallingRecordLocked(token); 2293 return r != null ? r.info.packageName : null; 2294 } 2295 } 2296 2297 @Override getCallingActivity(IBinder token)2298 public ComponentName getCallingActivity(IBinder token) { 2299 synchronized (mGlobalLock) { 2300 ActivityRecord r = getCallingRecordLocked(token); 2301 return r != null ? r.intent.getComponent() : null; 2302 } 2303 } 2304 getCallingRecordLocked(IBinder token)2305 private ActivityRecord getCallingRecordLocked(IBinder token) { 2306 ActivityRecord r = ActivityRecord.isInStackLocked(token); 2307 if (r == null) { 2308 return null; 2309 } 2310 return r.resultTo; 2311 } 2312 2313 @Override unhandledBack()2314 public void unhandledBack() { 2315 mAmInternal.enforceCallingPermission(android.Manifest.permission.FORCE_BACK, "unhandledBack()"); 2316 2317 synchronized (mGlobalLock) { 2318 final long origId = Binder.clearCallingIdentity(); 2319 try { 2320 getTopDisplayFocusedStack().unhandledBackLocked(); 2321 } finally { 2322 Binder.restoreCallingIdentity(origId); 2323 } 2324 } 2325 } 2326 2327 @Override onBackPressedOnTaskRoot(IBinder token, IRequestFinishCallback callback)2328 public void onBackPressedOnTaskRoot(IBinder token, IRequestFinishCallback callback) { 2329 synchronized (mGlobalLock) { 2330 ActivityRecord r = ActivityRecord.isInStackLocked(token); 2331 if (r == null) { 2332 return; 2333 } 2334 ActivityStack stack = r.getActivityStack(); 2335 if (stack != null && stack.isSingleTaskInstance()) { 2336 // Single-task stacks are used for activities which are presented in floating 2337 // windows above full screen activities. Instead of directly finishing the 2338 // task, a task change listener is used to notify SystemUI so the action can be 2339 // handled specially. 2340 final TaskRecord task = r.getTaskRecord(); 2341 mTaskChangeNotificationController 2342 .notifyBackPressedOnTaskRoot(task.getTaskInfo()); 2343 } else { 2344 try { 2345 callback.requestFinish(); 2346 } catch (RemoteException e) { 2347 Slog.e(TAG, "Failed to invoke request finish callback", e); 2348 } 2349 } 2350 } 2351 } 2352 2353 /** 2354 * TODO: Add mController hook 2355 */ 2356 @Override moveTaskToFront(IApplicationThread appThread, String callingPackage, int taskId, int flags, Bundle bOptions)2357 public void moveTaskToFront(IApplicationThread appThread, String callingPackage, int taskId, 2358 int flags, Bundle bOptions) { 2359 mAmInternal.enforceCallingPermission(android.Manifest.permission.REORDER_TASKS, "moveTaskToFront()"); 2360 2361 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToFront: moving taskId=" + taskId); 2362 synchronized (mGlobalLock) { 2363 moveTaskToFrontLocked(appThread, callingPackage, taskId, flags, 2364 SafeActivityOptions.fromBundle(bOptions), false /* fromRecents */); 2365 } 2366 } 2367 moveTaskToFrontLocked(@ullable IApplicationThread appThread, @Nullable String callingPackage, int taskId, int flags, SafeActivityOptions options, boolean fromRecents)2368 void moveTaskToFrontLocked(@Nullable IApplicationThread appThread, 2369 @Nullable String callingPackage, int taskId, int flags, SafeActivityOptions options, 2370 boolean fromRecents) { 2371 2372 final int callingPid = Binder.getCallingPid(); 2373 final int callingUid = Binder.getCallingUid(); 2374 if (!isSameApp(callingUid, callingPackage)) { 2375 String msg = "Permission Denial: moveTaskToFrontLocked() from pid=" 2376 + Binder.getCallingPid() + " as package " + callingPackage; 2377 Slog.w(TAG, msg); 2378 throw new SecurityException(msg); 2379 } 2380 if (!checkAppSwitchAllowedLocked(callingPid, callingUid, -1, -1, "Task to front")) { 2381 SafeActivityOptions.abort(options); 2382 return; 2383 } 2384 final long origId = Binder.clearCallingIdentity(); 2385 WindowProcessController callerApp = null; 2386 if (appThread != null) { 2387 callerApp = getProcessController(appThread); 2388 } 2389 final ActivityStarter starter = getActivityStartController().obtainStarter( 2390 null /* intent */, "moveTaskToFront"); 2391 if (starter.shouldAbortBackgroundActivityStart(callingUid, callingPid, callingPackage, -1, 2392 -1, callerApp, null, false, null)) { 2393 if (!isBackgroundActivityStartsEnabled()) { 2394 return; 2395 } 2396 } 2397 try { 2398 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId); 2399 if (task == null) { 2400 Slog.d(TAG, "Could not find task for id: "+ taskId); 2401 SafeActivityOptions.abort(options); 2402 return; 2403 } 2404 if (getLockTaskController().isLockTaskModeViolation(task)) { 2405 Slog.e(TAG, "moveTaskToFront: Attempt to violate Lock Task Mode"); 2406 SafeActivityOptions.abort(options); 2407 return; 2408 } 2409 ActivityOptions realOptions = options != null 2410 ? options.getOptions(mStackSupervisor) 2411 : null; 2412 mStackSupervisor.findTaskToMoveToFront(task, flags, realOptions, "moveTaskToFront", 2413 false /* forceNonResizable */); 2414 2415 final ActivityRecord topActivity = task.getTopActivity(); 2416 if (topActivity != null) { 2417 2418 // We are reshowing a task, use a starting window to hide the initial draw delay 2419 // so the transition can start earlier. 2420 topActivity.showStartingWindow(null /* prev */, false /* newTask */, 2421 true /* taskSwitch */, fromRecents); 2422 } 2423 } finally { 2424 Binder.restoreCallingIdentity(origId); 2425 } 2426 } 2427 2428 /** 2429 * Return true if callingUid is system, or packageName belongs to that callingUid. 2430 */ isSameApp(int callingUid, @Nullable String packageName)2431 boolean isSameApp(int callingUid, @Nullable String packageName) { 2432 try { 2433 if (callingUid != 0 && callingUid != SYSTEM_UID) { 2434 if (packageName == null) { 2435 return false; 2436 } 2437 final int uid = AppGlobals.getPackageManager().getPackageUid(packageName, 2438 PackageManager.MATCH_DEBUG_TRIAGED_MISSING, 2439 UserHandle.getUserId(callingUid)); 2440 return UserHandle.isSameApp(callingUid, uid); 2441 } 2442 } catch (RemoteException e) { 2443 // Should not happen 2444 } 2445 return true; 2446 } 2447 checkAppSwitchAllowedLocked(int sourcePid, int sourceUid, int callingPid, int callingUid, String name)2448 boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid, 2449 int callingPid, int callingUid, String name) { 2450 if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) { 2451 return true; 2452 } 2453 2454 if (getRecentTasks().isCallerRecents(sourceUid)) { 2455 return true; 2456 } 2457 2458 int perm = checkComponentPermission(STOP_APP_SWITCHES, sourcePid, sourceUid, -1, true); 2459 if (perm == PackageManager.PERMISSION_GRANTED) { 2460 return true; 2461 } 2462 if (checkAllowAppSwitchUid(sourceUid)) { 2463 return true; 2464 } 2465 2466 // If the actual IPC caller is different from the logical source, then 2467 // also see if they are allowed to control app switches. 2468 if (callingUid != -1 && callingUid != sourceUid) { 2469 perm = checkComponentPermission(STOP_APP_SWITCHES, callingPid, callingUid, -1, true); 2470 if (perm == PackageManager.PERMISSION_GRANTED) { 2471 return true; 2472 } 2473 if (checkAllowAppSwitchUid(callingUid)) { 2474 return true; 2475 } 2476 } 2477 2478 Slog.w(TAG, name + " request from " + sourceUid + " stopped"); 2479 return false; 2480 } 2481 checkAllowAppSwitchUid(int uid)2482 private boolean checkAllowAppSwitchUid(int uid) { 2483 ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(UserHandle.getUserId(uid)); 2484 if (types != null) { 2485 for (int i = types.size() - 1; i >= 0; i--) { 2486 if (types.valueAt(i).intValue() == uid) { 2487 return true; 2488 } 2489 } 2490 } 2491 return false; 2492 } 2493 2494 @Override setActivityController(IActivityController controller, boolean imAMonkey)2495 public void setActivityController(IActivityController controller, boolean imAMonkey) { 2496 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER, 2497 "setActivityController()"); 2498 synchronized (mGlobalLock) { 2499 mController = controller; 2500 mControllerIsAMonkey = imAMonkey; 2501 Watchdog.getInstance().setActivityController(controller); 2502 } 2503 } 2504 isControllerAMonkey()2505 public boolean isControllerAMonkey() { 2506 synchronized (mGlobalLock) { 2507 return mController != null && mControllerIsAMonkey; 2508 } 2509 } 2510 2511 @Override getTaskForActivity(IBinder token, boolean onlyRoot)2512 public int getTaskForActivity(IBinder token, boolean onlyRoot) { 2513 synchronized (mGlobalLock) { 2514 return ActivityRecord.getTaskForActivityLocked(token, onlyRoot); 2515 } 2516 } 2517 2518 @Override getTasks(int maxNum)2519 public List<ActivityManager.RunningTaskInfo> getTasks(int maxNum) { 2520 return getFilteredTasks(maxNum, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED); 2521 } 2522 2523 @Override getFilteredTasks(int maxNum, @WindowConfiguration.ActivityType int ignoreActivityType, @WindowConfiguration.WindowingMode int ignoreWindowingMode)2524 public List<ActivityManager.RunningTaskInfo> getFilteredTasks(int maxNum, 2525 @WindowConfiguration.ActivityType int ignoreActivityType, 2526 @WindowConfiguration.WindowingMode int ignoreWindowingMode) { 2527 final int callingUid = Binder.getCallingUid(); 2528 final int callingPid = Binder.getCallingPid(); 2529 final boolean crossUser = isCrossUserAllowed(callingPid, callingUid); 2530 final int[] profileIds = getUserManager().getProfileIds( 2531 UserHandle.getUserId(callingUid), true); 2532 ArraySet<Integer> callingProfileIds = new ArraySet<>(); 2533 for (int i = 0; i < profileIds.length; i++) { 2534 callingProfileIds.add(profileIds[i]); 2535 } 2536 ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>(); 2537 2538 synchronized (mGlobalLock) { 2539 if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum); 2540 2541 final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid); 2542 mRootActivityContainer.getRunningTasks(maxNum, list, ignoreActivityType, 2543 ignoreWindowingMode, callingUid, allowed, crossUser, callingProfileIds); 2544 } 2545 2546 return list; 2547 } 2548 2549 @Override finishSubActivity(IBinder token, String resultWho, int requestCode)2550 public final void finishSubActivity(IBinder token, String resultWho, int requestCode) { 2551 synchronized (mGlobalLock) { 2552 final long origId = Binder.clearCallingIdentity(); 2553 ActivityRecord r = ActivityRecord.isInStackLocked(token); 2554 if (r != null) { 2555 r.getActivityStack().finishSubActivityLocked(r, resultWho, requestCode); 2556 } 2557 Binder.restoreCallingIdentity(origId); 2558 } 2559 } 2560 2561 @Override willActivityBeVisible(IBinder token)2562 public boolean willActivityBeVisible(IBinder token) { 2563 synchronized (mGlobalLock) { 2564 ActivityStack stack = ActivityRecord.getStackLocked(token); 2565 if (stack != null) { 2566 return stack.willActivityBeVisibleLocked(token); 2567 } 2568 return false; 2569 } 2570 } 2571 2572 @Override moveTaskToStack(int taskId, int stackId, boolean toTop)2573 public void moveTaskToStack(int taskId, int stackId, boolean toTop) { 2574 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "moveTaskToStack()"); 2575 synchronized (mGlobalLock) { 2576 final long ident = Binder.clearCallingIdentity(); 2577 try { 2578 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId); 2579 if (task == null) { 2580 Slog.w(TAG, "moveTaskToStack: No task for id=" + taskId); 2581 return; 2582 } 2583 2584 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToStack: moving task=" + taskId 2585 + " to stackId=" + stackId + " toTop=" + toTop); 2586 2587 final ActivityStack stack = mRootActivityContainer.getStack(stackId); 2588 if (stack == null) { 2589 throw new IllegalStateException( 2590 "moveTaskToStack: No stack for stackId=" + stackId); 2591 } 2592 if (!stack.isActivityTypeStandardOrUndefined()) { 2593 throw new IllegalArgumentException("moveTaskToStack: Attempt to move task " 2594 + taskId + " to stack " + stackId); 2595 } 2596 if (stack.inSplitScreenPrimaryWindowingMode()) { 2597 mWindowManager.setDockedStackCreateState( 2598 SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT, null /* initialBounds */); 2599 } 2600 task.reparent(stack, toTop, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE, !DEFER_RESUME, 2601 "moveTaskToStack"); 2602 } finally { 2603 Binder.restoreCallingIdentity(ident); 2604 } 2605 } 2606 } 2607 2608 @Override resizeStack(int stackId, Rect destBounds, boolean allowResizeInDockedMode, boolean preserveWindows, boolean animate, int animationDuration)2609 public void resizeStack(int stackId, Rect destBounds, boolean allowResizeInDockedMode, 2610 boolean preserveWindows, boolean animate, int animationDuration) { 2611 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizeStack()"); 2612 2613 final long ident = Binder.clearCallingIdentity(); 2614 try { 2615 synchronized (mGlobalLock) { 2616 if (animate) { 2617 final ActivityStack stack = mRootActivityContainer.getStack(stackId); 2618 if (stack == null) { 2619 Slog.w(TAG, "resizeStack: stackId " + stackId + " not found."); 2620 return; 2621 } 2622 if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) { 2623 throw new IllegalArgumentException("Stack: " + stackId 2624 + " doesn't support animated resize."); 2625 } 2626 stack.animateResizePinnedStack(null /* sourceHintBounds */, destBounds, 2627 animationDuration, false /* fromFullscreen */); 2628 } else { 2629 final ActivityStack stack = mRootActivityContainer.getStack(stackId); 2630 if (stack == null) { 2631 Slog.w(TAG, "resizeStack: stackId " + stackId + " not found."); 2632 return; 2633 } 2634 mRootActivityContainer.resizeStack(stack, destBounds, 2635 null /* tempTaskBounds */, null /* tempTaskInsetBounds */, 2636 preserveWindows, allowResizeInDockedMode, !DEFER_RESUME); 2637 } 2638 } 2639 } finally { 2640 Binder.restoreCallingIdentity(ident); 2641 } 2642 } 2643 2644 @Override offsetPinnedStackBounds(int stackId, Rect compareBounds, int xOffset, int yOffset, int animationDuration)2645 public void offsetPinnedStackBounds(int stackId, Rect compareBounds, int xOffset, int yOffset, 2646 int animationDuration) { 2647 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "offsetPinnedStackBounds()"); 2648 2649 final long ident = Binder.clearCallingIdentity(); 2650 try { 2651 synchronized (mGlobalLock) { 2652 if (xOffset == 0 && yOffset == 0) { 2653 return; 2654 } 2655 final ActivityStack stack = mRootActivityContainer.getStack(stackId); 2656 if (stack == null) { 2657 Slog.w(TAG, "offsetPinnedStackBounds: stackId " + stackId + " not found."); 2658 return; 2659 } 2660 if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) { 2661 throw new IllegalArgumentException("Stack: " + stackId 2662 + " doesn't support animated resize."); 2663 } 2664 final Rect destBounds = new Rect(); 2665 stack.getAnimationOrCurrentBounds(destBounds); 2666 if (destBounds.isEmpty() || !destBounds.equals(compareBounds)) { 2667 Slog.w(TAG, "The current stack bounds does not matched! It may be obsolete."); 2668 return; 2669 } 2670 destBounds.offset(xOffset, yOffset); 2671 stack.animateResizePinnedStack(null /* sourceHintBounds */, destBounds, 2672 animationDuration, false /* fromFullscreen */); 2673 } 2674 } finally { 2675 Binder.restoreCallingIdentity(ident); 2676 } 2677 } 2678 /** 2679 * Moves the specified task to the primary-split-screen stack. 2680 * 2681 * @param taskId Id of task to move. 2682 * @param createMode The mode the primary split screen stack should be created in if it doesn't 2683 * exist already. See 2684 * {@link android.app.ActivityTaskManager#SPLIT_SCREEN_CREATE_MODE_TOP_OR_LEFT} 2685 * and 2686 * {@link android.app.ActivityTaskManager#SPLIT_SCREEN_CREATE_MODE_BOTTOM_OR_RIGHT} 2687 * @param toTop If the task and stack should be moved to the top. 2688 * @param animate Whether we should play an animation for the moving the task. 2689 * @param initialBounds If the primary stack gets created, it will use these bounds for the 2690 * stack. Pass {@code null} to use default bounds. 2691 * @param showRecents If the recents activity should be shown on the other side of the task 2692 * going into split-screen mode. 2693 */ 2694 @Override setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode, boolean toTop, boolean animate, Rect initialBounds, boolean showRecents)2695 public boolean setTaskWindowingModeSplitScreenPrimary(int taskId, int createMode, 2696 boolean toTop, boolean animate, Rect initialBounds, boolean showRecents) { 2697 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, 2698 "setTaskWindowingModeSplitScreenPrimary()"); 2699 synchronized (mGlobalLock) { 2700 final long ident = Binder.clearCallingIdentity(); 2701 try { 2702 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId, 2703 MATCH_TASK_IN_STACKS_ONLY); 2704 if (task == null) { 2705 Slog.w(TAG, "setTaskWindowingModeSplitScreenPrimary: No task for id=" + taskId); 2706 return false; 2707 } 2708 if (DEBUG_STACK) Slog.d(TAG_STACK, 2709 "setTaskWindowingModeSplitScreenPrimary: moving task=" + taskId 2710 + " to createMode=" + createMode + " toTop=" + toTop); 2711 if (!task.isActivityTypeStandardOrUndefined()) { 2712 throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move" 2713 + " non-standard task " + taskId + " to split-screen windowing mode"); 2714 } 2715 2716 mWindowManager.setDockedStackCreateState(createMode, initialBounds); 2717 final int windowingMode = task.getWindowingMode(); 2718 final ActivityStack stack = task.getStack(); 2719 if (toTop) { 2720 stack.moveToFront("setTaskWindowingModeSplitScreenPrimary", task); 2721 } 2722 stack.setWindowingMode(WINDOWING_MODE_SPLIT_SCREEN_PRIMARY, animate, showRecents, 2723 false /* enteringSplitScreenMode */, false /* deferEnsuringVisibility */, 2724 false /* creating */); 2725 return windowingMode != task.getWindowingMode(); 2726 } finally { 2727 Binder.restoreCallingIdentity(ident); 2728 } 2729 } 2730 } 2731 2732 /** 2733 * Removes stacks in the input windowing modes from the system if they are of activity type 2734 * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED 2735 */ 2736 @Override removeStacksInWindowingModes(int[] windowingModes)2737 public void removeStacksInWindowingModes(int[] windowingModes) { 2738 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, 2739 "removeStacksInWindowingModes()"); 2740 2741 synchronized (mGlobalLock) { 2742 final long ident = Binder.clearCallingIdentity(); 2743 try { 2744 mRootActivityContainer.removeStacksInWindowingModes(windowingModes); 2745 } finally { 2746 Binder.restoreCallingIdentity(ident); 2747 } 2748 } 2749 } 2750 2751 @Override removeStacksWithActivityTypes(int[] activityTypes)2752 public void removeStacksWithActivityTypes(int[] activityTypes) { 2753 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, 2754 "removeStacksWithActivityTypes()"); 2755 2756 synchronized (mGlobalLock) { 2757 final long ident = Binder.clearCallingIdentity(); 2758 try { 2759 mRootActivityContainer.removeStacksWithActivityTypes(activityTypes); 2760 } finally { 2761 Binder.restoreCallingIdentity(ident); 2762 } 2763 } 2764 } 2765 2766 @Override getRecentTasks(int maxNum, int flags, int userId)2767 public ParceledListSlice<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags, 2768 int userId) { 2769 final int callingUid = Binder.getCallingUid(); 2770 userId = handleIncomingUser(Binder.getCallingPid(), callingUid, userId, "getRecentTasks"); 2771 final boolean allowed = isGetTasksAllowed("getRecentTasks", Binder.getCallingPid(), 2772 callingUid); 2773 final boolean detailed = checkGetTasksPermission( 2774 android.Manifest.permission.GET_DETAILED_TASKS, Binder.getCallingPid(), 2775 UserHandle.getAppId(callingUid)) 2776 == PackageManager.PERMISSION_GRANTED; 2777 2778 synchronized (mGlobalLock) { 2779 return mRecentTasks.getRecentTasks(maxNum, flags, allowed, detailed, userId, 2780 callingUid); 2781 } 2782 } 2783 2784 @Override getAllStackInfos()2785 public List<ActivityManager.StackInfo> getAllStackInfos() { 2786 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()"); 2787 long ident = Binder.clearCallingIdentity(); 2788 try { 2789 synchronized (mGlobalLock) { 2790 return mRootActivityContainer.getAllStackInfos(); 2791 } 2792 } finally { 2793 Binder.restoreCallingIdentity(ident); 2794 } 2795 } 2796 2797 @Override getStackInfo(int windowingMode, int activityType)2798 public ActivityManager.StackInfo getStackInfo(int windowingMode, int activityType) { 2799 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()"); 2800 long ident = Binder.clearCallingIdentity(); 2801 try { 2802 synchronized (mGlobalLock) { 2803 return mRootActivityContainer.getStackInfo(windowingMode, activityType); 2804 } 2805 } finally { 2806 Binder.restoreCallingIdentity(ident); 2807 } 2808 } 2809 2810 @Override cancelRecentsAnimation(boolean restoreHomeStackPosition)2811 public void cancelRecentsAnimation(boolean restoreHomeStackPosition) { 2812 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "cancelRecentsAnimation()"); 2813 final long callingUid = Binder.getCallingUid(); 2814 final long origId = Binder.clearCallingIdentity(); 2815 try { 2816 synchronized (mGlobalLock) { 2817 // Cancel the recents animation synchronously (do not hold the WM lock) 2818 mWindowManager.cancelRecentsAnimationSynchronously(restoreHomeStackPosition 2819 ? REORDER_MOVE_TO_ORIGINAL_POSITION 2820 : REORDER_KEEP_IN_PLACE, "cancelRecentsAnimation/uid=" + callingUid); 2821 } 2822 } finally { 2823 Binder.restoreCallingIdentity(origId); 2824 } 2825 } 2826 2827 @Override startLockTaskModeByToken(IBinder token)2828 public void startLockTaskModeByToken(IBinder token) { 2829 synchronized (mGlobalLock) { 2830 final ActivityRecord r = ActivityRecord.forTokenLocked(token); 2831 if (r == null) { 2832 return; 2833 } 2834 startLockTaskModeLocked(r.getTaskRecord(), false /* isSystemCaller */); 2835 } 2836 } 2837 2838 @Override startSystemLockTaskMode(int taskId)2839 public void startSystemLockTaskMode(int taskId) { 2840 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "startSystemLockTaskMode"); 2841 // This makes inner call to look as if it was initiated by system. 2842 long ident = Binder.clearCallingIdentity(); 2843 try { 2844 synchronized (mGlobalLock) { 2845 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId, 2846 MATCH_TASK_IN_STACKS_ONLY); 2847 if (task == null) { 2848 return; 2849 } 2850 2851 // When starting lock task mode the stack must be in front and focused 2852 task.getStack().moveToFront("startSystemLockTaskMode"); 2853 startLockTaskModeLocked(task, true /* isSystemCaller */); 2854 } 2855 } finally { 2856 Binder.restoreCallingIdentity(ident); 2857 } 2858 } 2859 2860 @Override stopLockTaskModeByToken(IBinder token)2861 public void stopLockTaskModeByToken(IBinder token) { 2862 synchronized (mGlobalLock) { 2863 final ActivityRecord r = ActivityRecord.forTokenLocked(token); 2864 if (r == null) { 2865 return; 2866 } 2867 stopLockTaskModeInternal(r.getTaskRecord(), false /* isSystemCaller */); 2868 } 2869 } 2870 2871 /** 2872 * This API should be called by SystemUI only when user perform certain action to dismiss 2873 * lock task mode. We should only dismiss pinned lock task mode in this case. 2874 */ 2875 @Override stopSystemLockTaskMode()2876 public void stopSystemLockTaskMode() throws RemoteException { 2877 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "stopSystemLockTaskMode"); 2878 stopLockTaskModeInternal(null, true /* isSystemCaller */); 2879 } 2880 startLockTaskModeLocked(@ullable TaskRecord task, boolean isSystemCaller)2881 private void startLockTaskModeLocked(@Nullable TaskRecord task, boolean isSystemCaller) { 2882 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "startLockTaskModeLocked: " + task); 2883 if (task == null || task.mLockTaskAuth == LOCK_TASK_AUTH_DONT_LOCK) { 2884 return; 2885 } 2886 2887 final ActivityStack stack = mRootActivityContainer.getTopDisplayFocusedStack(); 2888 if (stack == null || task != stack.topTask()) { 2889 throw new IllegalArgumentException("Invalid task, not in foreground"); 2890 } 2891 2892 // {@code isSystemCaller} is used to distinguish whether this request is initiated by the 2893 // system or a specific app. 2894 // * System-initiated requests will only start the pinned mode (screen pinning) 2895 // * App-initiated requests 2896 // - will put the device in fully locked mode (LockTask), if the app is whitelisted 2897 // - will start the pinned mode, otherwise 2898 final int callingUid = Binder.getCallingUid(); 2899 long ident = Binder.clearCallingIdentity(); 2900 try { 2901 // When a task is locked, dismiss the pinned stack if it exists 2902 mRootActivityContainer.removeStacksInWindowingModes(WINDOWING_MODE_PINNED); 2903 2904 getLockTaskController().startLockTaskMode(task, isSystemCaller, callingUid); 2905 } finally { 2906 Binder.restoreCallingIdentity(ident); 2907 } 2908 } 2909 stopLockTaskModeInternal(@ullable TaskRecord task, boolean isSystemCaller)2910 private void stopLockTaskModeInternal(@Nullable TaskRecord task, boolean isSystemCaller) { 2911 final int callingUid = Binder.getCallingUid(); 2912 long ident = Binder.clearCallingIdentity(); 2913 try { 2914 synchronized (mGlobalLock) { 2915 getLockTaskController().stopLockTaskMode(task, isSystemCaller, callingUid); 2916 } 2917 // Launch in-call UI if a call is ongoing. This is necessary to allow stopping the lock 2918 // task and jumping straight into a call in the case of emergency call back. 2919 TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE); 2920 if (tm != null) { 2921 tm.showInCallScreen(false); 2922 } 2923 } finally { 2924 Binder.restoreCallingIdentity(ident); 2925 } 2926 } 2927 2928 @Override updateLockTaskPackages(int userId, String[] packages)2929 public void updateLockTaskPackages(int userId, String[] packages) { 2930 final int callingUid = Binder.getCallingUid(); 2931 if (callingUid != 0 && callingUid != SYSTEM_UID) { 2932 mAmInternal.enforceCallingPermission(Manifest.permission.UPDATE_LOCK_TASK_PACKAGES, 2933 "updateLockTaskPackages()"); 2934 } 2935 synchronized (this) { 2936 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "Whitelisting " + userId + ":" 2937 + Arrays.toString(packages)); 2938 getLockTaskController().updateLockTaskPackages(userId, packages); 2939 } 2940 } 2941 2942 @Override isInLockTaskMode()2943 public boolean isInLockTaskMode() { 2944 return getLockTaskModeState() != LOCK_TASK_MODE_NONE; 2945 } 2946 2947 @Override getLockTaskModeState()2948 public int getLockTaskModeState() { 2949 synchronized (mGlobalLock) { 2950 return getLockTaskController().getLockTaskModeState(); 2951 } 2952 } 2953 2954 @Override setTaskDescription(IBinder token, ActivityManager.TaskDescription td)2955 public void setTaskDescription(IBinder token, ActivityManager.TaskDescription td) { 2956 synchronized (mGlobalLock) { 2957 ActivityRecord r = ActivityRecord.isInStackLocked(token); 2958 if (r != null) { 2959 r.setTaskDescription(td); 2960 final TaskRecord task = r.getTaskRecord(); 2961 task.updateTaskDescription(); 2962 mTaskChangeNotificationController.notifyTaskDescriptionChanged(task.getTaskInfo()); 2963 } 2964 } 2965 } 2966 2967 @Override getActivityOptions(IBinder token)2968 public Bundle getActivityOptions(IBinder token) { 2969 final long origId = Binder.clearCallingIdentity(); 2970 try { 2971 synchronized (mGlobalLock) { 2972 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 2973 if (r != null) { 2974 final ActivityOptions activityOptions = r.takeOptionsLocked( 2975 true /* fromClient */); 2976 return activityOptions == null ? null : activityOptions.toBundle(); 2977 } 2978 return null; 2979 } 2980 } finally { 2981 Binder.restoreCallingIdentity(origId); 2982 } 2983 } 2984 2985 @Override getAppTasks(String callingPackage)2986 public List<IBinder> getAppTasks(String callingPackage) { 2987 int callingUid = Binder.getCallingUid(); 2988 long ident = Binder.clearCallingIdentity(); 2989 try { 2990 synchronized (mGlobalLock) { 2991 return mRecentTasks.getAppTasksList(callingUid, callingPackage); 2992 } 2993 } finally { 2994 Binder.restoreCallingIdentity(ident); 2995 } 2996 } 2997 2998 @Override finishVoiceTask(IVoiceInteractionSession session)2999 public void finishVoiceTask(IVoiceInteractionSession session) { 3000 synchronized (mGlobalLock) { 3001 final long origId = Binder.clearCallingIdentity(); 3002 try { 3003 // TODO: VI Consider treating local voice interactions and voice tasks 3004 // differently here 3005 mRootActivityContainer.finishVoiceTask(session); 3006 } finally { 3007 Binder.restoreCallingIdentity(origId); 3008 } 3009 } 3010 3011 } 3012 3013 @Override isTopOfTask(IBinder token)3014 public boolean isTopOfTask(IBinder token) { 3015 synchronized (mGlobalLock) { 3016 ActivityRecord r = ActivityRecord.isInStackLocked(token); 3017 return r != null && r.getTaskRecord().getTopActivity() == r; 3018 } 3019 } 3020 3021 @Override notifyLaunchTaskBehindComplete(IBinder token)3022 public void notifyLaunchTaskBehindComplete(IBinder token) { 3023 mStackSupervisor.scheduleLaunchTaskBehindComplete(token); 3024 } 3025 3026 @Override notifyEnterAnimationComplete(IBinder token)3027 public void notifyEnterAnimationComplete(IBinder token) { 3028 mH.post(() -> { 3029 synchronized (mGlobalLock) { 3030 ActivityRecord r = ActivityRecord.forTokenLocked(token); 3031 if (r != null && r.attachedToProcess()) { 3032 try { 3033 r.app.getThread().scheduleEnterAnimationComplete(r.appToken); 3034 } catch (RemoteException e) { 3035 } 3036 } 3037 } 3038 3039 }); 3040 } 3041 3042 /** Called from an app when assist data is ready. */ 3043 @Override reportAssistContextExtras(IBinder token, Bundle extras, AssistStructure structure, AssistContent content, Uri referrer)3044 public void reportAssistContextExtras(IBinder token, Bundle extras, AssistStructure structure, 3045 AssistContent content, Uri referrer) { 3046 PendingAssistExtras pae = (PendingAssistExtras) token; 3047 synchronized (pae) { 3048 pae.result = extras; 3049 pae.structure = structure; 3050 pae.content = content; 3051 if (referrer != null) { 3052 pae.extras.putParcelable(Intent.EXTRA_REFERRER, referrer); 3053 } 3054 if (structure != null) { 3055 // Pre-fill the task/activity component for all assist data receivers 3056 structure.setTaskId(pae.activity.getTaskRecord().taskId); 3057 structure.setActivityComponent(pae.activity.mActivityComponent); 3058 structure.setHomeActivity(pae.isHome); 3059 } 3060 pae.haveResult = true; 3061 pae.notifyAll(); 3062 if (pae.intent == null && pae.receiver == null) { 3063 // Caller is just waiting for the result. 3064 return; 3065 } 3066 } 3067 // We are now ready to launch the assist activity. 3068 IAssistDataReceiver sendReceiver = null; 3069 Bundle sendBundle = null; 3070 synchronized (mGlobalLock) { 3071 buildAssistBundleLocked(pae, extras); 3072 boolean exists = mPendingAssistExtras.remove(pae); 3073 mUiHandler.removeCallbacks(pae); 3074 if (!exists) { 3075 // Timed out. 3076 return; 3077 } 3078 3079 if ((sendReceiver = pae.receiver) != null) { 3080 // Caller wants result sent back to them. 3081 sendBundle = new Bundle(); 3082 sendBundle.putInt(ActivityTaskManagerInternal.ASSIST_TASK_ID, 3083 pae.activity.getTaskRecord().taskId); 3084 sendBundle.putBinder(ActivityTaskManagerInternal.ASSIST_ACTIVITY_ID, 3085 pae.activity.assistToken); 3086 sendBundle.putBundle(ASSIST_KEY_DATA, pae.extras); 3087 sendBundle.putParcelable(ASSIST_KEY_STRUCTURE, pae.structure); 3088 sendBundle.putParcelable(ASSIST_KEY_CONTENT, pae.content); 3089 sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras); 3090 } 3091 } 3092 if (sendReceiver != null) { 3093 try { 3094 sendReceiver.onHandleAssistData(sendBundle); 3095 } catch (RemoteException e) { 3096 } 3097 return; 3098 } 3099 3100 final long ident = Binder.clearCallingIdentity(); 3101 try { 3102 if (TextUtils.equals(pae.intent.getAction(), 3103 android.service.voice.VoiceInteractionService.SERVICE_INTERFACE)) { 3104 pae.intent.putExtras(pae.extras); 3105 3106 startVoiceInteractionServiceAsUser(pae.intent, pae.userHandle, "AssistContext"); 3107 } else { 3108 pae.intent.replaceExtras(pae.extras); 3109 pae.intent.setFlags(FLAG_ACTIVITY_NEW_TASK 3110 | Intent.FLAG_ACTIVITY_SINGLE_TOP 3111 | Intent.FLAG_ACTIVITY_CLEAR_TOP); 3112 mInternal.closeSystemDialogs("assist"); 3113 3114 try { 3115 mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle)); 3116 } catch (ActivityNotFoundException e) { 3117 Slog.w(TAG, "No activity to handle assist action.", e); 3118 } 3119 } 3120 } finally { 3121 Binder.restoreCallingIdentity(ident); 3122 } 3123 } 3124 3125 /** 3126 * Workaround for historical API which starts the Assist service with a non-foreground 3127 * {@code startService()} call. 3128 */ startVoiceInteractionServiceAsUser( Intent intent, int userHandle, String reason)3129 private void startVoiceInteractionServiceAsUser( 3130 Intent intent, int userHandle, String reason) { 3131 // Resolve the intent to find out which package we need to whitelist. 3132 ResolveInfo resolveInfo = 3133 mContext.getPackageManager().resolveServiceAsUser(intent, 0, userHandle); 3134 if (resolveInfo == null || resolveInfo.serviceInfo == null) { 3135 Slog.e(TAG, "VoiceInteractionService intent does not resolve. Not starting."); 3136 return; 3137 } 3138 intent.setPackage(resolveInfo.serviceInfo.packageName); 3139 3140 // Whitelist background services temporarily. 3141 LocalServices.getService(DeviceIdleController.LocalService.class) 3142 .addPowerSaveTempWhitelistApp(Process.myUid(), intent.getPackage(), 3143 SERVICE_LAUNCH_IDLE_WHITELIST_DURATION_MS, userHandle, false, reason); 3144 3145 // Finally, try to start the service. 3146 try { 3147 mContext.startServiceAsUser(intent, UserHandle.of(userHandle)); 3148 } catch (RuntimeException e) { 3149 Slog.e(TAG, "VoiceInteractionService failed to start.", e); 3150 } 3151 } 3152 3153 @Override addAppTask(IBinder activityToken, Intent intent, ActivityManager.TaskDescription description, Bitmap thumbnail)3154 public int addAppTask(IBinder activityToken, Intent intent, 3155 ActivityManager.TaskDescription description, Bitmap thumbnail) throws RemoteException { 3156 final int callingUid = Binder.getCallingUid(); 3157 final long callingIdent = Binder.clearCallingIdentity(); 3158 3159 try { 3160 synchronized (mGlobalLock) { 3161 ActivityRecord r = ActivityRecord.isInStackLocked(activityToken); 3162 if (r == null) { 3163 throw new IllegalArgumentException("Activity does not exist; token=" 3164 + activityToken); 3165 } 3166 ComponentName comp = intent.getComponent(); 3167 if (comp == null) { 3168 throw new IllegalArgumentException("Intent " + intent 3169 + " must specify explicit component"); 3170 } 3171 if (thumbnail.getWidth() != mThumbnailWidth 3172 || thumbnail.getHeight() != mThumbnailHeight) { 3173 throw new IllegalArgumentException("Bad thumbnail size: got " 3174 + thumbnail.getWidth() + "x" + thumbnail.getHeight() + ", require " 3175 + mThumbnailWidth + "x" + mThumbnailHeight); 3176 } 3177 if (intent.getSelector() != null) { 3178 intent.setSelector(null); 3179 } 3180 if (intent.getSourceBounds() != null) { 3181 intent.setSourceBounds(null); 3182 } 3183 if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0) { 3184 if ((intent.getFlags()&Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS) == 0) { 3185 // The caller has added this as an auto-remove task... that makes no 3186 // sense, so turn off auto-remove. 3187 intent.addFlags(Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS); 3188 } 3189 } 3190 final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp, 3191 STOCK_PM_FLAGS, UserHandle.getUserId(callingUid)); 3192 if (ainfo.applicationInfo.uid != callingUid) { 3193 throw new SecurityException( 3194 "Can't add task for another application: target uid=" 3195 + ainfo.applicationInfo.uid + ", calling uid=" + callingUid); 3196 } 3197 3198 final ActivityStack stack = r.getActivityStack(); 3199 final TaskRecord task = stack.createTaskRecord( 3200 mStackSupervisor.getNextTaskIdForUserLocked(r.mUserId), ainfo, intent, 3201 null /* voiceSession */, null /* voiceInteractor */, !ON_TOP); 3202 if (!mRecentTasks.addToBottom(task)) { 3203 // The app has too many tasks already and we can't add any more 3204 stack.removeTask(task, "addAppTask", REMOVE_TASK_MODE_DESTROYING); 3205 return INVALID_TASK_ID; 3206 } 3207 task.lastTaskDescription.copyFrom(description); 3208 3209 // TODO: Send the thumbnail to WM to store it. 3210 3211 return task.taskId; 3212 } 3213 } finally { 3214 Binder.restoreCallingIdentity(callingIdent); 3215 } 3216 } 3217 3218 @Override getAppTaskThumbnailSize()3219 public Point getAppTaskThumbnailSize() { 3220 synchronized (mGlobalLock) { 3221 return new Point(mThumbnailWidth, mThumbnailHeight); 3222 } 3223 } 3224 3225 @Override setTaskResizeable(int taskId, int resizeableMode)3226 public void setTaskResizeable(int taskId, int resizeableMode) { 3227 synchronized (mGlobalLock) { 3228 final TaskRecord task = mRootActivityContainer.anyTaskForId( 3229 taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS); 3230 if (task == null) { 3231 Slog.w(TAG, "setTaskResizeable: taskId=" + taskId + " not found"); 3232 return; 3233 } 3234 task.setResizeMode(resizeableMode); 3235 } 3236 } 3237 3238 @Override resizeTask(int taskId, Rect bounds, int resizeMode)3239 public void resizeTask(int taskId, Rect bounds, int resizeMode) { 3240 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "resizeTask()"); 3241 long ident = Binder.clearCallingIdentity(); 3242 try { 3243 synchronized (mGlobalLock) { 3244 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId, 3245 MATCH_TASK_IN_STACKS_ONLY); 3246 if (task == null) { 3247 Slog.w(TAG, "resizeTask: taskId=" + taskId + " not found"); 3248 return; 3249 } 3250 // Place the task in the right stack if it isn't there already based on 3251 // the requested bounds. 3252 // The stack transition logic is: 3253 // - a null bounds on a freeform task moves that task to fullscreen 3254 // - a non-null bounds on a non-freeform (fullscreen OR docked) task moves 3255 // that task to freeform 3256 // - otherwise the task is not moved 3257 ActivityStack stack = task.getStack(); 3258 if (!task.getWindowConfiguration().canResizeTask()) { 3259 throw new IllegalArgumentException("resizeTask not allowed on task=" + task); 3260 } 3261 if (bounds == null && stack.getWindowingMode() == WINDOWING_MODE_FREEFORM) { 3262 stack = stack.getDisplay().getOrCreateStack( 3263 WINDOWING_MODE_FULLSCREEN, stack.getActivityType(), ON_TOP); 3264 } else if (bounds != null && stack.getWindowingMode() != WINDOWING_MODE_FREEFORM) { 3265 stack = stack.getDisplay().getOrCreateStack( 3266 WINDOWING_MODE_FREEFORM, stack.getActivityType(), ON_TOP); 3267 } 3268 3269 // Reparent the task to the right stack if necessary 3270 boolean preserveWindow = (resizeMode & RESIZE_MODE_PRESERVE_WINDOW) != 0; 3271 if (stack != task.getStack()) { 3272 // Defer resume until the task is resized below 3273 task.reparent(stack, ON_TOP, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE, 3274 DEFER_RESUME, "resizeTask"); 3275 preserveWindow = false; 3276 } 3277 3278 // After reparenting (which only resizes the task to the stack bounds), resize the 3279 // task to the actual bounds provided 3280 task.resize(bounds, resizeMode, preserveWindow, !DEFER_RESUME); 3281 } 3282 } finally { 3283 Binder.restoreCallingIdentity(ident); 3284 } 3285 } 3286 3287 @Override releaseActivityInstance(IBinder token)3288 public boolean releaseActivityInstance(IBinder token) { 3289 synchronized (mGlobalLock) { 3290 final long origId = Binder.clearCallingIdentity(); 3291 try { 3292 ActivityRecord r = ActivityRecord.isInStackLocked(token); 3293 if (r == null) { 3294 return false; 3295 } 3296 return r.getActivityStack().safelyDestroyActivityLocked(r, "app-req"); 3297 } finally { 3298 Binder.restoreCallingIdentity(origId); 3299 } 3300 } 3301 } 3302 3303 @Override releaseSomeActivities(IApplicationThread appInt)3304 public void releaseSomeActivities(IApplicationThread appInt) { 3305 synchronized (mGlobalLock) { 3306 final long origId = Binder.clearCallingIdentity(); 3307 try { 3308 final WindowProcessController app = getProcessController(appInt); 3309 mRootActivityContainer.releaseSomeActivitiesLocked(app, "low-mem"); 3310 } finally { 3311 Binder.restoreCallingIdentity(origId); 3312 } 3313 } 3314 } 3315 3316 @Override setLockScreenShown(boolean keyguardShowing, boolean aodShowing)3317 public void setLockScreenShown(boolean keyguardShowing, boolean aodShowing) { 3318 if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER) 3319 != PackageManager.PERMISSION_GRANTED) { 3320 throw new SecurityException("Requires permission " 3321 + android.Manifest.permission.DEVICE_POWER); 3322 } 3323 3324 synchronized (mGlobalLock) { 3325 long ident = Binder.clearCallingIdentity(); 3326 if (mKeyguardShown != keyguardShowing) { 3327 mKeyguardShown = keyguardShowing; 3328 final Message msg = PooledLambda.obtainMessage( 3329 ActivityManagerInternal::reportCurKeyguardUsageEvent, mAmInternal, 3330 keyguardShowing); 3331 mH.sendMessage(msg); 3332 } 3333 try { 3334 mKeyguardController.setKeyguardShown(keyguardShowing, aodShowing); 3335 } finally { 3336 Binder.restoreCallingIdentity(ident); 3337 } 3338 } 3339 3340 mH.post(() -> { 3341 for (int i = mScreenObservers.size() - 1; i >= 0; i--) { 3342 mScreenObservers.get(i).onKeyguardStateChanged(keyguardShowing); 3343 } 3344 }); 3345 } 3346 onScreenAwakeChanged(boolean isAwake)3347 public void onScreenAwakeChanged(boolean isAwake) { 3348 mH.post(() -> { 3349 for (int i = mScreenObservers.size() - 1; i >= 0; i--) { 3350 mScreenObservers.get(i).onAwakeStateChanged(isAwake); 3351 } 3352 }); 3353 } 3354 3355 @Override getTaskDescriptionIcon(String filePath, int userId)3356 public Bitmap getTaskDescriptionIcon(String filePath, int userId) { 3357 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), 3358 userId, "getTaskDescriptionIcon"); 3359 3360 final File passedIconFile = new File(filePath); 3361 final File legitIconFile = new File(TaskPersister.getUserImagesDir(userId), 3362 passedIconFile.getName()); 3363 if (!legitIconFile.getPath().equals(filePath) 3364 || !filePath.contains(ActivityRecord.ACTIVITY_ICON_SUFFIX)) { 3365 throw new IllegalArgumentException("Bad file path: " + filePath 3366 + " passed for userId " + userId); 3367 } 3368 return mRecentTasks.getTaskDescriptionIcon(filePath); 3369 } 3370 3371 @Override startInPlaceAnimationOnFrontMostApplication(Bundle opts)3372 public void startInPlaceAnimationOnFrontMostApplication(Bundle opts) { 3373 final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(opts); 3374 final ActivityOptions activityOptions = safeOptions != null 3375 ? safeOptions.getOptions(mStackSupervisor) 3376 : null; 3377 if (activityOptions == null 3378 || activityOptions.getAnimationType() != ActivityOptions.ANIM_CUSTOM_IN_PLACE 3379 || activityOptions.getCustomInPlaceResId() == 0) { 3380 throw new IllegalArgumentException("Expected in-place ActivityOption " + 3381 "with valid animation"); 3382 } 3383 // Get top display of front most application. 3384 final ActivityStack focusedStack = getTopDisplayFocusedStack(); 3385 if (focusedStack != null) { 3386 final DisplayContent dc = focusedStack.getDisplay().mDisplayContent; 3387 dc.prepareAppTransition(TRANSIT_TASK_IN_PLACE, false); 3388 dc.mAppTransition.overrideInPlaceAppTransition(activityOptions.getPackageName(), 3389 activityOptions.getCustomInPlaceResId()); 3390 dc.executeAppTransition(); 3391 } 3392 } 3393 3394 @Override removeStack(int stackId)3395 public void removeStack(int stackId) { 3396 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "removeStack()"); 3397 synchronized (mGlobalLock) { 3398 final long ident = Binder.clearCallingIdentity(); 3399 try { 3400 final ActivityStack stack = mRootActivityContainer.getStack(stackId); 3401 if (stack == null) { 3402 Slog.w(TAG, "removeStack: No stack with id=" + stackId); 3403 return; 3404 } 3405 if (!stack.isActivityTypeStandardOrUndefined()) { 3406 throw new IllegalArgumentException( 3407 "Removing non-standard stack is not allowed."); 3408 } 3409 mStackSupervisor.removeStack(stack); 3410 } finally { 3411 Binder.restoreCallingIdentity(ident); 3412 } 3413 } 3414 } 3415 3416 @Override moveStackToDisplay(int stackId, int displayId)3417 public void moveStackToDisplay(int stackId, int displayId) { 3418 mAmInternal.enforceCallingPermission(INTERNAL_SYSTEM_WINDOW, "moveStackToDisplay()"); 3419 3420 synchronized (mGlobalLock) { 3421 final long ident = Binder.clearCallingIdentity(); 3422 try { 3423 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveStackToDisplay: moving stackId=" + stackId 3424 + " to displayId=" + displayId); 3425 mRootActivityContainer.moveStackToDisplay(stackId, displayId, ON_TOP); 3426 } finally { 3427 Binder.restoreCallingIdentity(ident); 3428 } 3429 } 3430 } 3431 3432 @Override toggleFreeformWindowingMode(IBinder token)3433 public void toggleFreeformWindowingMode(IBinder token) { 3434 synchronized (mGlobalLock) { 3435 long ident = Binder.clearCallingIdentity(); 3436 try { 3437 final ActivityRecord r = ActivityRecord.forTokenLocked(token); 3438 if (r == null) { 3439 throw new IllegalArgumentException( 3440 "toggleFreeformWindowingMode: No activity record matching token=" 3441 + token); 3442 } 3443 3444 final ActivityStack stack = r.getActivityStack(); 3445 if (stack == null) { 3446 throw new IllegalStateException("toggleFreeformWindowingMode: the activity " 3447 + "doesn't have a stack"); 3448 } 3449 3450 if (!stack.inFreeformWindowingMode() 3451 && stack.getWindowingMode() != WINDOWING_MODE_FULLSCREEN) { 3452 throw new IllegalStateException("toggleFreeformWindowingMode: You can only " 3453 + "toggle between fullscreen and freeform."); 3454 } 3455 3456 if (stack.inFreeformWindowingMode()) { 3457 stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN); 3458 } else if (stack.getParent().inFreeformWindowingMode()) { 3459 // If the window is on a freeform display, set it to undefined. It will be 3460 // resolved to freeform and it can adjust windowing mode when the display mode 3461 // changes in runtime. 3462 stack.setWindowingMode(WINDOWING_MODE_UNDEFINED); 3463 } else { 3464 stack.setWindowingMode(WINDOWING_MODE_FREEFORM); 3465 } 3466 } finally { 3467 Binder.restoreCallingIdentity(ident); 3468 } 3469 } 3470 } 3471 3472 /** Sets the task stack listener that gets callbacks when a task stack changes. */ 3473 @Override registerTaskStackListener(ITaskStackListener listener)3474 public void registerTaskStackListener(ITaskStackListener listener) { 3475 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, 3476 "registerTaskStackListener()"); 3477 mTaskChangeNotificationController.registerTaskStackListener(listener); 3478 } 3479 3480 /** Unregister a task stack listener so that it stops receiving callbacks. */ 3481 @Override unregisterTaskStackListener(ITaskStackListener listener)3482 public void unregisterTaskStackListener(ITaskStackListener listener) { 3483 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, 3484 "unregisterTaskStackListener()"); 3485 mTaskChangeNotificationController.unregisterTaskStackListener(listener); 3486 } 3487 3488 @Override requestAssistContextExtras(int requestType, IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken, boolean focused, boolean newSessionId)3489 public boolean requestAssistContextExtras(int requestType, IAssistDataReceiver receiver, 3490 Bundle receiverExtras, IBinder activityToken, boolean focused, boolean newSessionId) { 3491 return enqueueAssistContext(requestType, null, null, receiver, receiverExtras, 3492 activityToken, focused, newSessionId, UserHandle.getCallingUserId(), null, 3493 PENDING_ASSIST_EXTRAS_LONG_TIMEOUT, 0) != null; 3494 } 3495 3496 @Override requestAutofillData(IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken, int flags)3497 public boolean requestAutofillData(IAssistDataReceiver receiver, Bundle receiverExtras, 3498 IBinder activityToken, int flags) { 3499 return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_AUTOFILL, null, null, 3500 receiver, receiverExtras, activityToken, true, true, UserHandle.getCallingUserId(), 3501 null, PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT, flags) != null; 3502 } 3503 3504 @Override launchAssistIntent(Intent intent, int requestType, String hint, int userHandle, Bundle args)3505 public boolean launchAssistIntent(Intent intent, int requestType, String hint, int userHandle, 3506 Bundle args) { 3507 return enqueueAssistContext(requestType, intent, hint, null, null, null, 3508 true /* focused */, true /* newSessionId */, userHandle, args, 3509 PENDING_ASSIST_EXTRAS_TIMEOUT, 0) != null; 3510 } 3511 3512 @Override getAssistContextExtras(int requestType)3513 public Bundle getAssistContextExtras(int requestType) { 3514 PendingAssistExtras pae = enqueueAssistContext(requestType, null, null, null, 3515 null, null, true /* focused */, true /* newSessionId */, 3516 UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT, 0); 3517 if (pae == null) { 3518 return null; 3519 } 3520 synchronized (pae) { 3521 while (!pae.haveResult) { 3522 try { 3523 pae.wait(); 3524 } catch (InterruptedException e) { 3525 } 3526 } 3527 } 3528 synchronized (mGlobalLock) { 3529 buildAssistBundleLocked(pae, pae.result); 3530 mPendingAssistExtras.remove(pae); 3531 mUiHandler.removeCallbacks(pae); 3532 } 3533 return pae.extras; 3534 } 3535 3536 /** 3537 * Binder IPC calls go through the public entry point. 3538 * This can be called with or without the global lock held. 3539 */ checkCallingPermission(String permission)3540 private static int checkCallingPermission(String permission) { 3541 return checkPermission( 3542 permission, Binder.getCallingPid(), UserHandle.getAppId(Binder.getCallingUid())); 3543 } 3544 3545 /** This can be called with or without the global lock held. */ enforceCallerIsRecentsOrHasPermission(String permission, String func)3546 private void enforceCallerIsRecentsOrHasPermission(String permission, String func) { 3547 if (!getRecentTasks().isCallerRecents(Binder.getCallingUid())) { 3548 mAmInternal.enforceCallingPermission(permission, func); 3549 } 3550 } 3551 3552 @VisibleForTesting checkGetTasksPermission(String permission, int pid, int uid)3553 int checkGetTasksPermission(String permission, int pid, int uid) { 3554 return checkPermission(permission, pid, uid); 3555 } 3556 checkPermission(String permission, int pid, int uid)3557 static int checkPermission(String permission, int pid, int uid) { 3558 if (permission == null) { 3559 return PackageManager.PERMISSION_DENIED; 3560 } 3561 return checkComponentPermission(permission, pid, uid, -1, true); 3562 } 3563 checkComponentPermission(String permission, int pid, int uid, int owningUid, boolean exported)3564 public static int checkComponentPermission(String permission, int pid, int uid, 3565 int owningUid, boolean exported) { 3566 return ActivityManagerService.checkComponentPermission( 3567 permission, pid, uid, owningUid, exported); 3568 } 3569 isGetTasksAllowed(String caller, int callingPid, int callingUid)3570 boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) { 3571 if (getRecentTasks().isCallerRecents(callingUid)) { 3572 // Always allow the recents component to get tasks 3573 return true; 3574 } 3575 3576 boolean allowed = checkGetTasksPermission(android.Manifest.permission.REAL_GET_TASKS, 3577 callingPid, callingUid) == PackageManager.PERMISSION_GRANTED; 3578 if (!allowed) { 3579 if (checkGetTasksPermission(android.Manifest.permission.GET_TASKS, 3580 callingPid, callingUid) == PackageManager.PERMISSION_GRANTED) { 3581 // Temporary compatibility: some existing apps on the system image may 3582 // still be requesting the old permission and not switched to the new 3583 // one; if so, we'll still allow them full access. This means we need 3584 // to see if they are holding the old permission and are a system app. 3585 try { 3586 if (AppGlobals.getPackageManager().isUidPrivileged(callingUid)) { 3587 allowed = true; 3588 if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid 3589 + " is using old GET_TASKS but privileged; allowing"); 3590 } 3591 } catch (RemoteException e) { 3592 } 3593 } 3594 if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid 3595 + " does not hold REAL_GET_TASKS; limiting output"); 3596 } 3597 return allowed; 3598 } 3599 isCrossUserAllowed(int pid, int uid)3600 boolean isCrossUserAllowed(int pid, int uid) { 3601 return checkPermission(INTERACT_ACROSS_USERS, pid, uid) == PERMISSION_GRANTED 3602 || checkPermission(INTERACT_ACROSS_USERS_FULL, pid, uid) == PERMISSION_GRANTED; 3603 } 3604 enqueueAssistContext(int requestType, Intent intent, String hint, IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken, boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout, int flags)3605 private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint, 3606 IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken, 3607 boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout, 3608 int flags) { 3609 mAmInternal.enforceCallingPermission(android.Manifest.permission.GET_TOP_ACTIVITY_INFO, 3610 "enqueueAssistContext()"); 3611 3612 synchronized (mGlobalLock) { 3613 ActivityRecord activity = getTopDisplayFocusedStack().getTopActivity(); 3614 if (activity == null) { 3615 Slog.w(TAG, "getAssistContextExtras failed: no top activity"); 3616 return null; 3617 } 3618 if (!activity.attachedToProcess()) { 3619 Slog.w(TAG, "getAssistContextExtras failed: no process for " + activity); 3620 return null; 3621 } 3622 if (focused) { 3623 if (activityToken != null) { 3624 ActivityRecord caller = ActivityRecord.forTokenLocked(activityToken); 3625 if (activity != caller) { 3626 Slog.w(TAG, "enqueueAssistContext failed: caller " + caller 3627 + " is not current top " + activity); 3628 return null; 3629 } 3630 } 3631 } else { 3632 activity = ActivityRecord.forTokenLocked(activityToken); 3633 if (activity == null) { 3634 Slog.w(TAG, "enqueueAssistContext failed: activity for token=" + activityToken 3635 + " couldn't be found"); 3636 return null; 3637 } 3638 if (!activity.attachedToProcess()) { 3639 Slog.w(TAG, "enqueueAssistContext failed: no process for " + activity); 3640 return null; 3641 } 3642 } 3643 3644 PendingAssistExtras pae; 3645 Bundle extras = new Bundle(); 3646 if (args != null) { 3647 extras.putAll(args); 3648 } 3649 extras.putString(Intent.EXTRA_ASSIST_PACKAGE, activity.packageName); 3650 extras.putInt(Intent.EXTRA_ASSIST_UID, activity.app.mUid); 3651 3652 pae = new PendingAssistExtras(activity, extras, intent, hint, receiver, receiverExtras, 3653 userHandle); 3654 pae.isHome = activity.isActivityTypeHome(); 3655 3656 // Increment the sessionId if necessary 3657 if (newSessionId) { 3658 mViSessionId++; 3659 } 3660 try { 3661 activity.app.getThread().requestAssistContextExtras(activity.appToken, pae, 3662 requestType, mViSessionId, flags); 3663 mPendingAssistExtras.add(pae); 3664 mUiHandler.postDelayed(pae, timeout); 3665 } catch (RemoteException e) { 3666 Slog.w(TAG, "getAssistContextExtras failed: crash calling " + activity); 3667 return null; 3668 } 3669 return pae; 3670 } 3671 } 3672 buildAssistBundleLocked(PendingAssistExtras pae, Bundle result)3673 private void buildAssistBundleLocked(PendingAssistExtras pae, Bundle result) { 3674 if (result != null) { 3675 pae.extras.putBundle(Intent.EXTRA_ASSIST_CONTEXT, result); 3676 } 3677 if (pae.hint != null) { 3678 pae.extras.putBoolean(pae.hint, true); 3679 } 3680 } 3681 pendingAssistExtrasTimedOut(PendingAssistExtras pae)3682 private void pendingAssistExtrasTimedOut(PendingAssistExtras pae) { 3683 IAssistDataReceiver receiver; 3684 synchronized (mGlobalLock) { 3685 mPendingAssistExtras.remove(pae); 3686 receiver = pae.receiver; 3687 } 3688 if (receiver != null) { 3689 // Caller wants result sent back to them. 3690 Bundle sendBundle = new Bundle(); 3691 // At least return the receiver extras 3692 sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras); 3693 try { 3694 pae.receiver.onHandleAssistData(sendBundle); 3695 } catch (RemoteException e) { 3696 } 3697 } 3698 } 3699 3700 public class PendingAssistExtras extends Binder implements Runnable { 3701 public final ActivityRecord activity; 3702 public boolean isHome; 3703 public final Bundle extras; 3704 public final Intent intent; 3705 public final String hint; 3706 public final IAssistDataReceiver receiver; 3707 public final int userHandle; 3708 public boolean haveResult = false; 3709 public Bundle result = null; 3710 public AssistStructure structure = null; 3711 public AssistContent content = null; 3712 public Bundle receiverExtras; 3713 PendingAssistExtras(ActivityRecord _activity, Bundle _extras, Intent _intent, String _hint, IAssistDataReceiver _receiver, Bundle _receiverExtras, int _userHandle)3714 public PendingAssistExtras(ActivityRecord _activity, Bundle _extras, Intent _intent, 3715 String _hint, IAssistDataReceiver _receiver, Bundle _receiverExtras, 3716 int _userHandle) { 3717 activity = _activity; 3718 extras = _extras; 3719 intent = _intent; 3720 hint = _hint; 3721 receiver = _receiver; 3722 receiverExtras = _receiverExtras; 3723 userHandle = _userHandle; 3724 } 3725 3726 @Override run()3727 public void run() { 3728 Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from " + activity); 3729 synchronized (this) { 3730 haveResult = true; 3731 notifyAll(); 3732 } 3733 pendingAssistExtrasTimedOut(this); 3734 } 3735 } 3736 3737 @Override isAssistDataAllowedOnCurrentActivity()3738 public boolean isAssistDataAllowedOnCurrentActivity() { 3739 int userId; 3740 synchronized (mGlobalLock) { 3741 final ActivityStack focusedStack = getTopDisplayFocusedStack(); 3742 if (focusedStack == null || focusedStack.isActivityTypeAssistant()) { 3743 return false; 3744 } 3745 3746 final ActivityRecord activity = focusedStack.getTopActivity(); 3747 if (activity == null) { 3748 return false; 3749 } 3750 userId = activity.mUserId; 3751 } 3752 return !DevicePolicyCache.getInstance().getScreenCaptureDisabled(userId); 3753 } 3754 3755 @Override showAssistFromActivity(IBinder token, Bundle args)3756 public boolean showAssistFromActivity(IBinder token, Bundle args) { 3757 long ident = Binder.clearCallingIdentity(); 3758 try { 3759 synchronized (mGlobalLock) { 3760 ActivityRecord caller = ActivityRecord.forTokenLocked(token); 3761 ActivityRecord top = getTopDisplayFocusedStack().getTopActivity(); 3762 if (top != caller) { 3763 Slog.w(TAG, "showAssistFromActivity failed: caller " + caller 3764 + " is not current top " + top); 3765 return false; 3766 } 3767 if (!top.nowVisible) { 3768 Slog.w(TAG, "showAssistFromActivity failed: caller " + caller 3769 + " is not visible"); 3770 return false; 3771 } 3772 } 3773 return mAssistUtils.showSessionForActiveService(args, SHOW_SOURCE_APPLICATION, null, 3774 token); 3775 } finally { 3776 Binder.restoreCallingIdentity(ident); 3777 } 3778 } 3779 3780 @Override isRootVoiceInteraction(IBinder token)3781 public boolean isRootVoiceInteraction(IBinder token) { 3782 synchronized (mGlobalLock) { 3783 ActivityRecord r = ActivityRecord.isInStackLocked(token); 3784 if (r == null) { 3785 return false; 3786 } 3787 return r.rootVoiceInteraction; 3788 } 3789 } 3790 onLocalVoiceInteractionStartedLocked(IBinder activity, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor)3791 private void onLocalVoiceInteractionStartedLocked(IBinder activity, 3792 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) { 3793 ActivityRecord activityToCallback = ActivityRecord.forTokenLocked(activity); 3794 if (activityToCallback == null) return; 3795 activityToCallback.setVoiceSessionLocked(voiceSession); 3796 3797 // Inform the activity 3798 try { 3799 activityToCallback.app.getThread().scheduleLocalVoiceInteractionStarted(activity, 3800 voiceInteractor); 3801 long token = Binder.clearCallingIdentity(); 3802 try { 3803 startRunningVoiceLocked(voiceSession, activityToCallback.appInfo.uid); 3804 } finally { 3805 Binder.restoreCallingIdentity(token); 3806 } 3807 // TODO: VI Should we cache the activity so that it's easier to find later 3808 // rather than scan through all the stacks and activities? 3809 } catch (RemoteException re) { 3810 activityToCallback.clearVoiceSessionLocked(); 3811 // TODO: VI Should this terminate the voice session? 3812 } 3813 } 3814 startRunningVoiceLocked(IVoiceInteractionSession session, int targetUid)3815 private void startRunningVoiceLocked(IVoiceInteractionSession session, int targetUid) { 3816 Slog.d(TAG, "<<< startRunningVoiceLocked()"); 3817 mVoiceWakeLock.setWorkSource(new WorkSource(targetUid)); 3818 if (mRunningVoice == null || mRunningVoice.asBinder() != session.asBinder()) { 3819 boolean wasRunningVoice = mRunningVoice != null; 3820 mRunningVoice = session; 3821 if (!wasRunningVoice) { 3822 mVoiceWakeLock.acquire(); 3823 updateSleepIfNeededLocked(); 3824 } 3825 } 3826 } 3827 finishRunningVoiceLocked()3828 void finishRunningVoiceLocked() { 3829 if (mRunningVoice != null) { 3830 mRunningVoice = null; 3831 mVoiceWakeLock.release(); 3832 updateSleepIfNeededLocked(); 3833 } 3834 } 3835 3836 @Override setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake)3837 public void setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake) { 3838 synchronized (mGlobalLock) { 3839 if (mRunningVoice != null && mRunningVoice.asBinder() == session.asBinder()) { 3840 if (keepAwake) { 3841 mVoiceWakeLock.acquire(); 3842 } else { 3843 mVoiceWakeLock.release(); 3844 } 3845 } 3846 } 3847 } 3848 3849 @Override getActivityClassForToken(IBinder token)3850 public ComponentName getActivityClassForToken(IBinder token) { 3851 synchronized (mGlobalLock) { 3852 ActivityRecord r = ActivityRecord.isInStackLocked(token); 3853 if (r == null) { 3854 return null; 3855 } 3856 return r.intent.getComponent(); 3857 } 3858 } 3859 3860 @Override getPackageForToken(IBinder token)3861 public String getPackageForToken(IBinder token) { 3862 synchronized (mGlobalLock) { 3863 ActivityRecord r = ActivityRecord.isInStackLocked(token); 3864 if (r == null) { 3865 return null; 3866 } 3867 return r.packageName; 3868 } 3869 } 3870 3871 @Override showLockTaskEscapeMessage(IBinder token)3872 public void showLockTaskEscapeMessage(IBinder token) { 3873 synchronized (mGlobalLock) { 3874 final ActivityRecord r = ActivityRecord.forTokenLocked(token); 3875 if (r == null) { 3876 return; 3877 } 3878 getLockTaskController().showLockTaskToast(); 3879 } 3880 } 3881 3882 @Override keyguardGoingAway(int flags)3883 public void keyguardGoingAway(int flags) { 3884 enforceNotIsolatedCaller("keyguardGoingAway"); 3885 final long token = Binder.clearCallingIdentity(); 3886 try { 3887 synchronized (mGlobalLock) { 3888 mKeyguardController.keyguardGoingAway(flags); 3889 } 3890 } finally { 3891 Binder.restoreCallingIdentity(token); 3892 } 3893 } 3894 3895 /** 3896 * Try to place task to provided position. The final position might be different depending on 3897 * current user and stacks state. The task will be moved to target stack if it's currently in 3898 * different stack. 3899 */ 3900 @Override positionTaskInStack(int taskId, int stackId, int position)3901 public void positionTaskInStack(int taskId, int stackId, int position) { 3902 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "positionTaskInStack()"); 3903 synchronized (mGlobalLock) { 3904 long ident = Binder.clearCallingIdentity(); 3905 try { 3906 if (DEBUG_STACK) Slog.d(TAG_STACK, "positionTaskInStack: positioning task=" 3907 + taskId + " in stackId=" + stackId + " at position=" + position); 3908 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId); 3909 if (task == null) { 3910 throw new IllegalArgumentException("positionTaskInStack: no task for id=" 3911 + taskId); 3912 } 3913 3914 final ActivityStack stack = mRootActivityContainer.getStack(stackId); 3915 3916 if (stack == null) { 3917 throw new IllegalArgumentException("positionTaskInStack: no stack for id=" 3918 + stackId); 3919 } 3920 if (!stack.isActivityTypeStandardOrUndefined()) { 3921 throw new IllegalArgumentException("positionTaskInStack: Attempt to change" 3922 + " the position of task " + taskId + " in/to non-standard stack"); 3923 } 3924 3925 // TODO: Have the callers of this API call a separate reparent method if that is 3926 // what they intended to do vs. having this method also do reparenting. 3927 if (task.getStack() == stack) { 3928 // Change position in current stack. 3929 stack.positionChildAt(task, position); 3930 } else { 3931 // Reparent to new stack. 3932 task.reparent(stack, position, REPARENT_LEAVE_STACK_IN_PLACE, !ANIMATE, 3933 !DEFER_RESUME, "positionTaskInStack"); 3934 } 3935 } finally { 3936 Binder.restoreCallingIdentity(ident); 3937 } 3938 } 3939 } 3940 3941 @Override reportSizeConfigurations(IBinder token, int[] horizontalSizeConfiguration, int[] verticalSizeConfigurations, int[] smallestSizeConfigurations)3942 public void reportSizeConfigurations(IBinder token, int[] horizontalSizeConfiguration, 3943 int[] verticalSizeConfigurations, int[] smallestSizeConfigurations) { 3944 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Report configuration: " + token + " " 3945 + horizontalSizeConfiguration + " " + verticalSizeConfigurations); 3946 synchronized (mGlobalLock) { 3947 ActivityRecord record = ActivityRecord.isInStackLocked(token); 3948 if (record == null) { 3949 throw new IllegalArgumentException("reportSizeConfigurations: ActivityRecord not " 3950 + "found for: " + token); 3951 } 3952 record.setSizeConfigurations(horizontalSizeConfiguration, 3953 verticalSizeConfigurations, smallestSizeConfigurations); 3954 } 3955 } 3956 3957 /** 3958 * Dismisses split-screen multi-window mode. 3959 * @param toTop If true the current primary split-screen stack will be placed or left on top. 3960 */ 3961 @Override dismissSplitScreenMode(boolean toTop)3962 public void dismissSplitScreenMode(boolean toTop) { 3963 enforceCallerIsRecentsOrHasPermission( 3964 MANAGE_ACTIVITY_STACKS, "dismissSplitScreenMode()"); 3965 final long ident = Binder.clearCallingIdentity(); 3966 try { 3967 synchronized (mGlobalLock) { 3968 final ActivityStack stack = 3969 mRootActivityContainer.getDefaultDisplay().getSplitScreenPrimaryStack(); 3970 if (stack == null) { 3971 Slog.w(TAG, "dismissSplitScreenMode: primary split-screen stack not found."); 3972 return; 3973 } 3974 3975 if (toTop) { 3976 // Caller wants the current split-screen primary stack to be the top stack after 3977 // it goes fullscreen, so move it to the front. 3978 stack.moveToFront("dismissSplitScreenMode"); 3979 } else if (mRootActivityContainer.isTopDisplayFocusedStack(stack)) { 3980 // In this case the current split-screen primary stack shouldn't be the top 3981 // stack after it goes fullscreen, but it current has focus, so we move the 3982 // focus to the top-most split-screen secondary stack next to it. 3983 final ActivityStack otherStack = stack.getDisplay().getTopStackInWindowingMode( 3984 WINDOWING_MODE_SPLIT_SCREEN_SECONDARY); 3985 if (otherStack != null) { 3986 otherStack.moveToFront("dismissSplitScreenMode_other"); 3987 } 3988 } 3989 3990 stack.setWindowingMode(WINDOWING_MODE_UNDEFINED); 3991 } 3992 } finally { 3993 Binder.restoreCallingIdentity(ident); 3994 } 3995 } 3996 3997 /** 3998 * Dismisses Pip 3999 * @param animate True if the dismissal should be animated. 4000 * @param animationDuration The duration of the resize animation in milliseconds or -1 if the 4001 * default animation duration should be used. 4002 */ 4003 @Override dismissPip(boolean animate, int animationDuration)4004 public void dismissPip(boolean animate, int animationDuration) { 4005 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "dismissPip()"); 4006 final long ident = Binder.clearCallingIdentity(); 4007 try { 4008 synchronized (mGlobalLock) { 4009 final ActivityStack stack = 4010 mRootActivityContainer.getDefaultDisplay().getPinnedStack(); 4011 if (stack == null) { 4012 Slog.w(TAG, "dismissPip: pinned stack not found."); 4013 return; 4014 } 4015 if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) { 4016 throw new IllegalArgumentException("Stack: " + stack 4017 + " doesn't support animated resize."); 4018 } 4019 if (animate) { 4020 stack.animateResizePinnedStack(null /* sourceHintBounds */, 4021 null /* destBounds */, animationDuration, false /* fromFullscreen */); 4022 } else { 4023 mStackSupervisor.moveTasksToFullscreenStackLocked(stack, true /* onTop */); 4024 } 4025 } 4026 } finally { 4027 Binder.restoreCallingIdentity(ident); 4028 } 4029 } 4030 4031 @Override suppressResizeConfigChanges(boolean suppress)4032 public void suppressResizeConfigChanges(boolean suppress) throws RemoteException { 4033 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "suppressResizeConfigChanges()"); 4034 synchronized (mGlobalLock) { 4035 mSuppressResizeConfigChanges = suppress; 4036 } 4037 } 4038 4039 /** 4040 * NOTE: For the pinned stack, this method is usually called after the bounds animation has 4041 * animated the stack to the fullscreen, but can also be called if we are relaunching an 4042 * activity and clearing the task at the same time. 4043 */ 4044 @Override 4045 // TODO: API should just be about changing windowing modes... moveTasksToFullscreenStack(int fromStackId, boolean onTop)4046 public void moveTasksToFullscreenStack(int fromStackId, boolean onTop) { 4047 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, 4048 "moveTasksToFullscreenStack()"); 4049 synchronized (mGlobalLock) { 4050 final long origId = Binder.clearCallingIdentity(); 4051 try { 4052 final ActivityStack stack = mRootActivityContainer.getStack(fromStackId); 4053 if (stack != null){ 4054 if (!stack.isActivityTypeStandardOrUndefined()) { 4055 throw new IllegalArgumentException( 4056 "You can't move tasks from non-standard stacks."); 4057 } 4058 mStackSupervisor.moveTasksToFullscreenStackLocked(stack, onTop); 4059 } 4060 } finally { 4061 Binder.restoreCallingIdentity(origId); 4062 } 4063 } 4064 } 4065 4066 /** 4067 * Moves the top activity in the input stackId to the pinned stack. 4068 * 4069 * @param stackId Id of stack to move the top activity to pinned stack. 4070 * @param bounds Bounds to use for pinned stack. 4071 * 4072 * @return True if the top activity of the input stack was successfully moved to the pinned 4073 * stack. 4074 */ 4075 @Override moveTopActivityToPinnedStack(int stackId, Rect bounds)4076 public boolean moveTopActivityToPinnedStack(int stackId, Rect bounds) { 4077 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, 4078 "moveTopActivityToPinnedStack()"); 4079 synchronized (mGlobalLock) { 4080 if (!mSupportsPictureInPicture) { 4081 throw new IllegalStateException("moveTopActivityToPinnedStack:" 4082 + "Device doesn't support picture-in-picture mode"); 4083 } 4084 4085 long ident = Binder.clearCallingIdentity(); 4086 try { 4087 return mRootActivityContainer.moveTopStackActivityToPinnedStack(stackId); 4088 } finally { 4089 Binder.restoreCallingIdentity(ident); 4090 } 4091 } 4092 } 4093 4094 @Override isInMultiWindowMode(IBinder token)4095 public boolean isInMultiWindowMode(IBinder token) { 4096 final long origId = Binder.clearCallingIdentity(); 4097 try { 4098 synchronized (mGlobalLock) { 4099 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 4100 if (r == null) { 4101 return false; 4102 } 4103 // An activity is consider to be in multi-window mode if its task isn't fullscreen. 4104 return r.inMultiWindowMode(); 4105 } 4106 } finally { 4107 Binder.restoreCallingIdentity(origId); 4108 } 4109 } 4110 4111 @Override isInPictureInPictureMode(IBinder token)4112 public boolean isInPictureInPictureMode(IBinder token) { 4113 final long origId = Binder.clearCallingIdentity(); 4114 try { 4115 synchronized (mGlobalLock) { 4116 return isInPictureInPictureMode(ActivityRecord.forTokenLocked(token)); 4117 } 4118 } finally { 4119 Binder.restoreCallingIdentity(origId); 4120 } 4121 } 4122 isInPictureInPictureMode(ActivityRecord r)4123 private boolean isInPictureInPictureMode(ActivityRecord r) { 4124 if (r == null || r.getActivityStack() == null || !r.inPinnedWindowingMode() 4125 || r.getActivityStack().isInStackLocked(r) == null) { 4126 return false; 4127 } 4128 4129 // If we are animating to fullscreen then we have already dispatched the PIP mode 4130 // changed, so we should reflect that check here as well. 4131 final TaskStack taskStack = r.getActivityStack().getTaskStack(); 4132 return !taskStack.isAnimatingBoundsToFullscreen(); 4133 } 4134 4135 @Override enterPictureInPictureMode(IBinder token, final PictureInPictureParams params)4136 public boolean enterPictureInPictureMode(IBinder token, final PictureInPictureParams params) { 4137 final long origId = Binder.clearCallingIdentity(); 4138 try { 4139 synchronized (mGlobalLock) { 4140 final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked( 4141 "enterPictureInPictureMode", token, params); 4142 4143 // If the activity is already in picture in picture mode, then just return early 4144 if (isInPictureInPictureMode(r)) { 4145 return true; 4146 } 4147 4148 // Activity supports picture-in-picture, now check that we can enter PiP at this 4149 // point, if it is 4150 if (!r.checkEnterPictureInPictureState("enterPictureInPictureMode", 4151 false /* beforeStopping */)) { 4152 return false; 4153 } 4154 4155 final Runnable enterPipRunnable = () -> { 4156 synchronized (mGlobalLock) { 4157 // Only update the saved args from the args that are set 4158 r.pictureInPictureArgs.copyOnlySet(params); 4159 final float aspectRatio = r.pictureInPictureArgs.getAspectRatio(); 4160 final List<RemoteAction> actions = r.pictureInPictureArgs.getActions(); 4161 // Adjust the source bounds by the insets for the transition down 4162 final Rect sourceBounds = new Rect( 4163 r.pictureInPictureArgs.getSourceRectHint()); 4164 mRootActivityContainer.moveActivityToPinnedStack( 4165 r, sourceBounds, aspectRatio, "enterPictureInPictureMode"); 4166 final ActivityStack stack = r.getActivityStack(); 4167 stack.setPictureInPictureAspectRatio(aspectRatio); 4168 stack.setPictureInPictureActions(actions); 4169 MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.appInfo.uid, 4170 r.shortComponentName, r.supportsEnterPipOnTaskSwitch); 4171 logPictureInPictureArgs(params); 4172 } 4173 }; 4174 4175 if (isKeyguardLocked()) { 4176 // If the keyguard is showing or occluded, then try and dismiss it before 4177 // entering picture-in-picture (this will prompt the user to authenticate if the 4178 // device is currently locked). 4179 dismissKeyguard(token, new KeyguardDismissCallback() { 4180 @Override 4181 public void onDismissSucceeded() { 4182 mH.post(enterPipRunnable); 4183 } 4184 }, null /* message */); 4185 } else { 4186 // Enter picture in picture immediately otherwise 4187 enterPipRunnable.run(); 4188 } 4189 return true; 4190 } 4191 } finally { 4192 Binder.restoreCallingIdentity(origId); 4193 } 4194 } 4195 4196 @Override setPictureInPictureParams(IBinder token, final PictureInPictureParams params)4197 public void setPictureInPictureParams(IBinder token, final PictureInPictureParams params) { 4198 final long origId = Binder.clearCallingIdentity(); 4199 try { 4200 synchronized (mGlobalLock) { 4201 final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked( 4202 "setPictureInPictureParams", token, params); 4203 4204 // Only update the saved args from the args that are set 4205 r.pictureInPictureArgs.copyOnlySet(params); 4206 if (r.inPinnedWindowingMode()) { 4207 // If the activity is already in picture-in-picture, update the pinned stack now 4208 // if it is not already expanding to fullscreen. Otherwise, the arguments will 4209 // be used the next time the activity enters PiP 4210 final ActivityStack stack = r.getActivityStack(); 4211 if (!stack.isAnimatingBoundsToFullscreen()) { 4212 stack.setPictureInPictureAspectRatio( 4213 r.pictureInPictureArgs.getAspectRatio()); 4214 stack.setPictureInPictureActions(r.pictureInPictureArgs.getActions()); 4215 } 4216 } 4217 logPictureInPictureArgs(params); 4218 } 4219 } finally { 4220 Binder.restoreCallingIdentity(origId); 4221 } 4222 } 4223 4224 @Override getMaxNumPictureInPictureActions(IBinder token)4225 public int getMaxNumPictureInPictureActions(IBinder token) { 4226 // Currently, this is a static constant, but later, we may change this to be dependent on 4227 // the context of the activity 4228 return 3; 4229 } 4230 logPictureInPictureArgs(PictureInPictureParams params)4231 private void logPictureInPictureArgs(PictureInPictureParams params) { 4232 if (params.hasSetActions()) { 4233 MetricsLogger.histogram(mContext, "tron_varz_picture_in_picture_actions_count", 4234 params.getActions().size()); 4235 } 4236 if (params.hasSetAspectRatio()) { 4237 LogMaker lm = new LogMaker(MetricsEvent.ACTION_PICTURE_IN_PICTURE_ASPECT_RATIO_CHANGED); 4238 lm.addTaggedData(MetricsEvent.PICTURE_IN_PICTURE_ASPECT_RATIO, params.getAspectRatio()); 4239 MetricsLogger.action(lm); 4240 } 4241 } 4242 4243 /** 4244 * Checks the state of the system and the activity associated with the given {@param token} to 4245 * verify that picture-in-picture is supported for that activity. 4246 * 4247 * @return the activity record for the given {@param token} if all the checks pass. 4248 */ ensureValidPictureInPictureActivityParamsLocked(String caller, IBinder token, PictureInPictureParams params)4249 private ActivityRecord ensureValidPictureInPictureActivityParamsLocked(String caller, 4250 IBinder token, PictureInPictureParams params) { 4251 if (!mSupportsPictureInPicture) { 4252 throw new IllegalStateException(caller 4253 + ": Device doesn't support picture-in-picture mode."); 4254 } 4255 4256 final ActivityRecord r = ActivityRecord.forTokenLocked(token); 4257 if (r == null) { 4258 throw new IllegalStateException(caller 4259 + ": Can't find activity for token=" + token); 4260 } 4261 4262 if (!r.supportsPictureInPicture()) { 4263 throw new IllegalStateException(caller 4264 + ": Current activity does not support picture-in-picture."); 4265 } 4266 4267 if (params.hasSetAspectRatio() 4268 && !mWindowManager.isValidPictureInPictureAspectRatio( 4269 r.getActivityStack().mDisplayId, params.getAspectRatio())) { 4270 final float minAspectRatio = mContext.getResources().getFloat( 4271 com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio); 4272 final float maxAspectRatio = mContext.getResources().getFloat( 4273 com.android.internal.R.dimen.config_pictureInPictureMaxAspectRatio); 4274 throw new IllegalArgumentException(String.format(caller 4275 + ": Aspect ratio is too extreme (must be between %f and %f).", 4276 minAspectRatio, maxAspectRatio)); 4277 } 4278 4279 // Truncate the number of actions if necessary 4280 params.truncateActions(getMaxNumPictureInPictureActions(token)); 4281 4282 return r; 4283 } 4284 4285 @Override getUriPermissionOwnerForActivity(IBinder activityToken)4286 public IBinder getUriPermissionOwnerForActivity(IBinder activityToken) { 4287 enforceNotIsolatedCaller("getUriPermissionOwnerForActivity"); 4288 synchronized (mGlobalLock) { 4289 ActivityRecord r = ActivityRecord.isInStackLocked(activityToken); 4290 if (r == null) { 4291 throw new IllegalArgumentException("Activity does not exist; token=" 4292 + activityToken); 4293 } 4294 return r.getUriPermissionsLocked().getExternalToken(); 4295 } 4296 } 4297 4298 @Override resizeDockedStack(Rect dockedBounds, Rect tempDockedTaskBounds, Rect tempDockedTaskInsetBounds, Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds)4299 public void resizeDockedStack(Rect dockedBounds, Rect tempDockedTaskBounds, 4300 Rect tempDockedTaskInsetBounds, 4301 Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds) { 4302 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizeDockedStack()"); 4303 long ident = Binder.clearCallingIdentity(); 4304 try { 4305 synchronized (mGlobalLock) { 4306 mStackSupervisor.resizeDockedStackLocked(dockedBounds, tempDockedTaskBounds, 4307 tempDockedTaskInsetBounds, tempOtherTaskBounds, tempOtherTaskInsetBounds, 4308 PRESERVE_WINDOWS); 4309 } 4310 } finally { 4311 Binder.restoreCallingIdentity(ident); 4312 } 4313 } 4314 4315 @Override setSplitScreenResizing(boolean resizing)4316 public void setSplitScreenResizing(boolean resizing) { 4317 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setSplitScreenResizing()"); 4318 final long ident = Binder.clearCallingIdentity(); 4319 try { 4320 synchronized (mGlobalLock) { 4321 mStackSupervisor.setSplitScreenResizing(resizing); 4322 } 4323 } finally { 4324 Binder.restoreCallingIdentity(ident); 4325 } 4326 } 4327 4328 /** 4329 * Check that we have the features required for VR-related API calls, and throw an exception if 4330 * not. 4331 */ enforceSystemHasVrFeature()4332 public void enforceSystemHasVrFeature() { 4333 if (!mContext.getPackageManager().hasSystemFeature( 4334 PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE)) { 4335 throw new UnsupportedOperationException("VR mode not supported on this device!"); 4336 } 4337 } 4338 4339 @Override setVrMode(IBinder token, boolean enabled, ComponentName packageName)4340 public int setVrMode(IBinder token, boolean enabled, ComponentName packageName) { 4341 enforceSystemHasVrFeature(); 4342 4343 final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class); 4344 4345 ActivityRecord r; 4346 synchronized (mGlobalLock) { 4347 r = ActivityRecord.isInStackLocked(token); 4348 } 4349 4350 if (r == null) { 4351 throw new IllegalArgumentException(); 4352 } 4353 4354 int err; 4355 if ((err = vrService.hasVrPackage(packageName, r.mUserId)) != 4356 VrManagerInternal.NO_ERROR) { 4357 return err; 4358 } 4359 4360 // Clear the binder calling uid since this path may call moveToTask(). 4361 final long callingId = Binder.clearCallingIdentity(); 4362 try { 4363 synchronized (mGlobalLock) { 4364 r.requestedVrComponent = (enabled) ? packageName : null; 4365 4366 // Update associated state if this activity is currently focused 4367 if (r.isResumedActivityOnDisplay()) { 4368 applyUpdateVrModeLocked(r); 4369 } 4370 return 0; 4371 } 4372 } finally { 4373 Binder.restoreCallingIdentity(callingId); 4374 } 4375 } 4376 4377 @Override startLocalVoiceInteraction(IBinder callingActivity, Bundle options)4378 public void startLocalVoiceInteraction(IBinder callingActivity, Bundle options) { 4379 Slog.i(TAG, "Activity tried to startLocalVoiceInteraction"); 4380 synchronized (mGlobalLock) { 4381 ActivityRecord activity = getTopDisplayFocusedStack().getTopActivity(); 4382 if (ActivityRecord.forTokenLocked(callingActivity) != activity) { 4383 throw new SecurityException("Only focused activity can call startVoiceInteraction"); 4384 } 4385 if (mRunningVoice != null || activity.getTaskRecord().voiceSession != null 4386 || activity.voiceSession != null) { 4387 Slog.w(TAG, "Already in a voice interaction, cannot start new voice interaction"); 4388 return; 4389 } 4390 if (activity.pendingVoiceInteractionStart) { 4391 Slog.w(TAG, "Pending start of voice interaction already."); 4392 return; 4393 } 4394 activity.pendingVoiceInteractionStart = true; 4395 } 4396 LocalServices.getService(VoiceInteractionManagerInternal.class) 4397 .startLocalVoiceInteraction(callingActivity, options); 4398 } 4399 4400 @Override stopLocalVoiceInteraction(IBinder callingActivity)4401 public void stopLocalVoiceInteraction(IBinder callingActivity) { 4402 LocalServices.getService(VoiceInteractionManagerInternal.class) 4403 .stopLocalVoiceInteraction(callingActivity); 4404 } 4405 4406 @Override supportsLocalVoiceInteraction()4407 public boolean supportsLocalVoiceInteraction() { 4408 return LocalServices.getService(VoiceInteractionManagerInternal.class) 4409 .supportsLocalVoiceInteraction(); 4410 } 4411 4412 /** Notifies all listeners when the pinned stack animation starts. */ 4413 @Override notifyPinnedStackAnimationStarted()4414 public void notifyPinnedStackAnimationStarted() { 4415 mTaskChangeNotificationController.notifyPinnedStackAnimationStarted(); 4416 } 4417 4418 /** Notifies all listeners when the pinned stack animation ends. */ 4419 @Override notifyPinnedStackAnimationEnded()4420 public void notifyPinnedStackAnimationEnded() { 4421 mTaskChangeNotificationController.notifyPinnedStackAnimationEnded(); 4422 } 4423 4424 @Override resizePinnedStack(Rect pinnedBounds, Rect tempPinnedTaskBounds)4425 public void resizePinnedStack(Rect pinnedBounds, Rect tempPinnedTaskBounds) { 4426 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizePinnedStack()"); 4427 final long ident = Binder.clearCallingIdentity(); 4428 try { 4429 synchronized (mGlobalLock) { 4430 mStackSupervisor.resizePinnedStackLocked(pinnedBounds, tempPinnedTaskBounds); 4431 } 4432 } finally { 4433 Binder.restoreCallingIdentity(ident); 4434 } 4435 } 4436 4437 @Override updateDisplayOverrideConfiguration(Configuration values, int displayId)4438 public boolean updateDisplayOverrideConfiguration(Configuration values, int displayId) { 4439 mAmInternal.enforceCallingPermission(CHANGE_CONFIGURATION, "updateDisplayOverrideConfiguration()"); 4440 4441 synchronized (mGlobalLock) { 4442 // Check if display is initialized in AM. 4443 if (!mRootActivityContainer.isDisplayAdded(displayId)) { 4444 // Call might come when display is not yet added or has already been removed. 4445 if (DEBUG_CONFIGURATION) { 4446 Slog.w(TAG, "Trying to update display configuration for non-existing displayId=" 4447 + displayId); 4448 } 4449 return false; 4450 } 4451 4452 if (values == null && mWindowManager != null) { 4453 // sentinel: fetch the current configuration from the window manager 4454 values = mWindowManager.computeNewConfiguration(displayId); 4455 } 4456 4457 if (mWindowManager != null) { 4458 final Message msg = PooledLambda.obtainMessage( 4459 ActivityManagerInternal::updateOomLevelsForDisplay, mAmInternal, displayId); 4460 mH.sendMessage(msg); 4461 } 4462 4463 final long origId = Binder.clearCallingIdentity(); 4464 try { 4465 if (values != null) { 4466 Settings.System.clearConfiguration(values); 4467 } 4468 updateDisplayOverrideConfigurationLocked(values, null /* starting */, 4469 false /* deferResume */, displayId, mTmpUpdateConfigurationResult); 4470 return mTmpUpdateConfigurationResult.changes != 0; 4471 } finally { 4472 Binder.restoreCallingIdentity(origId); 4473 } 4474 } 4475 } 4476 4477 @Override updateConfiguration(Configuration values)4478 public boolean updateConfiguration(Configuration values) { 4479 mAmInternal.enforceCallingPermission(CHANGE_CONFIGURATION, "updateConfiguration()"); 4480 4481 synchronized (mGlobalLock) { 4482 if (values == null && mWindowManager != null) { 4483 // sentinel: fetch the current configuration from the window manager 4484 values = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY); 4485 } 4486 4487 if (mWindowManager != null) { 4488 final Message msg = PooledLambda.obtainMessage( 4489 ActivityManagerInternal::updateOomLevelsForDisplay, mAmInternal, 4490 DEFAULT_DISPLAY); 4491 mH.sendMessage(msg); 4492 } 4493 4494 final long origId = Binder.clearCallingIdentity(); 4495 try { 4496 if (values != null) { 4497 Settings.System.clearConfiguration(values); 4498 } 4499 updateConfigurationLocked(values, null, false, false /* persistent */, 4500 UserHandle.USER_NULL, false /* deferResume */, 4501 mTmpUpdateConfigurationResult); 4502 return mTmpUpdateConfigurationResult.changes != 0; 4503 } finally { 4504 Binder.restoreCallingIdentity(origId); 4505 } 4506 } 4507 } 4508 4509 @Override dismissKeyguard(IBinder token, IKeyguardDismissCallback callback, CharSequence message)4510 public void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback, 4511 CharSequence message) { 4512 if (message != null) { 4513 mAmInternal.enforceCallingPermission( 4514 Manifest.permission.SHOW_KEYGUARD_MESSAGE, "dismissKeyguard()"); 4515 } 4516 final long callingId = Binder.clearCallingIdentity(); 4517 try { 4518 synchronized (mGlobalLock) { 4519 mKeyguardController.dismissKeyguard(token, callback, message); 4520 } 4521 } finally { 4522 Binder.restoreCallingIdentity(callingId); 4523 } 4524 } 4525 4526 @Override cancelTaskWindowTransition(int taskId)4527 public void cancelTaskWindowTransition(int taskId) { 4528 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, 4529 "cancelTaskWindowTransition()"); 4530 final long ident = Binder.clearCallingIdentity(); 4531 try { 4532 synchronized (mGlobalLock) { 4533 final TaskRecord task = mRootActivityContainer.anyTaskForId(taskId, 4534 MATCH_TASK_IN_STACKS_ONLY); 4535 if (task == null) { 4536 Slog.w(TAG, "cancelTaskWindowTransition: taskId=" + taskId + " not found"); 4537 return; 4538 } 4539 task.cancelWindowTransition(); 4540 } 4541 } finally { 4542 Binder.restoreCallingIdentity(ident); 4543 } 4544 } 4545 4546 @Override getTaskSnapshot(int taskId, boolean reducedResolution)4547 public ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution) { 4548 enforceCallerIsRecentsOrHasPermission(READ_FRAME_BUFFER, "getTaskSnapshot()"); 4549 final long ident = Binder.clearCallingIdentity(); 4550 try { 4551 return getTaskSnapshot(taskId, reducedResolution, true /* restoreFromDisk */); 4552 } finally { 4553 Binder.restoreCallingIdentity(ident); 4554 } 4555 } 4556 getTaskSnapshot(int taskId, boolean reducedResolution, boolean restoreFromDisk)4557 private ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean reducedResolution, 4558 boolean restoreFromDisk) { 4559 final TaskRecord task; 4560 synchronized (mGlobalLock) { 4561 task = mRootActivityContainer.anyTaskForId(taskId, 4562 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS); 4563 if (task == null) { 4564 Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found"); 4565 return null; 4566 } 4567 } 4568 // Don't call this while holding the lock as this operation might hit the disk. 4569 return task.getSnapshot(reducedResolution, restoreFromDisk); 4570 } 4571 4572 @Override setDisablePreviewScreenshots(IBinder token, boolean disable)4573 public void setDisablePreviewScreenshots(IBinder token, boolean disable) { 4574 synchronized (mGlobalLock) { 4575 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 4576 if (r == null) { 4577 Slog.w(TAG, "setDisablePreviewScreenshots: Unable to find activity for token=" 4578 + token); 4579 return; 4580 } 4581 final long origId = Binder.clearCallingIdentity(); 4582 try { 4583 r.setDisablePreviewScreenshots(disable); 4584 } finally { 4585 Binder.restoreCallingIdentity(origId); 4586 } 4587 } 4588 } 4589 4590 /** Return the user id of the last resumed activity. */ 4591 @Override 4592 public @UserIdInt getLastResumedActivityUserId()4593 int getLastResumedActivityUserId() { 4594 mAmInternal.enforceCallingPermission( 4595 Manifest.permission.INTERACT_ACROSS_USERS_FULL, "getLastResumedActivityUserId()"); 4596 synchronized (mGlobalLock) { 4597 if (mLastResumedActivity == null) { 4598 return getCurrentUserId(); 4599 } 4600 return mLastResumedActivity.mUserId; 4601 } 4602 } 4603 4604 @Override updateLockTaskFeatures(int userId, int flags)4605 public void updateLockTaskFeatures(int userId, int flags) { 4606 final int callingUid = Binder.getCallingUid(); 4607 if (callingUid != 0 && callingUid != SYSTEM_UID) { 4608 mAmInternal.enforceCallingPermission(android.Manifest.permission.UPDATE_LOCK_TASK_PACKAGES, 4609 "updateLockTaskFeatures()"); 4610 } 4611 synchronized (mGlobalLock) { 4612 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "Allowing features " + userId + ":0x" + 4613 Integer.toHexString(flags)); 4614 getLockTaskController().updateLockTaskFeatures(userId, flags); 4615 } 4616 } 4617 4618 @Override setShowWhenLocked(IBinder token, boolean showWhenLocked)4619 public void setShowWhenLocked(IBinder token, boolean showWhenLocked) { 4620 synchronized (mGlobalLock) { 4621 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 4622 if (r == null) { 4623 return; 4624 } 4625 final long origId = Binder.clearCallingIdentity(); 4626 try { 4627 r.setShowWhenLocked(showWhenLocked); 4628 } finally { 4629 Binder.restoreCallingIdentity(origId); 4630 } 4631 } 4632 } 4633 4634 @Override setInheritShowWhenLocked(IBinder token, boolean inheritShowWhenLocked)4635 public void setInheritShowWhenLocked(IBinder token, boolean inheritShowWhenLocked) { 4636 synchronized (mGlobalLock) { 4637 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 4638 if (r == null) { 4639 return; 4640 } 4641 final long origId = Binder.clearCallingIdentity(); 4642 try { 4643 r.setInheritShowWhenLocked(inheritShowWhenLocked); 4644 } finally { 4645 Binder.restoreCallingIdentity(origId); 4646 } 4647 } 4648 } 4649 4650 @Override setTurnScreenOn(IBinder token, boolean turnScreenOn)4651 public void setTurnScreenOn(IBinder token, boolean turnScreenOn) { 4652 synchronized (mGlobalLock) { 4653 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 4654 if (r == null) { 4655 return; 4656 } 4657 final long origId = Binder.clearCallingIdentity(); 4658 try { 4659 r.setTurnScreenOn(turnScreenOn); 4660 } finally { 4661 Binder.restoreCallingIdentity(origId); 4662 } 4663 } 4664 } 4665 4666 @Override registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition)4667 public void registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition) { 4668 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS, 4669 "registerRemoteAnimations"); 4670 definition.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid()); 4671 synchronized (mGlobalLock) { 4672 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 4673 if (r == null) { 4674 return; 4675 } 4676 final long origId = Binder.clearCallingIdentity(); 4677 try { 4678 r.registerRemoteAnimations(definition); 4679 } finally { 4680 Binder.restoreCallingIdentity(origId); 4681 } 4682 } 4683 } 4684 4685 @Override registerRemoteAnimationForNextActivityStart(String packageName, RemoteAnimationAdapter adapter)4686 public void registerRemoteAnimationForNextActivityStart(String packageName, 4687 RemoteAnimationAdapter adapter) { 4688 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS, 4689 "registerRemoteAnimationForNextActivityStart"); 4690 adapter.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid()); 4691 synchronized (mGlobalLock) { 4692 final long origId = Binder.clearCallingIdentity(); 4693 try { 4694 getActivityStartController().registerRemoteAnimationForNextActivityStart( 4695 packageName, adapter); 4696 } finally { 4697 Binder.restoreCallingIdentity(origId); 4698 } 4699 } 4700 } 4701 4702 @Override registerRemoteAnimationsForDisplay(int displayId, RemoteAnimationDefinition definition)4703 public void registerRemoteAnimationsForDisplay(int displayId, 4704 RemoteAnimationDefinition definition) { 4705 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS, 4706 "registerRemoteAnimations"); 4707 definition.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid()); 4708 synchronized (mGlobalLock) { 4709 final ActivityDisplay display = mRootActivityContainer.getActivityDisplay(displayId); 4710 if (display == null) { 4711 Slog.e(TAG, "Couldn't find display with id: " + displayId); 4712 return; 4713 } 4714 final long origId = Binder.clearCallingIdentity(); 4715 try { 4716 display.mDisplayContent.registerRemoteAnimations(definition); 4717 } finally { 4718 Binder.restoreCallingIdentity(origId); 4719 } 4720 } 4721 } 4722 4723 /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */ 4724 @Override alwaysShowUnsupportedCompileSdkWarning(ComponentName activity)4725 public void alwaysShowUnsupportedCompileSdkWarning(ComponentName activity) { 4726 synchronized (mGlobalLock) { 4727 final long origId = Binder.clearCallingIdentity(); 4728 try { 4729 mAppWarnings.alwaysShowUnsupportedCompileSdkWarning(activity); 4730 } finally { 4731 Binder.restoreCallingIdentity(origId); 4732 } 4733 } 4734 } 4735 4736 @Override setVrThread(int tid)4737 public void setVrThread(int tid) { 4738 enforceSystemHasVrFeature(); 4739 synchronized (mGlobalLock) { 4740 final int pid = Binder.getCallingPid(); 4741 final WindowProcessController wpc = mProcessMap.getProcess(pid); 4742 mVrController.setVrThreadLocked(tid, pid, wpc); 4743 } 4744 } 4745 4746 @Override setPersistentVrThread(int tid)4747 public void setPersistentVrThread(int tid) { 4748 if (checkCallingPermission(Manifest.permission.RESTRICTED_VR_ACCESS) 4749 != PERMISSION_GRANTED) { 4750 final String msg = "Permission Denial: setPersistentVrThread() from pid=" 4751 + Binder.getCallingPid() 4752 + ", uid=" + Binder.getCallingUid() 4753 + " requires " + Manifest.permission.RESTRICTED_VR_ACCESS; 4754 Slog.w(TAG, msg); 4755 throw new SecurityException(msg); 4756 } 4757 enforceSystemHasVrFeature(); 4758 synchronized (mGlobalLock) { 4759 final int pid = Binder.getCallingPid(); 4760 final WindowProcessController proc = mProcessMap.getProcess(pid); 4761 mVrController.setPersistentVrThreadLocked(tid, pid, proc); 4762 } 4763 } 4764 4765 @Override stopAppSwitches()4766 public void stopAppSwitches() { 4767 enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "stopAppSwitches"); 4768 synchronized (mGlobalLock) { 4769 mAppSwitchesAllowedTime = SystemClock.uptimeMillis() + APP_SWITCH_DELAY_TIME; 4770 mLastStopAppSwitchesTime = SystemClock.uptimeMillis(); 4771 mDidAppSwitch = false; 4772 getActivityStartController().schedulePendingActivityLaunches(APP_SWITCH_DELAY_TIME); 4773 } 4774 } 4775 4776 @Override resumeAppSwitches()4777 public void resumeAppSwitches() { 4778 enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "resumeAppSwitches"); 4779 synchronized (mGlobalLock) { 4780 // Note that we don't execute any pending app switches... we will 4781 // let those wait until either the timeout, or the next start 4782 // activity request. 4783 mAppSwitchesAllowedTime = 0; 4784 } 4785 } 4786 getLastStopAppSwitchesTime()4787 long getLastStopAppSwitchesTime() { 4788 return mLastStopAppSwitchesTime; 4789 } 4790 onStartActivitySetDidAppSwitch()4791 void onStartActivitySetDidAppSwitch() { 4792 if (mDidAppSwitch) { 4793 // This is the second allowed switch since we stopped switches, so now just generally 4794 // allow switches. Use case: 4795 // - user presses home (switches disabled, switch to home, mDidAppSwitch now true); 4796 // - user taps a home icon (coming from home so allowed, we hit here and now allow 4797 // anyone to switch again). 4798 mAppSwitchesAllowedTime = 0; 4799 } else { 4800 mDidAppSwitch = true; 4801 } 4802 } 4803 4804 /** @return whether the system should disable UI modes incompatible with VR mode. */ shouldDisableNonVrUiLocked()4805 boolean shouldDisableNonVrUiLocked() { 4806 return mVrController.shouldDisableNonVrUiLocked(); 4807 } 4808 applyUpdateVrModeLocked(ActivityRecord r)4809 private void applyUpdateVrModeLocked(ActivityRecord r) { 4810 // VR apps are expected to run in a main display. If an app is turning on VR for 4811 // itself, but isn't on the main display, then move it there before enabling VR Mode. 4812 if (r.requestedVrComponent != null && r.getDisplayId() != DEFAULT_DISPLAY) { 4813 Slog.i(TAG, "Moving " + r.shortComponentName + " from display " + r.getDisplayId() 4814 + " to main display for VR"); 4815 mRootActivityContainer.moveStackToDisplay( 4816 r.getStackId(), DEFAULT_DISPLAY, true /* toTop */); 4817 } 4818 mH.post(() -> { 4819 if (!mVrController.onVrModeChanged(r)) { 4820 return; 4821 } 4822 synchronized (mGlobalLock) { 4823 final boolean disableNonVrUi = mVrController.shouldDisableNonVrUiLocked(); 4824 mWindowManager.disableNonVrUi(disableNonVrUi); 4825 if (disableNonVrUi) { 4826 // If we are in a VR mode where Picture-in-Picture mode is unsupported, 4827 // then remove the pinned stack. 4828 mRootActivityContainer.removeStacksInWindowingModes(WINDOWING_MODE_PINNED); 4829 } 4830 } 4831 }); 4832 } 4833 4834 @Override getPackageScreenCompatMode(String packageName)4835 public int getPackageScreenCompatMode(String packageName) { 4836 enforceNotIsolatedCaller("getPackageScreenCompatMode"); 4837 synchronized (mGlobalLock) { 4838 return mCompatModePackages.getPackageScreenCompatModeLocked(packageName); 4839 } 4840 } 4841 4842 @Override setPackageScreenCompatMode(String packageName, int mode)4843 public void setPackageScreenCompatMode(String packageName, int mode) { 4844 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY, 4845 "setPackageScreenCompatMode"); 4846 synchronized (mGlobalLock) { 4847 mCompatModePackages.setPackageScreenCompatModeLocked(packageName, mode); 4848 } 4849 } 4850 4851 @Override getPackageAskScreenCompat(String packageName)4852 public boolean getPackageAskScreenCompat(String packageName) { 4853 enforceNotIsolatedCaller("getPackageAskScreenCompat"); 4854 synchronized (mGlobalLock) { 4855 return mCompatModePackages.getPackageAskCompatModeLocked(packageName); 4856 } 4857 } 4858 4859 @Override setPackageAskScreenCompat(String packageName, boolean ask)4860 public void setPackageAskScreenCompat(String packageName, boolean ask) { 4861 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY, 4862 "setPackageAskScreenCompat"); 4863 synchronized (mGlobalLock) { 4864 mCompatModePackages.setPackageAskCompatModeLocked(packageName, ask); 4865 } 4866 } 4867 relaunchReasonToString(int relaunchReason)4868 public static String relaunchReasonToString(int relaunchReason) { 4869 switch (relaunchReason) { 4870 case RELAUNCH_REASON_WINDOWING_MODE_RESIZE: 4871 return "window_resize"; 4872 case RELAUNCH_REASON_FREE_RESIZE: 4873 return "free_resize"; 4874 default: 4875 return null; 4876 } 4877 } 4878 getTopDisplayFocusedStack()4879 ActivityStack getTopDisplayFocusedStack() { 4880 return mRootActivityContainer.getTopDisplayFocusedStack(); 4881 } 4882 4883 /** Pokes the task persister. */ notifyTaskPersisterLocked(TaskRecord task, boolean flush)4884 void notifyTaskPersisterLocked(TaskRecord task, boolean flush) { 4885 mRecentTasks.notifyTaskPersisterLocked(task, flush); 4886 } 4887 isKeyguardLocked()4888 boolean isKeyguardLocked() { 4889 return mKeyguardController.isKeyguardLocked(); 4890 } 4891 4892 /** 4893 * Clears launch params for the given package. 4894 * @param packageNames the names of the packages of which the launch params are to be cleared 4895 */ 4896 @Override clearLaunchParamsForPackages(List<String> packageNames)4897 public void clearLaunchParamsForPackages(List<String> packageNames) { 4898 mAmInternal.enforceCallingPermission(Manifest.permission.MANAGE_ACTIVITY_STACKS, 4899 "clearLaunchParamsForPackages"); 4900 synchronized (mGlobalLock) { 4901 for (int i = 0; i < packageNames.size(); ++i) { 4902 mStackSupervisor.mLaunchParamsPersister.removeRecordForPackage(packageNames.get(i)); 4903 } 4904 } 4905 } 4906 4907 /** 4908 * Makes the display with the given id a single task instance display. I.e the display can only 4909 * contain one task. 4910 */ 4911 @Override setDisplayToSingleTaskInstance(int displayId)4912 public void setDisplayToSingleTaskInstance(int displayId) { 4913 mAmInternal.enforceCallingPermission(Manifest.permission.MANAGE_ACTIVITY_STACKS, 4914 "setDisplayToSingleTaskInstance"); 4915 final long origId = Binder.clearCallingIdentity(); 4916 try { 4917 final ActivityDisplay display = 4918 mRootActivityContainer.getActivityDisplayOrCreate(displayId); 4919 if (display != null) { 4920 display.setDisplayToSingleTaskInstance(); 4921 } 4922 } finally { 4923 Binder.restoreCallingIdentity(origId); 4924 } 4925 } 4926 dumpLastANRLocked(PrintWriter pw)4927 void dumpLastANRLocked(PrintWriter pw) { 4928 pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)"); 4929 if (mLastANRState == null) { 4930 pw.println(" <no ANR has occurred since boot>"); 4931 } else { 4932 pw.println(mLastANRState); 4933 } 4934 } 4935 dumpLastANRTracesLocked(PrintWriter pw)4936 void dumpLastANRTracesLocked(PrintWriter pw) { 4937 pw.println("ACTIVITY MANAGER LAST ANR TRACES (dumpsys activity lastanr-traces)"); 4938 4939 final File[] files = new File(ANR_TRACE_DIR).listFiles(); 4940 if (ArrayUtils.isEmpty(files)) { 4941 pw.println(" <no ANR has occurred since boot>"); 4942 return; 4943 } 4944 // Find the latest file. 4945 File latest = null; 4946 for (File f : files) { 4947 if ((latest == null) || (latest.lastModified() < f.lastModified())) { 4948 latest = f; 4949 } 4950 } 4951 pw.print("File: "); 4952 pw.print(latest.getName()); 4953 pw.println(); 4954 try (BufferedReader in = new BufferedReader(new FileReader(latest))) { 4955 String line; 4956 while ((line = in.readLine()) != null) { 4957 pw.println(line); 4958 } 4959 } catch (IOException e) { 4960 pw.print("Unable to read: "); 4961 pw.print(e); 4962 pw.println(); 4963 } 4964 } 4965 dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args, int opti, boolean dumpAll, boolean dumpClient, String dumpPackage)4966 void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args, 4967 int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) { 4968 dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage, 4969 "ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)"); 4970 } 4971 dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args, int opti, boolean dumpAll, boolean dumpClient, String dumpPackage, String header)4972 void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args, 4973 int opti, boolean dumpAll, boolean dumpClient, String dumpPackage, String header) { 4974 pw.println(header); 4975 4976 boolean printedAnything = mRootActivityContainer.dumpActivities(fd, pw, dumpAll, dumpClient, 4977 dumpPackage); 4978 boolean needSep = printedAnything; 4979 4980 boolean printed = ActivityStackSupervisor.printThisActivity(pw, 4981 mRootActivityContainer.getTopResumedActivity(), dumpPackage, needSep, 4982 " ResumedActivity: "); 4983 if (printed) { 4984 printedAnything = true; 4985 needSep = false; 4986 } 4987 4988 if (dumpPackage == null) { 4989 if (needSep) { 4990 pw.println(); 4991 } 4992 printedAnything = true; 4993 mStackSupervisor.dump(pw, " "); 4994 } 4995 4996 if (!printedAnything) { 4997 pw.println(" (nothing)"); 4998 } 4999 } 5000 dumpActivityContainersLocked(PrintWriter pw)5001 void dumpActivityContainersLocked(PrintWriter pw) { 5002 pw.println("ACTIVITY MANAGER STARTER (dumpsys activity containers)"); 5003 mRootActivityContainer.dumpChildrenNames(pw, " "); 5004 pw.println(" "); 5005 } 5006 dumpActivityStarterLocked(PrintWriter pw, String dumpPackage)5007 void dumpActivityStarterLocked(PrintWriter pw, String dumpPackage) { 5008 pw.println("ACTIVITY MANAGER STARTER (dumpsys activity starter)"); 5009 getActivityStartController().dump(pw, "", dumpPackage); 5010 } 5011 5012 /** 5013 * There are three things that cmd can be: 5014 * - a flattened component name that matches an existing activity 5015 * - the cmd arg isn't the flattened component name of an existing activity: 5016 * dump all activity whose component contains the cmd as a substring 5017 * - A hex number of the ActivityRecord object instance. 5018 * <p> 5019 * The caller should not hold lock when calling this method because it will wait for the 5020 * activities to complete the dump. 5021 * 5022 * @param dumpVisibleStacksOnly dump activity with {@param name} only if in a visible stack 5023 * @param dumpFocusedStackOnly dump activity with {@param name} only if in the focused stack 5024 */ dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, boolean dumpFocusedStackOnly)5025 protected boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args, 5026 int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, boolean dumpFocusedStackOnly) { 5027 ArrayList<ActivityRecord> activities; 5028 5029 synchronized (mGlobalLock) { 5030 activities = mRootActivityContainer.getDumpActivities(name, dumpVisibleStacksOnly, 5031 dumpFocusedStackOnly); 5032 } 5033 5034 if (activities.size() <= 0) { 5035 return false; 5036 } 5037 5038 String[] newArgs = new String[args.length - opti]; 5039 System.arraycopy(args, opti, newArgs, 0, args.length - opti); 5040 5041 TaskRecord lastTask = null; 5042 boolean needSep = false; 5043 for (int i = activities.size() - 1; i >= 0; i--) { 5044 ActivityRecord r = activities.get(i); 5045 if (needSep) { 5046 pw.println(); 5047 } 5048 needSep = true; 5049 synchronized (mGlobalLock) { 5050 final TaskRecord task = r.getTaskRecord(); 5051 if (lastTask != task) { 5052 lastTask = task; 5053 pw.print("TASK "); pw.print(lastTask.affinity); 5054 pw.print(" id="); pw.print(lastTask.taskId); 5055 pw.print(" userId="); pw.println(lastTask.userId); 5056 if (dumpAll) { 5057 lastTask.dump(pw, " "); 5058 } 5059 } 5060 } 5061 dumpActivity(" ", fd, pw, activities.get(i), newArgs, dumpAll); 5062 } 5063 return true; 5064 } 5065 5066 /** 5067 * Invokes IApplicationThread.dumpActivity() on the thread of the specified activity if 5068 * there is a thread associated with the activity. 5069 */ dumpActivity(String prefix, FileDescriptor fd, PrintWriter pw, final ActivityRecord r, String[] args, boolean dumpAll)5070 private void dumpActivity(String prefix, FileDescriptor fd, PrintWriter pw, 5071 final ActivityRecord r, String[] args, boolean dumpAll) { 5072 String innerPrefix = prefix + " "; 5073 IApplicationThread appThread = null; 5074 synchronized (mGlobalLock) { 5075 pw.print(prefix); pw.print("ACTIVITY "); pw.print(r.shortComponentName); 5076 pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(r))); 5077 pw.print(" pid="); 5078 if (r.hasProcess()) { 5079 pw.println(r.app.getPid()); 5080 appThread = r.app.getThread(); 5081 } else { 5082 pw.println("(not running)"); 5083 } 5084 if (dumpAll) { 5085 r.dump(pw, innerPrefix); 5086 } 5087 } 5088 if (appThread != null) { 5089 // flush anything that is already in the PrintWriter since the thread is going 5090 // to write to the file descriptor directly 5091 pw.flush(); 5092 try (TransferPipe tp = new TransferPipe()) { 5093 appThread.dumpActivity(tp.getWriteFd(), r.appToken, innerPrefix, args); 5094 tp.go(fd); 5095 } catch (IOException e) { 5096 pw.println(innerPrefix + "Failure while dumping the activity: " + e); 5097 } catch (RemoteException e) { 5098 pw.println(innerPrefix + "Got a RemoteException while dumping the activity"); 5099 } 5100 } 5101 } 5102 writeSleepStateToProto(ProtoOutputStream proto, int wakeFullness, boolean testPssMode)5103 private void writeSleepStateToProto(ProtoOutputStream proto, int wakeFullness, 5104 boolean testPssMode) { 5105 final long sleepToken = proto.start(ActivityManagerServiceDumpProcessesProto.SLEEP_STATUS); 5106 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.WAKEFULNESS, 5107 PowerManagerInternal.wakefulnessToProtoEnum(wakeFullness)); 5108 for (ActivityTaskManagerInternal.SleepToken st : mRootActivityContainer.mSleepTokens) { 5109 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEP_TOKENS, 5110 st.toString()); 5111 } 5112 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEPING, mSleeping); 5113 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SHUTTING_DOWN, 5114 mShuttingDown); 5115 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.TEST_PSS_MODE, 5116 testPssMode); 5117 proto.end(sleepToken); 5118 } 5119 getCurrentUserId()5120 int getCurrentUserId() { 5121 return mAmInternal.getCurrentUserId(); 5122 } 5123 enforceNotIsolatedCaller(String caller)5124 private void enforceNotIsolatedCaller(String caller) { 5125 if (UserHandle.isIsolated(Binder.getCallingUid())) { 5126 throw new SecurityException("Isolated process not allowed to call " + caller); 5127 } 5128 } 5129 getConfiguration()5130 public Configuration getConfiguration() { 5131 Configuration ci; 5132 synchronized(mGlobalLock) { 5133 ci = new Configuration(getGlobalConfigurationForCallingPid()); 5134 ci.userSetLocale = false; 5135 } 5136 return ci; 5137 } 5138 5139 /** 5140 * Current global configuration information. Contains general settings for the entire system, 5141 * also corresponds to the merged configuration of the default display. 5142 */ getGlobalConfiguration()5143 Configuration getGlobalConfiguration() { 5144 return mRootActivityContainer.getConfiguration(); 5145 } 5146 updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale)5147 boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, 5148 boolean initLocale) { 5149 return updateConfigurationLocked(values, starting, initLocale, false /* deferResume */); 5150 } 5151 updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale, boolean deferResume)5152 boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, 5153 boolean initLocale, boolean deferResume) { 5154 // pass UserHandle.USER_NULL as userId because we don't persist configuration for any user 5155 return updateConfigurationLocked(values, starting, initLocale, false /* persistent */, 5156 UserHandle.USER_NULL, deferResume); 5157 } 5158 updatePersistentConfiguration(Configuration values, @UserIdInt int userId)5159 public void updatePersistentConfiguration(Configuration values, @UserIdInt int userId) { 5160 final long origId = Binder.clearCallingIdentity(); 5161 try { 5162 synchronized (mGlobalLock) { 5163 updateConfigurationLocked(values, null, false, true, userId, 5164 false /* deferResume */); 5165 } 5166 } finally { 5167 Binder.restoreCallingIdentity(origId); 5168 } 5169 } 5170 updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale, boolean persistent, int userId, boolean deferResume)5171 private boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, 5172 boolean initLocale, boolean persistent, int userId, boolean deferResume) { 5173 return updateConfigurationLocked(values, starting, initLocale, persistent, userId, 5174 deferResume, null /* result */); 5175 } 5176 5177 /** 5178 * Do either or both things: (1) change the current configuration, and (2) 5179 * make sure the given activity is running with the (now) current 5180 * configuration. Returns true if the activity has been left running, or 5181 * false if <var>starting</var> is being destroyed to match the new 5182 * configuration. 5183 * 5184 * @param userId is only used when persistent parameter is set to true to persist configuration 5185 * for that particular user 5186 */ updateConfigurationLocked(Configuration values, ActivityRecord starting, boolean initLocale, boolean persistent, int userId, boolean deferResume, ActivityTaskManagerService.UpdateConfigurationResult result)5187 boolean updateConfigurationLocked(Configuration values, ActivityRecord starting, 5188 boolean initLocale, boolean persistent, int userId, boolean deferResume, 5189 ActivityTaskManagerService.UpdateConfigurationResult result) { 5190 int changes = 0; 5191 boolean kept = true; 5192 5193 if (mWindowManager != null) { 5194 mWindowManager.deferSurfaceLayout(); 5195 } 5196 try { 5197 if (values != null) { 5198 changes = updateGlobalConfigurationLocked(values, initLocale, persistent, userId, 5199 deferResume); 5200 } 5201 5202 kept = ensureConfigAndVisibilityAfterUpdate(starting, changes); 5203 } finally { 5204 if (mWindowManager != null) { 5205 mWindowManager.continueSurfaceLayout(); 5206 } 5207 } 5208 5209 if (result != null) { 5210 result.changes = changes; 5211 result.activityRelaunched = !kept; 5212 } 5213 return kept; 5214 } 5215 5216 /** Update default (global) configuration and notify listeners about changes. */ updateGlobalConfigurationLocked(@onNull Configuration values, boolean initLocale, boolean persistent, int userId, boolean deferResume)5217 private int updateGlobalConfigurationLocked(@NonNull Configuration values, boolean initLocale, 5218 boolean persistent, int userId, boolean deferResume) { 5219 mTempConfig.setTo(getGlobalConfiguration()); 5220 final int changes = mTempConfig.updateFrom(values); 5221 if (changes == 0) { 5222 // Since calling to Activity.setRequestedOrientation leads to freezing the window with 5223 // setting WindowManagerService.mWaitingForConfig to true, it is important that we call 5224 // performDisplayOverrideConfigUpdate in order to send the new display configuration 5225 // (even if there are no actual changes) to unfreeze the window. 5226 performDisplayOverrideConfigUpdate(values, deferResume, DEFAULT_DISPLAY); 5227 return 0; 5228 } 5229 5230 if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.i(TAG_CONFIGURATION, 5231 "Updating global configuration to: " + values); 5232 5233 EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes); 5234 StatsLog.write(StatsLog.RESOURCE_CONFIGURATION_CHANGED, 5235 values.colorMode, 5236 values.densityDpi, 5237 values.fontScale, 5238 values.hardKeyboardHidden, 5239 values.keyboard, 5240 values.keyboardHidden, 5241 values.mcc, 5242 values.mnc, 5243 values.navigation, 5244 values.navigationHidden, 5245 values.orientation, 5246 values.screenHeightDp, 5247 values.screenLayout, 5248 values.screenWidthDp, 5249 values.smallestScreenWidthDp, 5250 values.touchscreen, 5251 values.uiMode); 5252 5253 5254 if (!initLocale && !values.getLocales().isEmpty() && values.userSetLocale) { 5255 final LocaleList locales = values.getLocales(); 5256 int bestLocaleIndex = 0; 5257 if (locales.size() > 1) { 5258 if (mSupportedSystemLocales == null) { 5259 mSupportedSystemLocales = Resources.getSystem().getAssets().getLocales(); 5260 } 5261 bestLocaleIndex = Math.max(0, locales.getFirstMatchIndex(mSupportedSystemLocales)); 5262 } 5263 SystemProperties.set("persist.sys.locale", 5264 locales.get(bestLocaleIndex).toLanguageTag()); 5265 LocaleList.setDefault(locales, bestLocaleIndex); 5266 5267 final Message m = PooledLambda.obtainMessage( 5268 ActivityTaskManagerService::sendLocaleToMountDaemonMsg, this, 5269 locales.get(bestLocaleIndex)); 5270 mH.sendMessage(m); 5271 } 5272 5273 mTempConfig.seq = increaseConfigurationSeqLocked(); 5274 5275 // Update stored global config and notify everyone about the change. 5276 mRootActivityContainer.onConfigurationChanged(mTempConfig); 5277 5278 Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + mTempConfig); 5279 // TODO(multi-display): Update UsageEvents#Event to include displayId. 5280 mUsageStatsInternal.reportConfigurationChange(mTempConfig, mAmInternal.getCurrentUserId()); 5281 5282 // TODO: If our config changes, should we auto dismiss any currently showing dialogs? 5283 updateShouldShowDialogsLocked(mTempConfig); 5284 5285 AttributeCache ac = AttributeCache.instance(); 5286 if (ac != null) { 5287 ac.updateConfiguration(mTempConfig); 5288 } 5289 5290 // Make sure all resources in our process are updated right now, so that anyone who is going 5291 // to retrieve resource values after we return will be sure to get the new ones. This is 5292 // especially important during boot, where the first config change needs to guarantee all 5293 // resources have that config before following boot code is executed. 5294 mSystemThread.applyConfigurationToResources(mTempConfig); 5295 5296 // We need another copy of global config because we're scheduling some calls instead of 5297 // running them in place. We need to be sure that object we send will be handled unchanged. 5298 final Configuration configCopy = new Configuration(mTempConfig); 5299 if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) { 5300 final Message msg = PooledLambda.obtainMessage( 5301 ActivityTaskManagerService::sendPutConfigurationForUserMsg, 5302 this, userId, configCopy); 5303 mH.sendMessage(msg); 5304 } 5305 5306 SparseArray<WindowProcessController> pidMap = mProcessMap.getPidMap(); 5307 for (int i = pidMap.size() - 1; i >= 0; i--) { 5308 final int pid = pidMap.keyAt(i); 5309 final WindowProcessController app = pidMap.get(pid); 5310 if (DEBUG_CONFIGURATION) { 5311 Slog.v(TAG_CONFIGURATION, "Update process config of " 5312 + app.mName + " to new config " + configCopy); 5313 } 5314 app.onConfigurationChanged(configCopy); 5315 } 5316 5317 final Message msg = PooledLambda.obtainMessage( 5318 ActivityManagerInternal::broadcastGlobalConfigurationChanged, 5319 mAmInternal, changes, initLocale); 5320 mH.sendMessage(msg); 5321 5322 // Override configuration of the default display duplicates global config, so we need to 5323 // update it also. This will also notify WindowManager about changes. 5324 performDisplayOverrideConfigUpdate(mRootActivityContainer.getConfiguration(), deferResume, 5325 DEFAULT_DISPLAY); 5326 5327 return changes; 5328 } 5329 updateDisplayOverrideConfigurationLocked(Configuration values, ActivityRecord starting, boolean deferResume, int displayId)5330 boolean updateDisplayOverrideConfigurationLocked(Configuration values, ActivityRecord starting, 5331 boolean deferResume, int displayId) { 5332 return updateDisplayOverrideConfigurationLocked(values, starting, deferResume /* deferResume */, 5333 displayId, null /* result */); 5334 } 5335 5336 /** 5337 * Updates override configuration specific for the selected display. If no config is provided, 5338 * new one will be computed in WM based on current display info. 5339 */ updateDisplayOverrideConfigurationLocked(Configuration values, ActivityRecord starting, boolean deferResume, int displayId, ActivityTaskManagerService.UpdateConfigurationResult result)5340 boolean updateDisplayOverrideConfigurationLocked(Configuration values, 5341 ActivityRecord starting, boolean deferResume, int displayId, 5342 ActivityTaskManagerService.UpdateConfigurationResult result) { 5343 int changes = 0; 5344 boolean kept = true; 5345 5346 if (mWindowManager != null) { 5347 mWindowManager.deferSurfaceLayout(); 5348 } 5349 try { 5350 if (values != null) { 5351 if (displayId == DEFAULT_DISPLAY) { 5352 // Override configuration of the default display duplicates global config, so 5353 // we're calling global config update instead for default display. It will also 5354 // apply the correct override config. 5355 changes = updateGlobalConfigurationLocked(values, false /* initLocale */, 5356 false /* persistent */, UserHandle.USER_NULL /* userId */, deferResume); 5357 } else { 5358 changes = performDisplayOverrideConfigUpdate(values, deferResume, displayId); 5359 } 5360 } 5361 5362 kept = ensureConfigAndVisibilityAfterUpdate(starting, changes); 5363 } finally { 5364 if (mWindowManager != null) { 5365 mWindowManager.continueSurfaceLayout(); 5366 } 5367 } 5368 5369 if (result != null) { 5370 result.changes = changes; 5371 result.activityRelaunched = !kept; 5372 } 5373 return kept; 5374 } 5375 performDisplayOverrideConfigUpdate(Configuration values, boolean deferResume, int displayId)5376 private int performDisplayOverrideConfigUpdate(Configuration values, boolean deferResume, 5377 int displayId) { 5378 mTempConfig.setTo(mRootActivityContainer.getDisplayOverrideConfiguration(displayId)); 5379 final int changes = mTempConfig.updateFrom(values); 5380 if (changes != 0) { 5381 Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " " 5382 + mTempConfig + " for displayId=" + displayId); 5383 mRootActivityContainer.setDisplayOverrideConfiguration(mTempConfig, displayId); 5384 5385 final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0; 5386 if (isDensityChange && displayId == DEFAULT_DISPLAY) { 5387 mAppWarnings.onDensityChanged(); 5388 5389 // Post message to start process to avoid possible deadlock of calling into AMS with 5390 // the ATMS lock held. 5391 final Message msg = PooledLambda.obtainMessage( 5392 ActivityManagerInternal::killAllBackgroundProcessesExcept, mAmInternal, 5393 N, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); 5394 mH.sendMessage(msg); 5395 } 5396 } 5397 return changes; 5398 } 5399 updateEventDispatchingLocked(boolean booted)5400 private void updateEventDispatchingLocked(boolean booted) { 5401 mWindowManager.setEventDispatching(booted && !mShuttingDown); 5402 } 5403 sendPutConfigurationForUserMsg(int userId, Configuration config)5404 private void sendPutConfigurationForUserMsg(int userId, Configuration config) { 5405 final ContentResolver resolver = mContext.getContentResolver(); 5406 Settings.System.putConfigurationForUser(resolver, config, userId); 5407 } 5408 sendLocaleToMountDaemonMsg(Locale l)5409 private void sendLocaleToMountDaemonMsg(Locale l) { 5410 try { 5411 IBinder service = ServiceManager.getService("mount"); 5412 IStorageManager storageManager = IStorageManager.Stub.asInterface(service); 5413 Log.d(TAG, "Storing locale " + l.toLanguageTag() + " for decryption UI"); 5414 storageManager.setField(StorageManager.SYSTEM_LOCALE_KEY, l.toLanguageTag()); 5415 } catch (RemoteException e) { 5416 Log.e(TAG, "Error storing locale for decryption UI", e); 5417 } 5418 } 5419 expireStartAsCallerTokenMsg(IBinder permissionToken)5420 private void expireStartAsCallerTokenMsg(IBinder permissionToken) { 5421 mStartActivitySources.remove(permissionToken); 5422 mExpiredStartAsCallerTokens.add(permissionToken); 5423 } 5424 forgetStartAsCallerTokenMsg(IBinder permissionToken)5425 private void forgetStartAsCallerTokenMsg(IBinder permissionToken) { 5426 mExpiredStartAsCallerTokens.remove(permissionToken); 5427 } 5428 isActivityStartsLoggingEnabled()5429 boolean isActivityStartsLoggingEnabled() { 5430 return mAmInternal.isActivityStartsLoggingEnabled(); 5431 } 5432 isBackgroundActivityStartsEnabled()5433 boolean isBackgroundActivityStartsEnabled() { 5434 return mAmInternal.isBackgroundActivityStartsEnabled(); 5435 } 5436 enableScreenAfterBoot(boolean booted)5437 void enableScreenAfterBoot(boolean booted) { 5438 EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN, 5439 SystemClock.uptimeMillis()); 5440 mWindowManager.enableScreenAfterBoot(); 5441 5442 synchronized (mGlobalLock) { 5443 updateEventDispatchingLocked(booted); 5444 } 5445 } 5446 getInputDispatchingTimeoutLocked(ActivityRecord r)5447 static long getInputDispatchingTimeoutLocked(ActivityRecord r) { 5448 if (r == null || !r.hasProcess()) { 5449 return KEY_DISPATCHING_TIMEOUT_MS; 5450 } 5451 return getInputDispatchingTimeoutLocked(r.app); 5452 } 5453 getInputDispatchingTimeoutLocked(WindowProcessController r)5454 private static long getInputDispatchingTimeoutLocked(WindowProcessController r) { 5455 return r != null ? r.getInputDispatchingTimeout() : KEY_DISPATCHING_TIMEOUT_MS; 5456 } 5457 5458 /** 5459 * Decide based on the configuration whether we should show the ANR, 5460 * crash, etc dialogs. The idea is that if there is no affordance to 5461 * press the on-screen buttons, or the user experience would be more 5462 * greatly impacted than the crash itself, we shouldn't show the dialog. 5463 * 5464 * A thought: SystemUI might also want to get told about this, the Power 5465 * dialog / global actions also might want different behaviors. 5466 */ updateShouldShowDialogsLocked(Configuration config)5467 private void updateShouldShowDialogsLocked(Configuration config) { 5468 final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS 5469 && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH 5470 && config.navigation == Configuration.NAVIGATION_NONAV); 5471 int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK; 5472 final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR 5473 && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER) 5474 && modeType != Configuration.UI_MODE_TYPE_TELEVISION 5475 && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET); 5476 final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(), 5477 HIDE_ERROR_DIALOGS, 0) != 0; 5478 mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet; 5479 } 5480 updateFontScaleIfNeeded(@serIdInt int userId)5481 private void updateFontScaleIfNeeded(@UserIdInt int userId) { 5482 final float scaleFactor = Settings.System.getFloatForUser(mContext.getContentResolver(), 5483 FONT_SCALE, 1.0f, userId); 5484 5485 synchronized (this) { 5486 if (getGlobalConfiguration().fontScale == scaleFactor) { 5487 return; 5488 } 5489 5490 final Configuration configuration 5491 = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY); 5492 configuration.fontScale = scaleFactor; 5493 updatePersistentConfiguration(configuration, userId); 5494 } 5495 } 5496 5497 // Actually is sleeping or shutting down or whatever else in the future 5498 // is an inactive state. isSleepingOrShuttingDownLocked()5499 boolean isSleepingOrShuttingDownLocked() { 5500 return isSleepingLocked() || mShuttingDown; 5501 } 5502 isSleepingLocked()5503 boolean isSleepingLocked() { 5504 return mSleeping; 5505 } 5506 5507 /** Update AMS states when an activity is resumed. */ setResumedActivityUncheckLocked(ActivityRecord r, String reason)5508 void setResumedActivityUncheckLocked(ActivityRecord r, String reason) { 5509 final TaskRecord task = r.getTaskRecord(); 5510 if (task.isActivityTypeStandard()) { 5511 if (mCurAppTimeTracker != r.appTimeTracker) { 5512 // We are switching app tracking. Complete the current one. 5513 if (mCurAppTimeTracker != null) { 5514 mCurAppTimeTracker.stop(); 5515 mH.obtainMessage( 5516 REPORT_TIME_TRACKER_MSG, mCurAppTimeTracker).sendToTarget(); 5517 mRootActivityContainer.clearOtherAppTimeTrackers(r.appTimeTracker); 5518 mCurAppTimeTracker = null; 5519 } 5520 if (r.appTimeTracker != null) { 5521 mCurAppTimeTracker = r.appTimeTracker; 5522 startTimeTrackingFocusedActivityLocked(); 5523 } 5524 } else { 5525 startTimeTrackingFocusedActivityLocked(); 5526 } 5527 } else { 5528 r.appTimeTracker = null; 5529 } 5530 // TODO: VI Maybe r.task.voiceInteractor || r.voiceInteractor != null 5531 // TODO: Probably not, because we don't want to resume voice on switching 5532 // back to this activity 5533 if (task.voiceInteractor != null) { 5534 startRunningVoiceLocked(task.voiceSession, r.info.applicationInfo.uid); 5535 } else { 5536 finishRunningVoiceLocked(); 5537 5538 if (mLastResumedActivity != null) { 5539 final IVoiceInteractionSession session; 5540 5541 final TaskRecord lastResumedActivityTask = mLastResumedActivity.getTaskRecord(); 5542 if (lastResumedActivityTask != null 5543 && lastResumedActivityTask.voiceSession != null) { 5544 session = lastResumedActivityTask.voiceSession; 5545 } else { 5546 session = mLastResumedActivity.voiceSession; 5547 } 5548 5549 if (session != null) { 5550 // We had been in a voice interaction session, but now focused has 5551 // move to something different. Just finish the session, we can't 5552 // return to it and retain the proper state and synchronization with 5553 // the voice interaction service. 5554 finishVoiceTask(session); 5555 } 5556 } 5557 } 5558 5559 if (mLastResumedActivity != null && r.mUserId != mLastResumedActivity.mUserId) { 5560 mAmInternal.sendForegroundProfileChanged(r.mUserId); 5561 } 5562 updateResumedAppTrace(r); 5563 mLastResumedActivity = r; 5564 5565 r.getDisplay().setFocusedApp(r, true); 5566 5567 applyUpdateLockStateLocked(r); 5568 applyUpdateVrModeLocked(r); 5569 5570 EventLogTags.writeAmSetResumedActivity( 5571 r == null ? -1 : r.mUserId, 5572 r == null ? "NULL" : r.shortComponentName, 5573 reason); 5574 } 5575 acquireSleepToken(String tag, int displayId)5576 ActivityTaskManagerInternal.SleepToken acquireSleepToken(String tag, int displayId) { 5577 synchronized (mGlobalLock) { 5578 final ActivityTaskManagerInternal.SleepToken token = 5579 mRootActivityContainer.createSleepToken(tag, displayId); 5580 updateSleepIfNeededLocked(); 5581 return token; 5582 } 5583 } 5584 updateSleepIfNeededLocked()5585 void updateSleepIfNeededLocked() { 5586 final boolean shouldSleep = !mRootActivityContainer.hasAwakeDisplay(); 5587 final boolean wasSleeping = mSleeping; 5588 boolean updateOomAdj = false; 5589 5590 if (!shouldSleep) { 5591 // If wasSleeping is true, we need to wake up activity manager state from when 5592 // we started sleeping. In either case, we need to apply the sleep tokens, which 5593 // will wake up stacks or put them to sleep as appropriate. 5594 if (wasSleeping) { 5595 mSleeping = false; 5596 StatsLog.write(StatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED, 5597 StatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED__STATE__AWAKE); 5598 startTimeTrackingFocusedActivityLocked(); 5599 mTopProcessState = ActivityManager.PROCESS_STATE_TOP; 5600 Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP"); 5601 mStackSupervisor.comeOutOfSleepIfNeededLocked(); 5602 } 5603 mRootActivityContainer.applySleepTokens(true /* applyToStacks */); 5604 if (wasSleeping) { 5605 updateOomAdj = true; 5606 } 5607 } else if (!mSleeping && shouldSleep) { 5608 mSleeping = true; 5609 StatsLog.write(StatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED, 5610 StatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED__STATE__ASLEEP); 5611 if (mCurAppTimeTracker != null) { 5612 mCurAppTimeTracker.stop(); 5613 } 5614 mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING; 5615 Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP_SLEEPING"); 5616 mStackSupervisor.goingToSleepLocked(); 5617 updateResumedAppTrace(null /* resumed */); 5618 updateOomAdj = true; 5619 } 5620 if (updateOomAdj) { 5621 mH.post(mAmInternal::updateOomAdj); 5622 } 5623 } 5624 updateOomAdj()5625 void updateOomAdj() { 5626 mH.post(mAmInternal::updateOomAdj); 5627 } 5628 updateCpuStats()5629 void updateCpuStats() { 5630 mH.post(mAmInternal::updateCpuStats); 5631 } 5632 updateBatteryStats(ActivityRecord component, boolean resumed)5633 void updateBatteryStats(ActivityRecord component, boolean resumed) { 5634 final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::updateBatteryStats, 5635 mAmInternal, component.mActivityComponent, component.app.mUid, component.mUserId, 5636 resumed); 5637 mH.sendMessage(m); 5638 } 5639 updateActivityUsageStats(ActivityRecord activity, int event)5640 void updateActivityUsageStats(ActivityRecord activity, int event) { 5641 ComponentName taskRoot = null; 5642 final TaskRecord task = activity.getTaskRecord(); 5643 if (task != null) { 5644 final ActivityRecord rootActivity = task.getRootActivity(); 5645 if (rootActivity != null) { 5646 taskRoot = rootActivity.mActivityComponent; 5647 } 5648 } 5649 5650 final Message m = PooledLambda.obtainMessage( 5651 ActivityManagerInternal::updateActivityUsageStats, mAmInternal, 5652 activity.mActivityComponent, activity.mUserId, event, activity.appToken, taskRoot); 5653 mH.sendMessage(m); 5654 } 5655 startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop, String hostingType)5656 void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop, 5657 String hostingType) { 5658 try { 5659 if (Trace.isTagEnabled(TRACE_TAG_ACTIVITY_MANAGER)) { 5660 Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "dispatchingStartProcess:" 5661 + activity.processName); 5662 } 5663 // Post message to start process to avoid possible deadlock of calling into AMS with the 5664 // ATMS lock held. 5665 final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess, 5666 mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead, 5667 isTop, hostingType, activity.intent.getComponent()); 5668 mH.sendMessage(m); 5669 } finally { 5670 Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER); 5671 } 5672 } 5673 setBooting(boolean booting)5674 void setBooting(boolean booting) { 5675 mAmInternal.setBooting(booting); 5676 } 5677 isBooting()5678 boolean isBooting() { 5679 return mAmInternal.isBooting(); 5680 } 5681 setBooted(boolean booted)5682 void setBooted(boolean booted) { 5683 mAmInternal.setBooted(booted); 5684 } 5685 isBooted()5686 boolean isBooted() { 5687 return mAmInternal.isBooted(); 5688 } 5689 postFinishBooting(boolean finishBooting, boolean enableScreen)5690 void postFinishBooting(boolean finishBooting, boolean enableScreen) { 5691 mH.post(() -> { 5692 if (finishBooting) { 5693 mAmInternal.finishBooting(); 5694 } 5695 if (enableScreen) { 5696 mInternal.enableScreenAfterBoot(isBooted()); 5697 } 5698 }); 5699 } 5700 setHeavyWeightProcess(ActivityRecord root)5701 void setHeavyWeightProcess(ActivityRecord root) { 5702 mHeavyWeightProcess = root.app; 5703 final Message m = PooledLambda.obtainMessage( 5704 ActivityTaskManagerService::postHeavyWeightProcessNotification, this, 5705 root.app, root.intent, root.mUserId); 5706 mH.sendMessage(m); 5707 } 5708 clearHeavyWeightProcessIfEquals(WindowProcessController proc)5709 void clearHeavyWeightProcessIfEquals(WindowProcessController proc) { 5710 if (mHeavyWeightProcess == null || mHeavyWeightProcess != proc) { 5711 return; 5712 } 5713 5714 mHeavyWeightProcess = null; 5715 final Message m = PooledLambda.obtainMessage( 5716 ActivityTaskManagerService::cancelHeavyWeightProcessNotification, this, 5717 proc.mUserId); 5718 mH.sendMessage(m); 5719 } 5720 cancelHeavyWeightProcessNotification(int userId)5721 private void cancelHeavyWeightProcessNotification(int userId) { 5722 final INotificationManager inm = NotificationManager.getService(); 5723 if (inm == null) { 5724 return; 5725 } 5726 try { 5727 inm.cancelNotificationWithTag("android", null, 5728 SystemMessage.NOTE_HEAVY_WEIGHT_NOTIFICATION, userId); 5729 } catch (RuntimeException e) { 5730 Slog.w(TAG, "Error canceling notification for service", e); 5731 } catch (RemoteException e) { 5732 } 5733 5734 } 5735 postHeavyWeightProcessNotification( WindowProcessController proc, Intent intent, int userId)5736 private void postHeavyWeightProcessNotification( 5737 WindowProcessController proc, Intent intent, int userId) { 5738 if (proc == null) { 5739 return; 5740 } 5741 5742 final INotificationManager inm = NotificationManager.getService(); 5743 if (inm == null) { 5744 return; 5745 } 5746 5747 try { 5748 Context context = mContext.createPackageContext(proc.mInfo.packageName, 0); 5749 String text = mContext.getString(R.string.heavy_weight_notification, 5750 context.getApplicationInfo().loadLabel(context.getPackageManager())); 5751 Notification notification = 5752 new Notification.Builder(context, 5753 SystemNotificationChannels.HEAVY_WEIGHT_APP) 5754 .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb) 5755 .setWhen(0) 5756 .setOngoing(true) 5757 .setTicker(text) 5758 .setColor(mContext.getColor( 5759 com.android.internal.R.color.system_notification_accent_color)) 5760 .setContentTitle(text) 5761 .setContentText( 5762 mContext.getText(R.string.heavy_weight_notification_detail)) 5763 .setContentIntent(PendingIntent.getActivityAsUser(mContext, 0, 5764 intent, PendingIntent.FLAG_CANCEL_CURRENT, null, 5765 new UserHandle(userId))) 5766 .build(); 5767 try { 5768 inm.enqueueNotificationWithTag("android", "android", null, 5769 SystemMessage.NOTE_HEAVY_WEIGHT_NOTIFICATION, notification, userId); 5770 } catch (RuntimeException e) { 5771 Slog.w(TAG, "Error showing notification for heavy-weight app", e); 5772 } catch (RemoteException e) { 5773 } 5774 } catch (PackageManager.NameNotFoundException e) { 5775 Slog.w(TAG, "Unable to create context for heavy notification", e); 5776 } 5777 5778 } 5779 getIntentSenderLocked(int type, String packageName, int callingUid, int userId, IBinder token, String resultWho, int requestCode, Intent[] intents, String[] resolvedTypes, int flags, Bundle bOptions)5780 IIntentSender getIntentSenderLocked(int type, String packageName, int callingUid, int userId, 5781 IBinder token, String resultWho, int requestCode, Intent[] intents, 5782 String[] resolvedTypes, int flags, Bundle bOptions) { 5783 5784 ActivityRecord activity = null; 5785 if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) { 5786 activity = ActivityRecord.isInStackLocked(token); 5787 if (activity == null) { 5788 Slog.w(TAG, "Failed createPendingResult: activity " + token + " not in any stack"); 5789 return null; 5790 } 5791 if (activity.finishing) { 5792 Slog.w(TAG, "Failed createPendingResult: activity " + activity + " is finishing"); 5793 return null; 5794 } 5795 } 5796 5797 final PendingIntentRecord rec = mPendingIntentController.getIntentSender(type, packageName, 5798 callingUid, userId, token, resultWho, requestCode, intents, resolvedTypes, flags, 5799 bOptions); 5800 final boolean noCreate = (flags & PendingIntent.FLAG_NO_CREATE) != 0; 5801 if (noCreate) { 5802 return rec; 5803 } 5804 if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) { 5805 if (activity.pendingResults == null) { 5806 activity.pendingResults = new HashSet<>(); 5807 } 5808 activity.pendingResults.add(rec.ref); 5809 } 5810 return rec; 5811 } 5812 5813 // TODO(b/111541062): Update app time tracking to make it aware of multiple resumed activities startTimeTrackingFocusedActivityLocked()5814 private void startTimeTrackingFocusedActivityLocked() { 5815 final ActivityRecord resumedActivity = mRootActivityContainer.getTopResumedActivity(); 5816 if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) { 5817 mCurAppTimeTracker.start(resumedActivity.packageName); 5818 } 5819 } 5820 updateResumedAppTrace(@ullable ActivityRecord resumed)5821 private void updateResumedAppTrace(@Nullable ActivityRecord resumed) { 5822 if (mTracedResumedActivity != null) { 5823 Trace.asyncTraceEnd(TRACE_TAG_ACTIVITY_MANAGER, 5824 constructResumedTraceName(mTracedResumedActivity.packageName), 0); 5825 } 5826 if (resumed != null) { 5827 Trace.asyncTraceBegin(TRACE_TAG_ACTIVITY_MANAGER, 5828 constructResumedTraceName(resumed.packageName), 0); 5829 } 5830 mTracedResumedActivity = resumed; 5831 } 5832 constructResumedTraceName(String packageName)5833 private String constructResumedTraceName(String packageName) { 5834 return "focused app: " + packageName; 5835 } 5836 5837 /** Applies latest configuration and/or visibility updates if needed. */ ensureConfigAndVisibilityAfterUpdate(ActivityRecord starting, int changes)5838 private boolean ensureConfigAndVisibilityAfterUpdate(ActivityRecord starting, int changes) { 5839 boolean kept = true; 5840 final ActivityStack mainStack = mRootActivityContainer.getTopDisplayFocusedStack(); 5841 // mainStack is null during startup. 5842 if (mainStack != null) { 5843 if (changes != 0 && starting == null) { 5844 // If the configuration changed, and the caller is not already 5845 // in the process of starting an activity, then find the top 5846 // activity to check if its configuration needs to change. 5847 starting = mainStack.topRunningActivityLocked(); 5848 } 5849 5850 if (starting != null) { 5851 kept = starting.ensureActivityConfiguration(changes, 5852 false /* preserveWindow */); 5853 // And we need to make sure at this point that all other activities 5854 // are made visible with the correct configuration. 5855 mRootActivityContainer.ensureActivitiesVisible(starting, changes, 5856 !PRESERVE_WINDOWS); 5857 } 5858 } 5859 5860 return kept; 5861 } 5862 scheduleAppGcsLocked()5863 void scheduleAppGcsLocked() { 5864 mH.post(() -> mAmInternal.scheduleAppGcs()); 5865 } 5866 compatibilityInfoForPackageLocked(ApplicationInfo ai)5867 CompatibilityInfo compatibilityInfoForPackageLocked(ApplicationInfo ai) { 5868 return mCompatModePackages.compatibilityInfoForPackageLocked(ai); 5869 } 5870 5871 /** 5872 * Returns the PackageManager. Used by classes hosted by {@link ActivityTaskManagerService}. The 5873 * PackageManager could be unavailable at construction time and therefore needs to be accessed 5874 * on demand. 5875 */ getPackageManager()5876 IPackageManager getPackageManager() { 5877 return AppGlobals.getPackageManager(); 5878 } 5879 getPackageManagerInternalLocked()5880 PackageManagerInternal getPackageManagerInternalLocked() { 5881 if (mPmInternal == null) { 5882 mPmInternal = LocalServices.getService(PackageManagerInternal.class); 5883 } 5884 return mPmInternal; 5885 } 5886 getPermissionPolicyInternal()5887 PermissionPolicyInternal getPermissionPolicyInternal() { 5888 if (mPermissionPolicyInternal == null) { 5889 mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class); 5890 } 5891 return mPermissionPolicyInternal; 5892 } 5893 getAppWarningsLocked()5894 AppWarnings getAppWarningsLocked() { 5895 return mAppWarnings; 5896 } 5897 getHomeIntent()5898 Intent getHomeIntent() { 5899 Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null); 5900 intent.setComponent(mTopComponent); 5901 intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING); 5902 if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) { 5903 intent.addCategory(Intent.CATEGORY_HOME); 5904 } 5905 return intent; 5906 } 5907 5908 /** 5909 * Return the intent set with {@link Intent#CATEGORY_SECONDARY_HOME} to resolve secondary home 5910 * activities. 5911 * 5912 * @param preferredPackage Specify a preferred package name, otherwise use secondary home 5913 * component defined in config_secondaryHomeComponent. 5914 * @return the intent set with {@link Intent#CATEGORY_SECONDARY_HOME} 5915 */ getSecondaryHomeIntent(String preferredPackage)5916 Intent getSecondaryHomeIntent(String preferredPackage) { 5917 final Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null); 5918 final boolean useSystemProvidedLauncher = mContext.getResources().getBoolean( 5919 com.android.internal.R.bool.config_useSystemProvidedLauncherForSecondary); 5920 if (preferredPackage == null || useSystemProvidedLauncher) { 5921 // Using the component stored in config if no package name or forced. 5922 final String secondaryHomeComponent = mContext.getResources().getString( 5923 com.android.internal.R.string.config_secondaryHomeComponent); 5924 intent.setComponent(ComponentName.unflattenFromString(secondaryHomeComponent)); 5925 } else { 5926 intent.setPackage(preferredPackage); 5927 } 5928 intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING); 5929 if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) { 5930 intent.addCategory(Intent.CATEGORY_SECONDARY_HOME); 5931 } 5932 return intent; 5933 } 5934 getAppInfoForUser(ApplicationInfo info, int userId)5935 ApplicationInfo getAppInfoForUser(ApplicationInfo info, int userId) { 5936 if (info == null) return null; 5937 ApplicationInfo newInfo = new ApplicationInfo(info); 5938 newInfo.initForUser(userId); 5939 return newInfo; 5940 } 5941 getProcessController(String processName, int uid)5942 WindowProcessController getProcessController(String processName, int uid) { 5943 if (uid == SYSTEM_UID) { 5944 // The system gets to run in any process. If there are multiple processes with the same 5945 // uid, just pick the first (this should never happen). 5946 final SparseArray<WindowProcessController> procs = 5947 mProcessNames.getMap().get(processName); 5948 if (procs == null) return null; 5949 final int procCount = procs.size(); 5950 for (int i = 0; i < procCount; i++) { 5951 final int procUid = procs.keyAt(i); 5952 if (UserHandle.isApp(procUid) || !UserHandle.isSameUser(procUid, uid)) { 5953 // Don't use an app process or different user process for system component. 5954 continue; 5955 } 5956 return procs.valueAt(i); 5957 } 5958 } 5959 5960 return mProcessNames.get(processName, uid); 5961 } 5962 getProcessController(IApplicationThread thread)5963 WindowProcessController getProcessController(IApplicationThread thread) { 5964 if (thread == null) { 5965 return null; 5966 } 5967 5968 final IBinder threadBinder = thread.asBinder(); 5969 final ArrayMap<String, SparseArray<WindowProcessController>> pmap = mProcessNames.getMap(); 5970 for (int i = pmap.size()-1; i >= 0; i--) { 5971 final SparseArray<WindowProcessController> procs = pmap.valueAt(i); 5972 for (int j = procs.size() - 1; j >= 0; j--) { 5973 final WindowProcessController proc = procs.valueAt(j); 5974 if (proc.hasThread() && proc.getThread().asBinder() == threadBinder) { 5975 return proc; 5976 } 5977 } 5978 } 5979 5980 return null; 5981 } 5982 getProcessController(int pid, int uid)5983 WindowProcessController getProcessController(int pid, int uid) { 5984 final WindowProcessController proc = mProcessMap.getProcess(pid); 5985 if (proc == null) return null; 5986 if (UserHandle.isApp(uid) && proc.mUid == uid) { 5987 return proc; 5988 } 5989 return null; 5990 } 5991 getUidState(int uid)5992 int getUidState(int uid) { 5993 return mActiveUids.getUidState(uid); 5994 } 5995 isUidForeground(int uid)5996 boolean isUidForeground(int uid) { 5997 // A uid is considered to be foreground if it has a visible non-toast window. 5998 return mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(uid); 5999 } 6000 isDeviceOwner(int uid)6001 boolean isDeviceOwner(int uid) { 6002 return uid >= 0 && mDeviceOwnerUid == uid; 6003 } 6004 setDeviceOwnerUid(int uid)6005 void setDeviceOwnerUid(int uid) { 6006 mDeviceOwnerUid = uid; 6007 } 6008 6009 /** 6010 * @return whitelist tag for a uid from mPendingTempWhitelist, null if not currently on 6011 * the whitelist 6012 */ getPendingTempWhitelistTagForUidLocked(int uid)6013 String getPendingTempWhitelistTagForUidLocked(int uid) { 6014 return mPendingTempWhitelist.get(uid); 6015 } 6016 logAppTooSlow(WindowProcessController app, long startTime, String msg)6017 void logAppTooSlow(WindowProcessController app, long startTime, String msg) { 6018 if (true || Build.IS_USER) { 6019 return; 6020 } 6021 6022 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); 6023 StrictMode.allowThreadDiskWrites(); 6024 try { 6025 File tracesDir = new File("/data/anr"); 6026 File tracesFile = null; 6027 try { 6028 tracesFile = File.createTempFile("app_slow", null, tracesDir); 6029 6030 StringBuilder sb = new StringBuilder(); 6031 Time tobj = new Time(); 6032 tobj.set(System.currentTimeMillis()); 6033 sb.append(tobj.format("%Y-%m-%d %H:%M:%S")); 6034 sb.append(": "); 6035 TimeUtils.formatDuration(SystemClock.uptimeMillis()-startTime, sb); 6036 sb.append(" since "); 6037 sb.append(msg); 6038 FileOutputStream fos = new FileOutputStream(tracesFile); 6039 fos.write(sb.toString().getBytes()); 6040 if (app == null) { 6041 fos.write("\n*** No application process!".getBytes()); 6042 } 6043 fos.close(); 6044 FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw- 6045 } catch (IOException e) { 6046 Slog.w(TAG, "Unable to prepare slow app traces file: " + tracesFile, e); 6047 return; 6048 } 6049 6050 if (app != null && app.getPid() > 0) { 6051 ArrayList<Integer> firstPids = new ArrayList<Integer>(); 6052 firstPids.add(app.getPid()); 6053 dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, null, null); 6054 } 6055 6056 File lastTracesFile = null; 6057 File curTracesFile = null; 6058 for (int i=9; i>=0; i--) { 6059 String name = String.format(Locale.US, "slow%02d.txt", i); 6060 curTracesFile = new File(tracesDir, name); 6061 if (curTracesFile.exists()) { 6062 if (lastTracesFile != null) { 6063 curTracesFile.renameTo(lastTracesFile); 6064 } else { 6065 curTracesFile.delete(); 6066 } 6067 } 6068 lastTracesFile = curTracesFile; 6069 } 6070 tracesFile.renameTo(curTracesFile); 6071 } finally { 6072 StrictMode.setThreadPolicy(oldPolicy); 6073 } 6074 } 6075 isAssociatedCompanionApp(int userId, int uid)6076 boolean isAssociatedCompanionApp(int userId, int uid) { 6077 final Set<Integer> allUids = mCompanionAppUidsMap.get(userId); 6078 if (allUids == null) { 6079 return false; 6080 } 6081 return allUids.contains(uid); 6082 } 6083 notifySingleTaskDisplayEmpty(int displayId)6084 void notifySingleTaskDisplayEmpty(int displayId) { 6085 mTaskChangeNotificationController.notifySingleTaskDisplayEmpty(displayId); 6086 } 6087 6088 final class H extends Handler { 6089 static final int REPORT_TIME_TRACKER_MSG = 1; 6090 6091 6092 static final int FIRST_ACTIVITY_STACK_MSG = 100; 6093 static final int FIRST_SUPERVISOR_STACK_MSG = 200; 6094 H(Looper looper)6095 H(Looper looper) { 6096 super(looper); 6097 } 6098 6099 @Override handleMessage(Message msg)6100 public void handleMessage(Message msg) { 6101 switch (msg.what) { 6102 case REPORT_TIME_TRACKER_MSG: { 6103 AppTimeTracker tracker = (AppTimeTracker) msg.obj; 6104 tracker.deliverResult(mContext); 6105 } break; 6106 } 6107 } 6108 } 6109 6110 final class UiHandler extends Handler { 6111 static final int DISMISS_DIALOG_UI_MSG = 1; 6112 UiHandler()6113 public UiHandler() { 6114 super(UiThread.get().getLooper(), null, true); 6115 } 6116 6117 @Override handleMessage(Message msg)6118 public void handleMessage(Message msg) { 6119 switch (msg.what) { 6120 case DISMISS_DIALOG_UI_MSG: { 6121 final Dialog d = (Dialog) msg.obj; 6122 d.dismiss(); 6123 break; 6124 } 6125 } 6126 } 6127 } 6128 6129 final class LocalService extends ActivityTaskManagerInternal { 6130 @Override acquireSleepToken(String tag, int displayId)6131 public SleepToken acquireSleepToken(String tag, int displayId) { 6132 Preconditions.checkNotNull(tag); 6133 return ActivityTaskManagerService.this.acquireSleepToken(tag, displayId); 6134 } 6135 6136 @Override getHomeActivityForUser(int userId)6137 public ComponentName getHomeActivityForUser(int userId) { 6138 synchronized (mGlobalLock) { 6139 final ActivityRecord homeActivity = 6140 mRootActivityContainer.getDefaultDisplayHomeActivityForUser(userId); 6141 return homeActivity == null ? null : homeActivity.mActivityComponent; 6142 } 6143 } 6144 6145 @Override onLocalVoiceInteractionStarted(IBinder activity, IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor)6146 public void onLocalVoiceInteractionStarted(IBinder activity, 6147 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) { 6148 synchronized (mGlobalLock) { 6149 onLocalVoiceInteractionStartedLocked(activity, voiceSession, voiceInteractor); 6150 } 6151 } 6152 6153 @Override notifyAppTransitionStarting(SparseIntArray reasons, long timestamp)6154 public void notifyAppTransitionStarting(SparseIntArray reasons, 6155 long timestamp) { 6156 synchronized (mGlobalLock) { 6157 mStackSupervisor.getActivityMetricsLogger().notifyTransitionStarting( 6158 reasons, timestamp); 6159 } 6160 } 6161 6162 @Override notifySingleTaskDisplayDrawn(int displayId)6163 public void notifySingleTaskDisplayDrawn(int displayId) { 6164 mTaskChangeNotificationController.notifySingleTaskDisplayDrawn(displayId); 6165 } 6166 6167 @Override notifyAppTransitionFinished()6168 public void notifyAppTransitionFinished() { 6169 synchronized (mGlobalLock) { 6170 mStackSupervisor.notifyAppTransitionDone(); 6171 } 6172 } 6173 6174 @Override notifyAppTransitionCancelled()6175 public void notifyAppTransitionCancelled() { 6176 synchronized (mGlobalLock) { 6177 mStackSupervisor.notifyAppTransitionDone(); 6178 } 6179 } 6180 6181 @Override getTopVisibleActivities()6182 public List<IBinder> getTopVisibleActivities() { 6183 synchronized (mGlobalLock) { 6184 return mRootActivityContainer.getTopVisibleActivities(); 6185 } 6186 } 6187 6188 @Override notifyDockedStackMinimizedChanged(boolean minimized)6189 public void notifyDockedStackMinimizedChanged(boolean minimized) { 6190 synchronized (mGlobalLock) { 6191 mRootActivityContainer.setDockedStackMinimized(minimized); 6192 } 6193 } 6194 6195 @Override startActivitiesAsPackage(String packageName, int userId, Intent[] intents, Bundle bOptions)6196 public int startActivitiesAsPackage(String packageName, int userId, Intent[] intents, 6197 Bundle bOptions) { 6198 Preconditions.checkNotNull(intents, "intents"); 6199 final String[] resolvedTypes = new String[intents.length]; 6200 6201 // UID of the package on user userId. 6202 // "= 0" is needed because otherwise catch(RemoteException) would make it look like 6203 // packageUid may not be initialized. 6204 int packageUid = 0; 6205 final long ident = Binder.clearCallingIdentity(); 6206 6207 try { 6208 for (int i = 0; i < intents.length; i++) { 6209 resolvedTypes[i] = 6210 intents[i].resolveTypeIfNeeded(mContext.getContentResolver()); 6211 } 6212 6213 packageUid = AppGlobals.getPackageManager().getPackageUid( 6214 packageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId); 6215 } catch (RemoteException e) { 6216 // Shouldn't happen. 6217 } finally { 6218 Binder.restoreCallingIdentity(ident); 6219 } 6220 6221 return getActivityStartController().startActivitiesInPackage( 6222 packageUid, packageName, 6223 intents, resolvedTypes, null /* resultTo */, 6224 SafeActivityOptions.fromBundle(bOptions), userId, 6225 false /* validateIncomingUser */, null /* originatingPendingIntent */, 6226 false /* allowBackgroundActivityStart */); 6227 } 6228 6229 @Override startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid, String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart)6230 public int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid, 6231 String callingPackage, Intent[] intents, String[] resolvedTypes, IBinder resultTo, 6232 SafeActivityOptions options, int userId, boolean validateIncomingUser, 6233 PendingIntentRecord originatingPendingIntent, 6234 boolean allowBackgroundActivityStart) { 6235 synchronized (mGlobalLock) { 6236 return getActivityStartController().startActivitiesInPackage(uid, realCallingPid, 6237 realCallingUid, callingPackage, intents, resolvedTypes, resultTo, options, 6238 userId, validateIncomingUser, originatingPendingIntent, 6239 allowBackgroundActivityStart); 6240 } 6241 } 6242 6243 @Override startActivityInPackage(int uid, int realCallingPid, int realCallingUid, String callingPackage, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, SafeActivityOptions options, int userId, TaskRecord inTask, String reason, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, boolean allowBackgroundActivityStart)6244 public int startActivityInPackage(int uid, int realCallingPid, int realCallingUid, 6245 String callingPackage, Intent intent, String resolvedType, IBinder resultTo, 6246 String resultWho, int requestCode, int startFlags, SafeActivityOptions options, 6247 int userId, TaskRecord inTask, String reason, boolean validateIncomingUser, 6248 PendingIntentRecord originatingPendingIntent, 6249 boolean allowBackgroundActivityStart) { 6250 synchronized (mGlobalLock) { 6251 return getActivityStartController().startActivityInPackage(uid, realCallingPid, 6252 realCallingUid, callingPackage, intent, resolvedType, resultTo, resultWho, 6253 requestCode, startFlags, options, userId, inTask, reason, 6254 validateIncomingUser, originatingPendingIntent, 6255 allowBackgroundActivityStart); 6256 } 6257 } 6258 6259 @Override startActivityAsUser(IApplicationThread caller, String callerPacakge, Intent intent, Bundle options, int userId)6260 public int startActivityAsUser(IApplicationThread caller, String callerPacakge, 6261 Intent intent, Bundle options, int userId) { 6262 return ActivityTaskManagerService.this.startActivityAsUser( 6263 caller, callerPacakge, intent, 6264 intent.resolveTypeIfNeeded(mContext.getContentResolver()), 6265 null, null, 0, Intent.FLAG_ACTIVITY_NEW_TASK, null, options, userId, 6266 false /*validateIncomingUser*/); 6267 } 6268 6269 @Override notifyKeyguardFlagsChanged(@ullable Runnable callback, int displayId)6270 public void notifyKeyguardFlagsChanged(@Nullable Runnable callback, int displayId) { 6271 synchronized (mGlobalLock) { 6272 6273 // We might change the visibilities here, so prepare an empty app transition which 6274 // might be overridden later if we actually change visibilities. 6275 final ActivityDisplay activityDisplay = 6276 mRootActivityContainer.getActivityDisplay(displayId); 6277 if (activityDisplay == null) { 6278 return; 6279 } 6280 final DisplayContent dc = activityDisplay.mDisplayContent; 6281 final boolean wasTransitionSet = 6282 dc.mAppTransition.getAppTransition() != TRANSIT_NONE; 6283 if (!wasTransitionSet) { 6284 dc.prepareAppTransition(TRANSIT_NONE, false /* alwaysKeepCurrent */); 6285 } 6286 mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); 6287 6288 // If there was a transition set already we don't want to interfere with it as we 6289 // might be starting it too early. 6290 if (!wasTransitionSet) { 6291 dc.executeAppTransition(); 6292 } 6293 } 6294 if (callback != null) { 6295 callback.run(); 6296 } 6297 } 6298 6299 @Override notifyKeyguardTrustedChanged()6300 public void notifyKeyguardTrustedChanged() { 6301 synchronized (mGlobalLock) { 6302 if (mKeyguardController.isKeyguardShowing(DEFAULT_DISPLAY)) { 6303 mRootActivityContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); 6304 } 6305 } 6306 } 6307 6308 /** 6309 * Called after virtual display Id is updated by 6310 * {@link com.android.server.vr.Vr2dDisplay} with a specific 6311 * {@param vrVr2dDisplayId}. 6312 */ 6313 @Override setVr2dDisplayId(int vr2dDisplayId)6314 public void setVr2dDisplayId(int vr2dDisplayId) { 6315 if (DEBUG_STACK) Slog.d(TAG, "setVr2dDisplayId called for: " + vr2dDisplayId); 6316 synchronized (mGlobalLock) { 6317 mVr2dDisplayId = vr2dDisplayId; 6318 } 6319 } 6320 6321 @Override setFocusedActivity(IBinder token)6322 public void setFocusedActivity(IBinder token) { 6323 synchronized (mGlobalLock) { 6324 final ActivityRecord r = ActivityRecord.forTokenLocked(token); 6325 if (r == null) { 6326 throw new IllegalArgumentException( 6327 "setFocusedActivity: No activity record matching token=" + token); 6328 } 6329 if (r.moveFocusableActivityToTop("setFocusedActivity")) { 6330 mRootActivityContainer.resumeFocusedStacksTopActivities(); 6331 } 6332 } 6333 } 6334 6335 @Override registerScreenObserver(ScreenObserver observer)6336 public void registerScreenObserver(ScreenObserver observer) { 6337 mScreenObservers.add(observer); 6338 } 6339 6340 @Override isCallerRecents(int callingUid)6341 public boolean isCallerRecents(int callingUid) { 6342 return getRecentTasks().isCallerRecents(callingUid); 6343 } 6344 6345 @Override isRecentsComponentHomeActivity(int userId)6346 public boolean isRecentsComponentHomeActivity(int userId) { 6347 return getRecentTasks().isRecentsComponentHomeActivity(userId); 6348 } 6349 6350 @Override cancelRecentsAnimation(boolean restoreHomeStackPosition)6351 public void cancelRecentsAnimation(boolean restoreHomeStackPosition) { 6352 ActivityTaskManagerService.this.cancelRecentsAnimation(restoreHomeStackPosition); 6353 } 6354 6355 @Override enforceCallerIsRecentsOrHasPermission(String permission, String func)6356 public void enforceCallerIsRecentsOrHasPermission(String permission, String func) { 6357 ActivityTaskManagerService.this.enforceCallerIsRecentsOrHasPermission(permission, func); 6358 } 6359 6360 @Override notifyActiveVoiceInteractionServiceChanged(ComponentName component)6361 public void notifyActiveVoiceInteractionServiceChanged(ComponentName component) { 6362 synchronized (mGlobalLock) { 6363 mActiveVoiceInteractionServiceComponent = component; 6364 } 6365 } 6366 6367 @Override setAllowAppSwitches(@onNull String type, int uid, int userId)6368 public void setAllowAppSwitches(@NonNull String type, int uid, int userId) { 6369 if (!mAmInternal.isUserRunning(userId, ActivityManager.FLAG_OR_STOPPED)) { 6370 return; 6371 } 6372 synchronized (mGlobalLock) { 6373 ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(userId); 6374 if (types == null) { 6375 if (uid < 0) { 6376 return; 6377 } 6378 types = new ArrayMap<>(); 6379 mAllowAppSwitchUids.put(userId, types); 6380 } 6381 if (uid < 0) { 6382 types.remove(type); 6383 } else { 6384 types.put(type, uid); 6385 } 6386 } 6387 } 6388 6389 @Override onUserStopped(int userId)6390 public void onUserStopped(int userId) { 6391 synchronized (mGlobalLock) { 6392 getRecentTasks().unloadUserDataFromMemoryLocked(userId); 6393 mAllowAppSwitchUids.remove(userId); 6394 } 6395 } 6396 6397 @Override isGetTasksAllowed(String caller, int callingPid, int callingUid)6398 public boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) { 6399 synchronized (mGlobalLock) { 6400 return ActivityTaskManagerService.this.isGetTasksAllowed( 6401 caller, callingPid, callingUid); 6402 } 6403 } 6404 6405 @HotPath(caller = HotPath.PROCESS_CHANGE) 6406 @Override onProcessAdded(WindowProcessController proc)6407 public void onProcessAdded(WindowProcessController proc) { 6408 synchronized (mGlobalLockWithoutBoost) { 6409 mProcessNames.put(proc.mName, proc.mUid, proc); 6410 } 6411 } 6412 6413 @HotPath(caller = HotPath.PROCESS_CHANGE) 6414 @Override onProcessRemoved(String name, int uid)6415 public void onProcessRemoved(String name, int uid) { 6416 synchronized (mGlobalLockWithoutBoost) { 6417 mProcessNames.remove(name, uid); 6418 } 6419 } 6420 6421 @HotPath(caller = HotPath.PROCESS_CHANGE) 6422 @Override onCleanUpApplicationRecord(WindowProcessController proc)6423 public void onCleanUpApplicationRecord(WindowProcessController proc) { 6424 synchronized (mGlobalLockWithoutBoost) { 6425 if (proc == mHomeProcess) { 6426 mHomeProcess = null; 6427 } 6428 if (proc == mPreviousProcess) { 6429 mPreviousProcess = null; 6430 } 6431 } 6432 } 6433 6434 @HotPath(caller = HotPath.OOM_ADJUSTMENT) 6435 @Override getTopProcessState()6436 public int getTopProcessState() { 6437 synchronized (mGlobalLockWithoutBoost) { 6438 return mTopProcessState; 6439 } 6440 } 6441 6442 @HotPath(caller = HotPath.OOM_ADJUSTMENT) 6443 @Override isHeavyWeightProcess(WindowProcessController proc)6444 public boolean isHeavyWeightProcess(WindowProcessController proc) { 6445 synchronized (mGlobalLockWithoutBoost) { 6446 return proc == mHeavyWeightProcess; 6447 } 6448 } 6449 6450 @HotPath(caller = HotPath.PROCESS_CHANGE) 6451 @Override clearHeavyWeightProcessIfEquals(WindowProcessController proc)6452 public void clearHeavyWeightProcessIfEquals(WindowProcessController proc) { 6453 synchronized (mGlobalLockWithoutBoost) { 6454 ActivityTaskManagerService.this.clearHeavyWeightProcessIfEquals(proc); 6455 } 6456 } 6457 6458 @Override finishHeavyWeightApp()6459 public void finishHeavyWeightApp() { 6460 synchronized (mGlobalLock) { 6461 if (mHeavyWeightProcess != null) { 6462 mHeavyWeightProcess.finishActivities(); 6463 } 6464 ActivityTaskManagerService.this.clearHeavyWeightProcessIfEquals( 6465 mHeavyWeightProcess); 6466 } 6467 } 6468 6469 @HotPath(caller = HotPath.OOM_ADJUSTMENT) 6470 @Override isSleeping()6471 public boolean isSleeping() { 6472 synchronized (mGlobalLockWithoutBoost) { 6473 return isSleepingLocked(); 6474 } 6475 } 6476 6477 @Override isShuttingDown()6478 public boolean isShuttingDown() { 6479 synchronized (mGlobalLock) { 6480 return mShuttingDown; 6481 } 6482 } 6483 6484 @Override shuttingDown(boolean booted, int timeout)6485 public boolean shuttingDown(boolean booted, int timeout) { 6486 synchronized (mGlobalLock) { 6487 mShuttingDown = true; 6488 mRootActivityContainer.prepareForShutdown(); 6489 updateEventDispatchingLocked(booted); 6490 notifyTaskPersisterLocked(null, true); 6491 return mStackSupervisor.shutdownLocked(timeout); 6492 } 6493 } 6494 6495 @Override enableScreenAfterBoot(boolean booted)6496 public void enableScreenAfterBoot(boolean booted) { 6497 synchronized (mGlobalLock) { 6498 EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN, 6499 SystemClock.uptimeMillis()); 6500 mWindowManager.enableScreenAfterBoot(); 6501 updateEventDispatchingLocked(booted); 6502 } 6503 } 6504 6505 @Override showStrictModeViolationDialog()6506 public boolean showStrictModeViolationDialog() { 6507 synchronized (mGlobalLock) { 6508 return mShowDialogs && !mSleeping && !mShuttingDown; 6509 } 6510 } 6511 6512 @Override showSystemReadyErrorDialogsIfNeeded()6513 public void showSystemReadyErrorDialogsIfNeeded() { 6514 synchronized (mGlobalLock) { 6515 try { 6516 if (AppGlobals.getPackageManager().hasSystemUidErrors()) { 6517 Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your" 6518 + " data partition or your device will be unstable."); 6519 mUiHandler.post(() -> { 6520 if (mShowDialogs) { 6521 AlertDialog d = new BaseErrorDialog(mUiContext); 6522 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR); 6523 d.setCancelable(false); 6524 d.setTitle(mUiContext.getText(R.string.android_system_label)); 6525 d.setMessage(mUiContext.getText(R.string.system_error_wipe_data)); 6526 d.setButton(DialogInterface.BUTTON_POSITIVE, 6527 mUiContext.getText(R.string.ok), 6528 mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d)); 6529 d.show(); 6530 } 6531 }); 6532 } 6533 } catch (RemoteException e) { 6534 } 6535 6536 if (!Build.isBuildConsistent()) { 6537 Slog.e(TAG, "Build fingerprint is not consistent, warning user"); 6538 mUiHandler.post(() -> { 6539 if (mShowDialogs) { 6540 AlertDialog d = new BaseErrorDialog(mUiContext); 6541 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR); 6542 d.setCancelable(false); 6543 d.setTitle(mUiContext.getText(R.string.android_system_label)); 6544 d.setMessage(mUiContext.getText(R.string.system_error_manufacturer)); 6545 d.setButton(DialogInterface.BUTTON_POSITIVE, 6546 mUiContext.getText(R.string.ok), 6547 mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d)); 6548 d.show(); 6549 } 6550 }); 6551 } 6552 } 6553 } 6554 6555 @Override onProcessMapped(int pid, WindowProcessController proc)6556 public void onProcessMapped(int pid, WindowProcessController proc) { 6557 synchronized (mGlobalLock) { 6558 mProcessMap.put(pid, proc); 6559 } 6560 } 6561 6562 @Override onProcessUnMapped(int pid)6563 public void onProcessUnMapped(int pid) { 6564 synchronized (mGlobalLock) { 6565 mProcessMap.remove(pid); 6566 } 6567 } 6568 6569 @Override onPackageDataCleared(String name)6570 public void onPackageDataCleared(String name) { 6571 synchronized (mGlobalLock) { 6572 mCompatModePackages.handlePackageDataClearedLocked(name); 6573 mAppWarnings.onPackageDataCleared(name); 6574 } 6575 } 6576 6577 @Override onPackageUninstalled(String name)6578 public void onPackageUninstalled(String name) { 6579 synchronized (mGlobalLock) { 6580 mAppWarnings.onPackageUninstalled(name); 6581 mCompatModePackages.handlePackageUninstalledLocked(name); 6582 } 6583 } 6584 6585 @Override onPackageAdded(String name, boolean replacing)6586 public void onPackageAdded(String name, boolean replacing) { 6587 synchronized (mGlobalLock) { 6588 mCompatModePackages.handlePackageAddedLocked(name, replacing); 6589 } 6590 } 6591 6592 @Override onPackageReplaced(ApplicationInfo aInfo)6593 public void onPackageReplaced(ApplicationInfo aInfo) { 6594 synchronized (mGlobalLock) { 6595 mRootActivityContainer.updateActivityApplicationInfo(aInfo); 6596 } 6597 } 6598 6599 @Override compatibilityInfoForPackage(ApplicationInfo ai)6600 public CompatibilityInfo compatibilityInfoForPackage(ApplicationInfo ai) { 6601 synchronized (mGlobalLock) { 6602 return compatibilityInfoForPackageLocked(ai); 6603 } 6604 } 6605 6606 /** 6607 * Set the corresponding display information for the process global configuration. To be 6608 * called when we need to show IME on a different display. 6609 * 6610 * @param pid The process id associated with the IME window. 6611 * @param displayId The ID of the display showing the IME. 6612 */ 6613 @Override onImeWindowSetOnDisplay(final int pid, final int displayId)6614 public void onImeWindowSetOnDisplay(final int pid, final int displayId) { 6615 // Don't update process-level configuration for Multi-Client IME process since other 6616 // IMEs on other displays will also receive this configuration change due to IME 6617 // services use the same application config/context. 6618 if (InputMethodSystemProperty.MULTI_CLIENT_IME_ENABLED) return; 6619 6620 if (pid == MY_PID || pid < 0) { 6621 if (DEBUG_CONFIGURATION) { 6622 Slog.w(TAG, 6623 "Trying to update display configuration for system/invalid process."); 6624 } 6625 return; 6626 } 6627 synchronized (mGlobalLock) { 6628 final ActivityDisplay activityDisplay = 6629 mRootActivityContainer.getActivityDisplay(displayId); 6630 if (activityDisplay == null) { 6631 // Call might come when display is not yet added or has been removed. 6632 if (DEBUG_CONFIGURATION) { 6633 Slog.w(TAG, "Trying to update display configuration for non-existing " 6634 + "displayId=" + displayId); 6635 } 6636 return; 6637 } 6638 final WindowProcessController process = mProcessMap.getProcess(pid); 6639 if (process == null) { 6640 if (DEBUG_CONFIGURATION) { 6641 Slog.w(TAG, "Trying to update display configuration for invalid " 6642 + "process, pid=" + pid); 6643 } 6644 return; 6645 } 6646 process.registerDisplayConfigurationListenerLocked(activityDisplay); 6647 } 6648 } 6649 6650 @Override sendActivityResult(int callingUid, IBinder activityToken, String resultWho, int requestCode, int resultCode, Intent data)6651 public void sendActivityResult(int callingUid, IBinder activityToken, String resultWho, 6652 int requestCode, int resultCode, Intent data) { 6653 synchronized (mGlobalLock) { 6654 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken); 6655 if (r != null && r.getActivityStack() != null) { 6656 r.getActivityStack().sendActivityResultLocked(callingUid, r, resultWho, 6657 requestCode, resultCode, data); 6658 } 6659 } 6660 } 6661 6662 @Override clearPendingResultForActivity(IBinder activityToken, WeakReference<PendingIntentRecord> pir)6663 public void clearPendingResultForActivity(IBinder activityToken, 6664 WeakReference<PendingIntentRecord> pir) { 6665 synchronized (mGlobalLock) { 6666 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken); 6667 if (r != null && r.pendingResults != null) { 6668 r.pendingResults.remove(pir); 6669 } 6670 } 6671 } 6672 6673 @Override getTopActivityForTask(int taskId)6674 public ActivityTokens getTopActivityForTask(int taskId) { 6675 synchronized (mGlobalLock) { 6676 final TaskRecord taskRecord = mRootActivityContainer.anyTaskForId(taskId); 6677 if (taskRecord == null) { 6678 Slog.w(TAG, "getApplicationThreadForTopActivity failed:" 6679 + " Requested task not found"); 6680 return null; 6681 } 6682 final ActivityRecord activity = taskRecord.getTopActivity(); 6683 if (activity == null) { 6684 Slog.w(TAG, "getApplicationThreadForTopActivity failed:" 6685 + " Requested activity not found"); 6686 return null; 6687 } 6688 if (!activity.attachedToProcess()) { 6689 Slog.w(TAG, "getApplicationThreadForTopActivity failed: No process for " 6690 + activity); 6691 return null; 6692 } 6693 return new ActivityTokens(activity.appToken, activity.assistToken, 6694 activity.app.getThread()); 6695 } 6696 } 6697 6698 @Override getIntentSender(int type, String packageName, int callingUid, int userId, IBinder token, String resultWho, int requestCode, Intent[] intents, String[] resolvedTypes, int flags, Bundle bOptions)6699 public IIntentSender getIntentSender(int type, String packageName, 6700 int callingUid, int userId, IBinder token, String resultWho, 6701 int requestCode, Intent[] intents, String[] resolvedTypes, int flags, 6702 Bundle bOptions) { 6703 synchronized (mGlobalLock) { 6704 return getIntentSenderLocked(type, packageName, callingUid, userId, token, 6705 resultWho, requestCode, intents, resolvedTypes, flags, bOptions); 6706 } 6707 } 6708 6709 @Override getServiceConnectionsHolder(IBinder token)6710 public ActivityServiceConnectionsHolder getServiceConnectionsHolder(IBinder token) { 6711 synchronized (mGlobalLock) { 6712 final ActivityRecord r = ActivityRecord.isInStackLocked(token); 6713 if (r == null) { 6714 return null; 6715 } 6716 if (r.mServiceConnectionsHolder == null) { 6717 r.mServiceConnectionsHolder = new ActivityServiceConnectionsHolder( 6718 ActivityTaskManagerService.this, r); 6719 } 6720 6721 return r.mServiceConnectionsHolder; 6722 } 6723 } 6724 6725 @Override getHomeIntent()6726 public Intent getHomeIntent() { 6727 synchronized (mGlobalLock) { 6728 return ActivityTaskManagerService.this.getHomeIntent(); 6729 } 6730 } 6731 6732 @Override startHomeActivity(int userId, String reason)6733 public boolean startHomeActivity(int userId, String reason) { 6734 synchronized (mGlobalLock) { 6735 return mRootActivityContainer.startHomeOnDisplay(userId, reason, DEFAULT_DISPLAY); 6736 } 6737 } 6738 6739 @Override startHomeOnDisplay(int userId, String reason, int displayId, boolean allowInstrumenting, boolean fromHomeKey)6740 public boolean startHomeOnDisplay(int userId, String reason, int displayId, 6741 boolean allowInstrumenting, boolean fromHomeKey) { 6742 synchronized (mGlobalLock) { 6743 return mRootActivityContainer.startHomeOnDisplay(userId, reason, displayId, 6744 allowInstrumenting, fromHomeKey); 6745 } 6746 } 6747 6748 @Override startHomeOnAllDisplays(int userId, String reason)6749 public boolean startHomeOnAllDisplays(int userId, String reason) { 6750 synchronized (mGlobalLock) { 6751 return mRootActivityContainer.startHomeOnAllDisplays(userId, reason); 6752 } 6753 } 6754 6755 @HotPath(caller = HotPath.PROCESS_CHANGE) 6756 @Override isFactoryTestProcess(WindowProcessController wpc)6757 public boolean isFactoryTestProcess(WindowProcessController wpc) { 6758 synchronized (mGlobalLockWithoutBoost) { 6759 if (mFactoryTest == FACTORY_TEST_OFF) { 6760 return false; 6761 } 6762 if (mFactoryTest == FACTORY_TEST_LOW_LEVEL && mTopComponent != null 6763 && wpc.mName.equals(mTopComponent.getPackageName())) { 6764 return true; 6765 } 6766 return mFactoryTest == FACTORY_TEST_HIGH_LEVEL 6767 && (wpc.mInfo.flags & FLAG_FACTORY_TEST) != 0; 6768 } 6769 } 6770 6771 @Override updateTopComponentForFactoryTest()6772 public void updateTopComponentForFactoryTest() { 6773 synchronized (mGlobalLock) { 6774 if (mFactoryTest != FACTORY_TEST_LOW_LEVEL) { 6775 return; 6776 } 6777 final ResolveInfo ri = mContext.getPackageManager() 6778 .resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST), STOCK_PM_FLAGS); 6779 final CharSequence errorMsg; 6780 if (ri != null) { 6781 final ActivityInfo ai = ri.activityInfo; 6782 final ApplicationInfo app = ai.applicationInfo; 6783 if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { 6784 mTopAction = Intent.ACTION_FACTORY_TEST; 6785 mTopData = null; 6786 mTopComponent = new ComponentName(app.packageName, ai.name); 6787 errorMsg = null; 6788 } else { 6789 errorMsg = mContext.getResources().getText( 6790 com.android.internal.R.string.factorytest_not_system); 6791 } 6792 } else { 6793 errorMsg = mContext.getResources().getText( 6794 com.android.internal.R.string.factorytest_no_action); 6795 } 6796 if (errorMsg == null) { 6797 return; 6798 } 6799 6800 mTopAction = null; 6801 mTopData = null; 6802 mTopComponent = null; 6803 mUiHandler.post(() -> { 6804 Dialog d = new FactoryErrorDialog(mUiContext, errorMsg); 6805 d.show(); 6806 mAmInternal.ensureBootCompleted(); 6807 }); 6808 } 6809 } 6810 6811 @HotPath(caller = HotPath.PROCESS_CHANGE) 6812 @Override handleAppDied(WindowProcessController wpc, boolean restarting, Runnable finishInstrumentationCallback)6813 public void handleAppDied(WindowProcessController wpc, boolean restarting, 6814 Runnable finishInstrumentationCallback) { 6815 synchronized (mGlobalLockWithoutBoost) { 6816 // Remove this application's activities from active lists. 6817 boolean hasVisibleActivities = mRootActivityContainer.handleAppDied(wpc); 6818 6819 wpc.clearRecentTasks(); 6820 wpc.clearActivities(); 6821 6822 if (wpc.isInstrumenting()) { 6823 finishInstrumentationCallback.run(); 6824 } 6825 6826 if (!restarting && hasVisibleActivities) { 6827 mWindowManager.deferSurfaceLayout(); 6828 try { 6829 if (!mRootActivityContainer.resumeFocusedStacksTopActivities()) { 6830 // If there was nothing to resume, and we are not already restarting 6831 // this process, but there is a visible activity that is hosted by the 6832 // process...then make sure all visible activities are running, taking 6833 // care of restarting this process. 6834 mRootActivityContainer.ensureActivitiesVisible(null, 0, 6835 !PRESERVE_WINDOWS); 6836 } 6837 } finally { 6838 mWindowManager.continueSurfaceLayout(); 6839 } 6840 } 6841 } 6842 } 6843 6844 @Override closeSystemDialogs(String reason)6845 public void closeSystemDialogs(String reason) { 6846 enforceNotIsolatedCaller("closeSystemDialogs"); 6847 6848 final int pid = Binder.getCallingPid(); 6849 final int uid = Binder.getCallingUid(); 6850 final long origId = Binder.clearCallingIdentity(); 6851 try { 6852 synchronized (mGlobalLock) { 6853 // Only allow this from foreground processes, so that background 6854 // applications can't abuse it to prevent system UI from being shown. 6855 if (uid >= FIRST_APPLICATION_UID) { 6856 final WindowProcessController proc = mProcessMap.getProcess(pid); 6857 if (!proc.isPerceptible()) { 6858 Slog.w(TAG, "Ignoring closeSystemDialogs " + reason 6859 + " from background process " + proc); 6860 return; 6861 } 6862 } 6863 mWindowManager.closeSystemDialogs(reason); 6864 6865 mRootActivityContainer.closeSystemDialogs(); 6866 } 6867 // Call into AM outside the synchronized block. 6868 mAmInternal.broadcastCloseSystemDialogs(reason); 6869 } finally { 6870 Binder.restoreCallingIdentity(origId); 6871 } 6872 } 6873 6874 @Override cleanupDisabledPackageComponents( String packageName, Set<String> disabledClasses, int userId, boolean booted)6875 public void cleanupDisabledPackageComponents( 6876 String packageName, Set<String> disabledClasses, int userId, boolean booted) { 6877 synchronized (mGlobalLock) { 6878 // Clean-up disabled activities. 6879 if (mRootActivityContainer.finishDisabledPackageActivities( 6880 packageName, disabledClasses, true, false, userId) && booted) { 6881 mRootActivityContainer.resumeFocusedStacksTopActivities(); 6882 mStackSupervisor.scheduleIdleLocked(); 6883 } 6884 6885 // Clean-up disabled tasks 6886 getRecentTasks().cleanupDisabledPackageTasksLocked( 6887 packageName, disabledClasses, userId); 6888 } 6889 } 6890 6891 @Override onForceStopPackage(String packageName, boolean doit, boolean evenPersistent, int userId)6892 public boolean onForceStopPackage(String packageName, boolean doit, boolean evenPersistent, 6893 int userId) { 6894 synchronized (mGlobalLock) { 6895 6896 boolean didSomething = 6897 getActivityStartController().clearPendingActivityLaunches(packageName); 6898 didSomething |= mRootActivityContainer.finishDisabledPackageActivities(packageName, 6899 null, doit, evenPersistent, userId); 6900 return didSomething; 6901 } 6902 } 6903 6904 @Override resumeTopActivities(boolean scheduleIdle)6905 public void resumeTopActivities(boolean scheduleIdle) { 6906 synchronized (mGlobalLock) { 6907 mRootActivityContainer.resumeFocusedStacksTopActivities(); 6908 if (scheduleIdle) { 6909 mStackSupervisor.scheduleIdleLocked(); 6910 } 6911 } 6912 } 6913 6914 @HotPath(caller = HotPath.PROCESS_CHANGE) 6915 @Override preBindApplication(WindowProcessController wpc)6916 public void preBindApplication(WindowProcessController wpc) { 6917 synchronized (mGlobalLockWithoutBoost) { 6918 mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(wpc.mInfo); 6919 } 6920 } 6921 6922 @HotPath(caller = HotPath.PROCESS_CHANGE) 6923 @Override attachApplication(WindowProcessController wpc)6924 public boolean attachApplication(WindowProcessController wpc) throws RemoteException { 6925 synchronized (mGlobalLockWithoutBoost) { 6926 return mRootActivityContainer.attachApplication(wpc); 6927 } 6928 } 6929 6930 @Override notifyLockedProfile(@serIdInt int userId, int currentUserId)6931 public void notifyLockedProfile(@UserIdInt int userId, int currentUserId) { 6932 try { 6933 if (!AppGlobals.getPackageManager().isUidPrivileged(Binder.getCallingUid())) { 6934 throw new SecurityException("Only privileged app can call notifyLockedProfile"); 6935 } 6936 } catch (RemoteException ex) { 6937 throw new SecurityException("Fail to check is caller a privileged app", ex); 6938 } 6939 6940 synchronized (mGlobalLock) { 6941 final long ident = Binder.clearCallingIdentity(); 6942 try { 6943 if (mAmInternal.shouldConfirmCredentials(userId)) { 6944 if (mKeyguardController.isKeyguardLocked()) { 6945 // Showing launcher to avoid user entering credential twice. 6946 startHomeActivity(currentUserId, "notifyLockedProfile"); 6947 } 6948 mRootActivityContainer.lockAllProfileTasks(userId); 6949 } 6950 } finally { 6951 Binder.restoreCallingIdentity(ident); 6952 } 6953 } 6954 } 6955 6956 @Override startConfirmDeviceCredentialIntent(Intent intent, Bundle options)6957 public void startConfirmDeviceCredentialIntent(Intent intent, Bundle options) { 6958 mAmInternal.enforceCallingPermission( 6959 MANAGE_ACTIVITY_STACKS, "startConfirmDeviceCredentialIntent"); 6960 6961 synchronized (mGlobalLock) { 6962 final long ident = Binder.clearCallingIdentity(); 6963 try { 6964 intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 6965 final ActivityOptions activityOptions = options != null 6966 ? new ActivityOptions(options) : ActivityOptions.makeBasic(); 6967 mContext.startActivityAsUser(intent, activityOptions.toBundle(), 6968 UserHandle.CURRENT); 6969 } finally { 6970 Binder.restoreCallingIdentity(ident); 6971 } 6972 } 6973 } 6974 6975 @Override writeActivitiesToProto(ProtoOutputStream proto)6976 public void writeActivitiesToProto(ProtoOutputStream proto) { 6977 synchronized (mGlobalLock) { 6978 // The output proto of "activity --proto activities" 6979 // is ActivityManagerServiceDumpActivitiesProto 6980 mRootActivityContainer.writeToProto(proto, 6981 ActivityManagerServiceDumpActivitiesProto.ACTIVITY_STACK_SUPERVISOR, 6982 WindowTraceLogLevel.ALL); 6983 } 6984 } 6985 6986 @Override saveANRState(String reason)6987 public void saveANRState(String reason) { 6988 synchronized (mGlobalLock) { 6989 final StringWriter sw = new StringWriter(); 6990 final PrintWriter pw = new FastPrintWriter(sw, false, 1024); 6991 pw.println(" ANR time: " + DateFormat.getDateTimeInstance().format(new Date())); 6992 if (reason != null) { 6993 pw.println(" Reason: " + reason); 6994 } 6995 pw.println(); 6996 getActivityStartController().dump(pw, " ", null); 6997 pw.println(); 6998 pw.println("-------------------------------------------------------------------------------"); 6999 dumpActivitiesLocked(null /* fd */, pw, null /* args */, 0 /* opti */, 7000 true /* dumpAll */, false /* dumpClient */, null /* dumpPackage */, 7001 "" /* header */); 7002 pw.println(); 7003 pw.close(); 7004 7005 mLastANRState = sw.toString(); 7006 } 7007 } 7008 7009 @Override clearSavedANRState()7010 public void clearSavedANRState() { 7011 synchronized (mGlobalLock) { 7012 mLastANRState = null; 7013 } 7014 } 7015 7016 @Override dump(String cmd, FileDescriptor fd, PrintWriter pw, String[] args, int opti, boolean dumpAll, boolean dumpClient, String dumpPackage)7017 public void dump(String cmd, FileDescriptor fd, PrintWriter pw, String[] args, int opti, 7018 boolean dumpAll, boolean dumpClient, String dumpPackage) { 7019 synchronized (mGlobalLock) { 7020 if (DUMP_ACTIVITIES_CMD.equals(cmd) || DUMP_ACTIVITIES_SHORT_CMD.equals(cmd)) { 7021 dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); 7022 } else if (DUMP_LASTANR_CMD.equals(cmd)) { 7023 dumpLastANRLocked(pw); 7024 } else if (DUMP_LASTANR_TRACES_CMD.equals(cmd)) { 7025 dumpLastANRTracesLocked(pw); 7026 } else if (DUMP_STARTER_CMD.equals(cmd)) { 7027 dumpActivityStarterLocked(pw, dumpPackage); 7028 } else if (DUMP_CONTAINERS_CMD.equals(cmd)) { 7029 dumpActivityContainersLocked(pw); 7030 } else if (DUMP_RECENTS_CMD.equals(cmd) || DUMP_RECENTS_SHORT_CMD.equals(cmd)) { 7031 if (getRecentTasks() != null) { 7032 getRecentTasks().dump(pw, dumpAll, dumpPackage); 7033 } 7034 } 7035 } 7036 } 7037 7038 @Override dumpForProcesses(FileDescriptor fd, PrintWriter pw, boolean dumpAll, String dumpPackage, int dumpAppId, boolean needSep, boolean testPssMode, int wakefulness)7039 public boolean dumpForProcesses(FileDescriptor fd, PrintWriter pw, boolean dumpAll, 7040 String dumpPackage, int dumpAppId, boolean needSep, boolean testPssMode, 7041 int wakefulness) { 7042 synchronized (mGlobalLock) { 7043 if (mHomeProcess != null && (dumpPackage == null 7044 || mHomeProcess.mPkgList.contains(dumpPackage))) { 7045 if (needSep) { 7046 pw.println(); 7047 needSep = false; 7048 } 7049 pw.println(" mHomeProcess: " + mHomeProcess); 7050 } 7051 if (mPreviousProcess != null && (dumpPackage == null 7052 || mPreviousProcess.mPkgList.contains(dumpPackage))) { 7053 if (needSep) { 7054 pw.println(); 7055 needSep = false; 7056 } 7057 pw.println(" mPreviousProcess: " + mPreviousProcess); 7058 } 7059 if (dumpAll && (mPreviousProcess == null || dumpPackage == null 7060 || mPreviousProcess.mPkgList.contains(dumpPackage))) { 7061 StringBuilder sb = new StringBuilder(128); 7062 sb.append(" mPreviousProcessVisibleTime: "); 7063 TimeUtils.formatDuration(mPreviousProcessVisibleTime, sb); 7064 pw.println(sb); 7065 } 7066 if (mHeavyWeightProcess != null && (dumpPackage == null 7067 || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) { 7068 if (needSep) { 7069 pw.println(); 7070 needSep = false; 7071 } 7072 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess); 7073 } 7074 if (dumpPackage == null) { 7075 pw.println(" mGlobalConfiguration: " + getGlobalConfiguration()); 7076 mRootActivityContainer.dumpDisplayConfigs(pw, " "); 7077 } 7078 if (dumpAll) { 7079 if (dumpPackage == null) { 7080 pw.println(" mConfigWillChange: " 7081 + getTopDisplayFocusedStack().mConfigWillChange); 7082 } 7083 if (mCompatModePackages.getPackages().size() > 0) { 7084 boolean printed = false; 7085 for (Map.Entry<String, Integer> entry 7086 : mCompatModePackages.getPackages().entrySet()) { 7087 String pkg = entry.getKey(); 7088 int mode = entry.getValue(); 7089 if (dumpPackage != null && !dumpPackage.equals(pkg)) { 7090 continue; 7091 } 7092 if (!printed) { 7093 pw.println(" mScreenCompatPackages:"); 7094 printed = true; 7095 } 7096 pw.println(" " + pkg + ": " + mode); 7097 } 7098 } 7099 } 7100 7101 if (dumpPackage == null) { 7102 pw.println(" mWakefulness=" 7103 + PowerManagerInternal.wakefulnessToString(wakefulness)); 7104 pw.println(" mSleepTokens=" + mRootActivityContainer.mSleepTokens); 7105 if (mRunningVoice != null) { 7106 pw.println(" mRunningVoice=" + mRunningVoice); 7107 pw.println(" mVoiceWakeLock" + mVoiceWakeLock); 7108 } 7109 pw.println(" mSleeping=" + mSleeping); 7110 pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + testPssMode); 7111 pw.println(" mVrController=" + mVrController); 7112 } 7113 if (mCurAppTimeTracker != null) { 7114 mCurAppTimeTracker.dumpWithHeader(pw, " ", true); 7115 } 7116 if (mAllowAppSwitchUids.size() > 0) { 7117 boolean printed = false; 7118 for (int i = 0; i < mAllowAppSwitchUids.size(); i++) { 7119 ArrayMap<String, Integer> types = mAllowAppSwitchUids.valueAt(i); 7120 for (int j = 0; j < types.size(); j++) { 7121 if (dumpPackage == null || 7122 UserHandle.getAppId(types.valueAt(j).intValue()) == dumpAppId) { 7123 if (needSep) { 7124 pw.println(); 7125 needSep = false; 7126 } 7127 if (!printed) { 7128 pw.println(" mAllowAppSwitchUids:"); 7129 printed = true; 7130 } 7131 pw.print(" User "); 7132 pw.print(mAllowAppSwitchUids.keyAt(i)); 7133 pw.print(": Type "); 7134 pw.print(types.keyAt(j)); 7135 pw.print(" = "); 7136 UserHandle.formatUid(pw, types.valueAt(j).intValue()); 7137 pw.println(); 7138 } 7139 } 7140 } 7141 } 7142 if (dumpPackage == null) { 7143 if (mController != null) { 7144 pw.println(" mController=" + mController 7145 + " mControllerIsAMonkey=" + mControllerIsAMonkey); 7146 } 7147 pw.println(" mGoingToSleepWakeLock=" + mStackSupervisor.mGoingToSleepWakeLock); 7148 pw.println(" mLaunchingActivityWakeLock=" 7149 + mStackSupervisor.mLaunchingActivityWakeLock); 7150 } 7151 7152 return needSep; 7153 } 7154 } 7155 7156 @Override writeProcessesToProto(ProtoOutputStream proto, String dumpPackage, int wakeFullness, boolean testPssMode)7157 public void writeProcessesToProto(ProtoOutputStream proto, String dumpPackage, 7158 int wakeFullness, boolean testPssMode) { 7159 synchronized (mGlobalLock) { 7160 if (dumpPackage == null) { 7161 getGlobalConfiguration().writeToProto(proto, GLOBAL_CONFIGURATION); 7162 proto.write(CONFIG_WILL_CHANGE, getTopDisplayFocusedStack().mConfigWillChange); 7163 writeSleepStateToProto(proto, wakeFullness, testPssMode); 7164 if (mRunningVoice != null) { 7165 final long vrToken = proto.start( 7166 ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE); 7167 proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION, 7168 mRunningVoice.toString()); 7169 mVoiceWakeLock.writeToProto( 7170 proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK); 7171 proto.end(vrToken); 7172 } 7173 mVrController.writeToProto(proto, 7174 ActivityManagerServiceDumpProcessesProto.VR_CONTROLLER); 7175 if (mController != null) { 7176 final long token = proto.start(CONTROLLER); 7177 proto.write(CONTROLLER, mController.toString()); 7178 proto.write(IS_A_MONKEY, mControllerIsAMonkey); 7179 proto.end(token); 7180 } 7181 mStackSupervisor.mGoingToSleepWakeLock.writeToProto(proto, GOING_TO_SLEEP); 7182 mStackSupervisor.mLaunchingActivityWakeLock.writeToProto(proto, 7183 LAUNCHING_ACTIVITY); 7184 } 7185 7186 if (mHomeProcess != null && (dumpPackage == null 7187 || mHomeProcess.mPkgList.contains(dumpPackage))) { 7188 mHomeProcess.writeToProto(proto, HOME_PROC); 7189 } 7190 7191 if (mPreviousProcess != null && (dumpPackage == null 7192 || mPreviousProcess.mPkgList.contains(dumpPackage))) { 7193 mPreviousProcess.writeToProto(proto, PREVIOUS_PROC); 7194 proto.write(PREVIOUS_PROC_VISIBLE_TIME_MS, mPreviousProcessVisibleTime); 7195 } 7196 7197 if (mHeavyWeightProcess != null && (dumpPackage == null 7198 || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) { 7199 mHeavyWeightProcess.writeToProto(proto, HEAVY_WEIGHT_PROC); 7200 } 7201 7202 for (Map.Entry<String, Integer> entry 7203 : mCompatModePackages.getPackages().entrySet()) { 7204 String pkg = entry.getKey(); 7205 int mode = entry.getValue(); 7206 if (dumpPackage == null || dumpPackage.equals(pkg)) { 7207 long compatToken = proto.start(SCREEN_COMPAT_PACKAGES); 7208 proto.write(PACKAGE, pkg); 7209 proto.write(MODE, mode); 7210 proto.end(compatToken); 7211 } 7212 } 7213 7214 if (mCurAppTimeTracker != null) { 7215 mCurAppTimeTracker.writeToProto(proto, CURRENT_TRACKER, true); 7216 } 7217 7218 } 7219 } 7220 7221 @Override dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, boolean dumpFocusedStackOnly)7222 public boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, 7223 String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, 7224 boolean dumpFocusedStackOnly) { 7225 return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti, dumpAll, 7226 dumpVisibleStacksOnly, dumpFocusedStackOnly); 7227 } 7228 7229 @Override dumpForOom(PrintWriter pw)7230 public void dumpForOom(PrintWriter pw) { 7231 synchronized (mGlobalLock) { 7232 pw.println(" mHomeProcess: " + mHomeProcess); 7233 pw.println(" mPreviousProcess: " + mPreviousProcess); 7234 if (mHeavyWeightProcess != null) { 7235 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess); 7236 } 7237 } 7238 } 7239 7240 @Override canGcNow()7241 public boolean canGcNow() { 7242 synchronized (mGlobalLock) { 7243 return isSleeping() || mRootActivityContainer.allResumedActivitiesIdle(); 7244 } 7245 } 7246 7247 @HotPath(caller = HotPath.OOM_ADJUSTMENT) 7248 @Override getTopApp()7249 public WindowProcessController getTopApp() { 7250 synchronized (mGlobalLockWithoutBoost) { 7251 final ActivityRecord top = mRootActivityContainer.getTopResumedActivity(); 7252 return top != null ? top.app : null; 7253 } 7254 } 7255 7256 @HotPath(caller = HotPath.OOM_ADJUSTMENT) 7257 @Override rankTaskLayersIfNeeded()7258 public void rankTaskLayersIfNeeded() { 7259 synchronized (mGlobalLockWithoutBoost) { 7260 if (mRootActivityContainer != null) { 7261 mRootActivityContainer.rankTaskLayersIfNeeded(); 7262 } 7263 } 7264 } 7265 7266 @Override scheduleDestroyAllActivities(String reason)7267 public void scheduleDestroyAllActivities(String reason) { 7268 synchronized (mGlobalLock) { 7269 mRootActivityContainer.scheduleDestroyAllActivities(null, reason); 7270 } 7271 } 7272 7273 @Override removeUser(int userId)7274 public void removeUser(int userId) { 7275 synchronized (mGlobalLock) { 7276 mRootActivityContainer.removeUser(userId); 7277 } 7278 } 7279 7280 @Override switchUser(int userId, UserState userState)7281 public boolean switchUser(int userId, UserState userState) { 7282 synchronized (mGlobalLock) { 7283 return mRootActivityContainer.switchUser(userId, userState); 7284 } 7285 } 7286 7287 @Override onHandleAppCrash(WindowProcessController wpc)7288 public void onHandleAppCrash(WindowProcessController wpc) { 7289 synchronized (mGlobalLock) { 7290 mRootActivityContainer.handleAppCrash(wpc); 7291 } 7292 } 7293 7294 @Override finishTopCrashedActivities(WindowProcessController crashedApp, String reason)7295 public int finishTopCrashedActivities(WindowProcessController crashedApp, String reason) { 7296 synchronized (mGlobalLock) { 7297 return mRootActivityContainer.finishTopCrashedActivities(crashedApp, reason); 7298 } 7299 } 7300 7301 @HotPath(caller = HotPath.OOM_ADJUSTMENT) 7302 @Override onUidActive(int uid, int procState)7303 public void onUidActive(int uid, int procState) { 7304 mActiveUids.onUidActive(uid, procState); 7305 } 7306 7307 @HotPath(caller = HotPath.OOM_ADJUSTMENT) 7308 @Override onUidInactive(int uid)7309 public void onUidInactive(int uid) { 7310 mActiveUids.onUidInactive(uid); 7311 } 7312 7313 @HotPath(caller = HotPath.OOM_ADJUSTMENT) 7314 @Override onActiveUidsCleared()7315 public void onActiveUidsCleared() { 7316 mActiveUids.onActiveUidsCleared(); 7317 } 7318 7319 @HotPath(caller = HotPath.OOM_ADJUSTMENT) 7320 @Override onUidProcStateChanged(int uid, int procState)7321 public void onUidProcStateChanged(int uid, int procState) { 7322 mActiveUids.onUidProcStateChanged(uid, procState); 7323 } 7324 7325 @Override onUidAddedToPendingTempWhitelist(int uid, String tag)7326 public void onUidAddedToPendingTempWhitelist(int uid, String tag) { 7327 synchronized (mGlobalLockWithoutBoost) { 7328 mPendingTempWhitelist.put(uid, tag); 7329 } 7330 } 7331 7332 @Override onUidRemovedFromPendingTempWhitelist(int uid)7333 public void onUidRemovedFromPendingTempWhitelist(int uid) { 7334 synchronized (mGlobalLockWithoutBoost) { 7335 mPendingTempWhitelist.remove(uid); 7336 } 7337 } 7338 7339 @Override handleAppCrashInActivityController(String processName, int pid, String shortMsg, String longMsg, long timeMillis, String stackTrace, Runnable killCrashingAppCallback)7340 public boolean handleAppCrashInActivityController(String processName, int pid, 7341 String shortMsg, String longMsg, long timeMillis, String stackTrace, 7342 Runnable killCrashingAppCallback) { 7343 synchronized (mGlobalLock) { 7344 if (mController == null) { 7345 return false; 7346 } 7347 7348 try { 7349 if (!mController.appCrashed(processName, pid, shortMsg, longMsg, timeMillis, 7350 stackTrace)) { 7351 killCrashingAppCallback.run(); 7352 return true; 7353 } 7354 } catch (RemoteException e) { 7355 mController = null; 7356 Watchdog.getInstance().setActivityController(null); 7357 } 7358 return false; 7359 } 7360 } 7361 7362 @Override removeRecentTasksByPackageName(String packageName, int userId)7363 public void removeRecentTasksByPackageName(String packageName, int userId) { 7364 synchronized (mGlobalLock) { 7365 mRecentTasks.removeTasksByPackageName(packageName, userId); 7366 } 7367 } 7368 7369 @Override cleanupRecentTasksForUser(int userId)7370 public void cleanupRecentTasksForUser(int userId) { 7371 synchronized (mGlobalLock) { 7372 mRecentTasks.cleanupLocked(userId); 7373 } 7374 } 7375 7376 @Override loadRecentTasksForUser(int userId)7377 public void loadRecentTasksForUser(int userId) { 7378 synchronized (mGlobalLock) { 7379 mRecentTasks.loadUserRecentsLocked(userId); 7380 } 7381 } 7382 7383 @Override onPackagesSuspendedChanged(String[] packages, boolean suspended, int userId)7384 public void onPackagesSuspendedChanged(String[] packages, boolean suspended, int userId) { 7385 synchronized (mGlobalLock) { 7386 mRecentTasks.onPackagesSuspendedChanged(packages, suspended, userId); 7387 } 7388 } 7389 7390 @Override flushRecentTasks()7391 public void flushRecentTasks() { 7392 mRecentTasks.flush(); 7393 } 7394 7395 @Override getHomeProcess()7396 public WindowProcessController getHomeProcess() { 7397 synchronized (mGlobalLock) { 7398 return mHomeProcess; 7399 } 7400 } 7401 7402 @Override getPreviousProcess()7403 public WindowProcessController getPreviousProcess() { 7404 synchronized (mGlobalLock) { 7405 return mPreviousProcess; 7406 } 7407 } 7408 7409 @Override clearLockedTasks(String reason)7410 public void clearLockedTasks(String reason) { 7411 synchronized (mGlobalLock) { 7412 getLockTaskController().clearLockedTasks(reason); 7413 } 7414 } 7415 7416 @Override updateUserConfiguration()7417 public void updateUserConfiguration() { 7418 synchronized (mGlobalLock) { 7419 final Configuration configuration = new Configuration(getGlobalConfiguration()); 7420 final int currentUserId = mAmInternal.getCurrentUserId(); 7421 Settings.System.adjustConfigurationForUser(mContext.getContentResolver(), 7422 configuration, currentUserId, Settings.System.canWrite(mContext)); 7423 updateConfigurationLocked(configuration, null /* starting */, 7424 false /* initLocale */, false /* persistent */, currentUserId, 7425 false /* deferResume */); 7426 } 7427 } 7428 7429 @Override canShowErrorDialogs()7430 public boolean canShowErrorDialogs() { 7431 synchronized (mGlobalLock) { 7432 return mShowDialogs && !mSleeping && !mShuttingDown 7433 && !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY) 7434 && !hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS, 7435 mAmInternal.getCurrentUserId()) 7436 && !(UserManager.isDeviceInDemoMode(mContext) 7437 && mAmInternal.getCurrentUser().isDemo()); 7438 } 7439 } 7440 7441 @Override setProfileApp(String profileApp)7442 public void setProfileApp(String profileApp) { 7443 synchronized (mGlobalLock) { 7444 mProfileApp = profileApp; 7445 } 7446 } 7447 7448 @Override setProfileProc(WindowProcessController wpc)7449 public void setProfileProc(WindowProcessController wpc) { 7450 synchronized (mGlobalLock) { 7451 mProfileProc = wpc; 7452 } 7453 } 7454 7455 @Override setProfilerInfo(ProfilerInfo profilerInfo)7456 public void setProfilerInfo(ProfilerInfo profilerInfo) { 7457 synchronized (mGlobalLock) { 7458 mProfilerInfo = profilerInfo; 7459 } 7460 } 7461 7462 @Override getLaunchObserverRegistry()7463 public ActivityMetricsLaunchObserverRegistry getLaunchObserverRegistry() { 7464 synchronized (mGlobalLock) { 7465 return mStackSupervisor.getActivityMetricsLogger().getLaunchObserverRegistry(); 7466 } 7467 } 7468 7469 @Override getTaskSnapshotNoRestore(int taskId, boolean reducedResolution)7470 public ActivityManager.TaskSnapshot getTaskSnapshotNoRestore(int taskId, 7471 boolean reducedResolution) { 7472 return ActivityTaskManagerService.this.getTaskSnapshot(taskId, reducedResolution, 7473 false /* restoreFromDisk */); 7474 } 7475 7476 @Override isUidForeground(int uid)7477 public boolean isUidForeground(int uid) { 7478 synchronized (mGlobalLock) { 7479 return ActivityTaskManagerService.this.isUidForeground(uid); 7480 } 7481 } 7482 7483 @Override setDeviceOwnerUid(int uid)7484 public void setDeviceOwnerUid(int uid) { 7485 synchronized (mGlobalLock) { 7486 ActivityTaskManagerService.this.setDeviceOwnerUid(uid); 7487 } 7488 } 7489 7490 @Override setCompanionAppPackages(int userId, Set<String> companionAppPackages)7491 public void setCompanionAppPackages(int userId, Set<String> companionAppPackages) { 7492 // Translate package names into UIDs 7493 final Set<Integer> result = new HashSet<>(); 7494 for (String pkg : companionAppPackages) { 7495 final int uid = getPackageManagerInternalLocked().getPackageUid(pkg, 0, userId); 7496 if (uid >= 0) { 7497 result.add(uid); 7498 } 7499 } 7500 synchronized (mGlobalLock) { 7501 mCompanionAppUidsMap.put(userId, result); 7502 } 7503 } 7504 } 7505 } 7506