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