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