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