blob: 7bacc427feb83f9a17aae681c9655ce7dd5b9821 [file] [log] [blame]
Wale Ogunwale65ebd952018-04-25 15:41:44 -07001/*
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
Wale Ogunwale59507092018-10-29 09:00:30 -070017package com.android.server.wm;
Wale Ogunwale65ebd952018-04-25 15:41:44 -070018
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070019import static android.Manifest.permission.BIND_VOICE_INTERACTION;
20import static android.Manifest.permission.CHANGE_CONFIGURATION;
21import static android.Manifest.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS;
Nicholas Sauer0259e532019-08-30 08:24:55 -070022import static android.Manifest.permission.INTERACT_ACROSS_USERS;
23import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070024import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
Wale Ogunwale65ebd952018-04-25 15:41:44 -070025import static android.Manifest.permission.MANAGE_ACTIVITY_STACKS;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070026import static android.Manifest.permission.READ_FRAME_BUFFER;
27import static android.Manifest.permission.REMOVE_TASKS;
28import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
Wale Ogunwalea6191b42018-05-09 07:41:32 -070029import static android.Manifest.permission.STOP_APP_SWITCHES;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070030import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
Jonathan Scott92335342019-12-17 14:46:26 +000031import static android.app.ActivityManagerInternal.ALLOW_NON_FULL;
Yunfan Chen79b96062018-10-17 12:45:23 -070032import static android.app.ActivityTaskManager.INVALID_TASK_ID;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070033import static android.app.ActivityTaskManager.RESIZE_MODE_PRESERVE_WINDOW;
Wale Ogunwale65ebd952018-04-25 15:41:44 -070034import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070035import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
36import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
Wale Ogunwale65ebd952018-04-25 15:41:44 -070037import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
38import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
Evan Rosky73a7fe92019-11-18 18:28:01 -080039import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECONDARY;
Wale Ogunwale65ebd952018-04-25 15:41:44 -070040import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
Wale Ogunwale31913b52018-10-13 08:29:31 -070041import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070042import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
Wale Ogunwale214f3482018-10-04 11:00:47 -070043import static android.content.pm.ApplicationInfo.FLAG_FACTORY_TEST;
Wale Ogunwale342fbe92018-10-09 08:44:10 -070044import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED;
Wale Ogunwalea6191b42018-05-09 07:41:32 -070045import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS;
46import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
Wale Ogunwalea6191b42018-05-09 07:41:32 -070047import static android.content.pm.PackageManager.FEATURE_PICTURE_IN_PICTURE;
Wale Ogunwaled0412b32018-05-08 09:25:50 -070048import static android.content.pm.PackageManager.PERMISSION_GRANTED;
Wale Ogunwale214f3482018-10-04 11:00:47 -070049import static android.os.FactoryTest.FACTORY_TEST_HIGH_LEVEL;
50import static android.os.FactoryTest.FACTORY_TEST_LOW_LEVEL;
51import static android.os.FactoryTest.FACTORY_TEST_OFF;
Wale Ogunwale31913b52018-10-13 08:29:31 -070052import static android.os.Process.FIRST_APPLICATION_UID;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070053import static android.os.Process.SYSTEM_UID;
Riddle Hsu2ca561b2019-10-08 21:58:58 +080054import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
Wale Ogunwalea6191b42018-05-09 07:41:32 -070055import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT;
Shivam Agrawal780b5bb2019-07-17 10:17:11 -070056import static android.provider.Settings.Global.DEVELOPMENT_ENABLE_SIZECOMPAT_FREEFORM;
Wale Ogunwalea6191b42018-05-09 07:41:32 -070057import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES;
58import static android.provider.Settings.Global.DEVELOPMENT_FORCE_RTL;
Evan Rosky4505b352018-09-06 11:20:40 -070059import static android.provider.Settings.Global.HIDE_ERROR_DIALOGS;
60import static android.provider.Settings.System.FONT_SCALE;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070061import static android.service.voice.VoiceInteractionSession.SHOW_SOURCE_APPLICATION;
Alison Cichowlas3e340502018-08-07 17:15:01 -040062import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -070063import static android.view.Display.DEFAULT_DISPLAY;
64import static android.view.Display.INVALID_DISPLAY;
Wale Ogunwale6767eae2018-05-03 15:52:51 -070065import static android.view.WindowManager.TRANSIT_NONE;
Evan Rosky4505b352018-09-06 11:20:40 -070066
Yunfan Chen79b96062018-10-17 12:45:23 -070067import static com.android.server.am.ActivityManagerService.ANR_TRACE_DIR;
68import static com.android.server.am.ActivityManagerService.MY_PID;
69import static com.android.server.am.ActivityManagerService.STOCK_PM_FLAGS;
70import static com.android.server.am.ActivityManagerService.dumpStackTraces;
Wale Ogunwalef342f062020-01-27 07:34:13 -080071import static com.android.server.am.ActivityManagerServiceDumpActivitiesProto.ROOT_WINDOW_CONTAINER;
Wale Ogunwale31913b52018-10-13 08:29:31 -070072import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CONFIG_WILL_CHANGE;
73import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CONTROLLER;
74import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.CURRENT_TRACKER;
75import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.Controller.IS_A_MONKEY;
76import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.GLOBAL_CONFIGURATION;
77import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.GOING_TO_SLEEP;
78import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HEAVY_WEIGHT_PROC;
79import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.HOME_PROC;
80import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.LAUNCHING_ACTIVITY;
81import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC;
Yunfan Chen279f5582018-12-12 15:24:50 -080082import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.PREVIOUS_PROC_VISIBLE_TIME_MS;
Wale Ogunwale31913b52018-10-13 08:29:31 -070083import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.SCREEN_COMPAT_PACKAGES;
Yunfan Chen279f5582018-12-12 15:24:50 -080084import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.MODE;
85import static com.android.server.am.ActivityManagerServiceDumpProcessesProto.ScreenCompatPackage.PACKAGE;
Jeff Changd136e772019-11-05 20:33:52 +080086import static com.android.server.am.EventLogTags.writeBootProgressEnableScreen;
87import static com.android.server.am.EventLogTags.writeConfigurationChanged;
Andrii Kulianf49a58c2019-08-14 17:34:27 -070088import static com.android.server.wm.ActivityStack.ActivityState.DESTROYED;
89import static com.android.server.wm.ActivityStack.ActivityState.DESTROYING;
Wale Ogunwale59507092018-10-29 09:00:30 -070090import static com.android.server.wm.ActivityStackSupervisor.DEFER_RESUME;
Wale Ogunwale59507092018-10-29 09:00:30 -070091import static com.android.server.wm.ActivityStackSupervisor.ON_TOP;
92import static com.android.server.wm.ActivityStackSupervisor.PRESERVE_WINDOWS;
93import static com.android.server.wm.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
94import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL;
95import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION;
96import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_FOCUS;
97import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_IMMERSIVE;
98import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_LOCKTASK;
99import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_STACK;
100import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_SWITCH;
101import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_TASKS;
102import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY;
103import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION;
104import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_FOCUS;
105import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_IMMERSIVE;
106import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK;
107import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_STACK;
108import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH;
109import static com.android.server.wm.ActivityTaskManagerDebugConfig.POSTFIX_VISIBILITY;
110import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_ATM;
111import static com.android.server.wm.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME;
Evan Rosky4505b352018-09-06 11:20:40 -0700112import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_CONTENT;
113import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_DATA;
114import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_RECEIVER_EXTRAS;
115import static com.android.server.wm.ActivityTaskManagerInternal.ASSIST_KEY_STRUCTURE;
wilsonshihe7903ea2018-09-26 16:17:59 +0800116import static com.android.server.wm.ActivityTaskManagerService.H.REPORT_TIME_TRACKER_MSG;
117import static com.android.server.wm.ActivityTaskManagerService.UiHandler.DISMISS_DIALOG_UI_MSG;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700118import static com.android.server.wm.RecentsAnimationController.REORDER_KEEP_IN_PLACE;
119import static com.android.server.wm.RecentsAnimationController.REORDER_MOVE_TO_ORIGINAL_POSITION;
Louis Chang149d5c82019-12-30 09:47:39 +0800120import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_ONLY;
121import static com.android.server.wm.RootWindowContainer.MATCH_TASK_IN_STACKS_OR_RECENT_TASKS;
Louis Changcdec0802019-11-11 11:45:07 +0800122import static com.android.server.wm.Task.LOCK_TASK_AUTH_DONT_LOCK;
123import static com.android.server.wm.Task.REPARENT_KEEP_STACK_AT_FRONT;
124import static com.android.server.wm.Task.REPARENT_LEAVE_STACK_IN_PLACE;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700125
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700126import android.Manifest;
Riddle Hsua0022cd2019-09-09 21:12:41 +0800127import android.annotation.IntDef;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700128import android.annotation.NonNull;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700129import android.annotation.Nullable;
130import android.annotation.UserIdInt;
131import android.app.Activity;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700132import android.app.ActivityManager;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700133import android.app.ActivityManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700134import android.app.ActivityOptions;
135import android.app.ActivityTaskManager;
Wale Ogunwalef6733932018-06-27 05:14:34 -0700136import android.app.ActivityThread;
137import android.app.AlertDialog;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700138import android.app.AppGlobals;
Michal Karpinski15486842019-04-25 17:33:42 +0100139import android.app.AppOpsManager;
Evan Rosky4505b352018-09-06 11:20:40 -0700140import android.app.Dialog;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700141import android.app.IActivityController;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700142import android.app.IActivityTaskManager;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700143import android.app.IApplicationThread;
144import android.app.IAssistDataReceiver;
Wale Ogunwale53783742018-09-16 10:21:51 -0700145import android.app.INotificationManager;
Mark Renouf446251d2019-04-26 10:22:41 -0400146import android.app.IRequestFinishCallback;
Evan Rosky0037e5f2019-11-05 10:26:24 -0800147import android.app.ITaskOrganizerController;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700148import android.app.ITaskStackListener;
Wale Ogunwale53783742018-09-16 10:21:51 -0700149import android.app.Notification;
150import android.app.NotificationManager;
151import android.app.PendingIntent;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700152import android.app.PictureInPictureParams;
153import android.app.ProfilerInfo;
154import android.app.RemoteAction;
155import android.app.WaitResult;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700156import android.app.WindowConfiguration;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700157import android.app.admin.DevicePolicyCache;
158import android.app.assist.AssistContent;
159import android.app.assist.AssistStructure;
jorgegil@google.com06bc3232019-10-31 14:51:22 -0700160import android.app.servertransaction.ClientTransaction;
161import android.app.servertransaction.EnterPipRequestedItem;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700162import android.app.usage.UsageStatsManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700163import android.content.ActivityNotFoundException;
164import android.content.ComponentName;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700165import android.content.ContentResolver;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700166import android.content.Context;
Evan Rosky4505b352018-09-06 11:20:40 -0700167import android.content.DialogInterface;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700168import android.content.IIntentSender;
169import android.content.Intent;
170import android.content.pm.ActivityInfo;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700171import android.content.pm.ApplicationInfo;
Yunfan Chen75157d72018-07-27 14:47:21 +0900172import android.content.pm.ConfigurationInfo;
Evan Rosky4505b352018-09-06 11:20:40 -0700173import android.content.pm.IPackageManager;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700174import android.content.pm.PackageManager;
Evan Rosky4505b352018-09-06 11:20:40 -0700175import android.content.pm.PackageManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700176import android.content.pm.ParceledListSlice;
177import android.content.pm.ResolveInfo;
Wale Ogunwale53783742018-09-16 10:21:51 -0700178import android.content.res.CompatibilityInfo;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700179import android.content.res.Configuration;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700180import android.content.res.Resources;
Evan Rosky4505b352018-09-06 11:20:40 -0700181import android.database.ContentObserver;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700182import android.graphics.Bitmap;
183import android.graphics.Point;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700184import android.graphics.Rect;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700185import android.metrics.LogMaker;
186import android.net.Uri;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700187import android.os.Binder;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700188import android.os.Build;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700189import android.os.Bundle;
Wale Ogunwale214f3482018-10-04 11:00:47 -0700190import android.os.FactoryTest;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700191import android.os.FileUtils;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700192import android.os.Handler;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700193import android.os.IBinder;
Evan Rosky4505b352018-09-06 11:20:40 -0700194import android.os.IUserManager;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700195import android.os.LocaleList;
Riddle Hsud93a6c42018-11-29 21:50:06 +0800196import android.os.Looper;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700197import android.os.Message;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700198import android.os.PersistableBundle;
Evan Rosky4505b352018-09-06 11:20:40 -0700199import android.os.PowerManager;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700200import android.os.PowerManagerInternal;
Marvin Ramin830d4e32019-03-12 13:16:58 +0100201import android.os.Process;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700202import android.os.RemoteException;
Evan Rosky4505b352018-09-06 11:20:40 -0700203import android.os.ServiceManager;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700204import android.os.StrictMode;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700205import android.os.SystemClock;
206import android.os.SystemProperties;
Evan Rosky4505b352018-09-06 11:20:40 -0700207import android.os.Trace;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700208import android.os.UpdateLock;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700209import android.os.UserHandle;
Evan Rosky4505b352018-09-06 11:20:40 -0700210import android.os.UserManager;
211import android.os.WorkSource;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700212import android.os.storage.IStorageManager;
213import android.os.storage.StorageManager;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700214import android.provider.Settings;
Galia Peycheva6861e912019-08-21 10:20:23 +0200215import android.service.dreams.DreamActivity;
Galia Peycheva52e89222020-02-18 23:41:43 +0100216import android.service.dreams.DreamManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700217import android.service.voice.IVoiceInteractionSession;
218import android.service.voice.VoiceInteractionManagerInternal;
Kiyoung Kim0fe161d2018-12-20 18:26:10 +0900219import android.sysprop.DisplayProperties;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700220import android.telecom.TelecomManager;
221import android.text.TextUtils;
Neil Fuller97746812019-08-19 14:20:50 +0100222import android.text.format.TimeMigrationUtils;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700223import android.util.ArrayMap;
Nicholas Sauer3f9249f2019-09-10 20:23:41 -0700224import android.util.ArraySet;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700225import android.util.Log;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700226import android.util.Slog;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700227import android.util.SparseArray;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700228import android.util.TimeUtils;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700229import android.util.proto.ProtoOutputStream;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700230import android.view.IRecentsAnimationRunner;
231import android.view.RemoteAnimationAdapter;
232import android.view.RemoteAnimationDefinition;
Evan Roskyaf9f27c2020-02-18 18:58:35 +0000233import android.view.WindowContainerTransaction;
Evan Rosky4505b352018-09-06 11:20:40 -0700234import android.view.WindowManager;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700235
Evan Rosky4505b352018-09-06 11:20:40 -0700236import com.android.internal.R;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700237import com.android.internal.annotations.VisibleForTesting;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700238import com.android.internal.app.AssistUtils;
239import com.android.internal.app.IVoiceInteractor;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700240import com.android.internal.app.ProcessMap;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700241import com.android.internal.logging.MetricsLogger;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700242import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
Wale Ogunwale53783742018-09-16 10:21:51 -0700243import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
244import com.android.internal.notification.SystemNotificationChannels;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700245import com.android.internal.os.TransferPipe;
Evan Rosky4505b352018-09-06 11:20:40 -0700246import com.android.internal.os.logging.MetricsLoggerWrapper;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700247import com.android.internal.policy.IKeyguardDismissCallback;
248import com.android.internal.policy.KeyguardDismissCallback;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700249import com.android.internal.util.ArrayUtils;
250import com.android.internal.util.FastPrintWriter;
Muhammad Qureshi759f92f2020-01-28 10:41:55 -0800251import com.android.internal.util.FrameworkStatsLog;
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800252import com.android.internal.util.function.pooled.PooledConsumer;
253import com.android.internal.util.function.pooled.PooledFunction;
Wale Ogunwale53783742018-09-16 10:21:51 -0700254import com.android.internal.util.function.pooled.PooledLambda;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700255import com.android.server.AttributeCache;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700256import com.android.server.LocalServices;
257import com.android.server.SystemService;
Evan Rosky4505b352018-09-06 11:20:40 -0700258import com.android.server.SystemServiceManager;
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800259import com.android.server.UiThread;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700260import com.android.server.Watchdog;
Wale Ogunwale59507092018-10-29 09:00:30 -0700261import com.android.server.am.ActivityManagerService;
Wale Ogunwale59507092018-10-29 09:00:30 -0700262import com.android.server.am.ActivityManagerServiceDumpProcessesProto;
263import com.android.server.am.AppTimeTracker;
264import com.android.server.am.BaseErrorDialog;
Wale Ogunwale59507092018-10-29 09:00:30 -0700265import com.android.server.am.PendingIntentController;
266import com.android.server.am.PendingIntentRecord;
267import com.android.server.am.UserState;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700268import com.android.server.firewall.IntentFirewall;
Tarandeep Singh07b318b2019-07-17 11:12:04 -0700269import com.android.server.inputmethod.InputMethodSystemProperty;
Evan Rosky4505b352018-09-06 11:20:40 -0700270import com.android.server.pm.UserManagerService;
Hai Zhangf4da9be2019-05-01 13:46:06 +0800271import com.android.server.policy.PermissionPolicyInternal;
Evan Rosky4505b352018-09-06 11:20:40 -0700272import com.android.server.uri.UriGrantsManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700273import com.android.server.vr.VrManagerInternal;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700274
Wale Ogunwale31913b52018-10-13 08:29:31 -0700275import java.io.BufferedReader;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700276import java.io.File;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700277import java.io.FileDescriptor;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700278import java.io.FileOutputStream;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700279import java.io.FileReader;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700280import java.io.IOException;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700281import java.io.PrintWriter;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700282import java.io.StringWriter;
Riddle Hsua0536432019-02-16 00:38:59 +0800283import java.lang.annotation.ElementType;
284import java.lang.annotation.Retention;
285import java.lang.annotation.RetentionPolicy;
286import java.lang.annotation.Target;
Wale Ogunwaleee6eca12018-09-19 20:37:53 -0700287import java.lang.ref.WeakReference;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700288import java.text.DateFormat;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700289import java.util.ArrayList;
Wale Ogunwale27c48ae2018-10-25 19:01:01 -0700290import java.util.Arrays;
Jeff Sharkey8b0cff72020-03-09 15:49:01 -0600291import java.util.Collection;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700292import java.util.Date;
Alison Cichowlas3e340502018-08-07 17:15:01 -0400293import java.util.HashMap;
Wale Ogunwaleee6eca12018-09-19 20:37:53 -0700294import java.util.HashSet;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700295import java.util.List;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700296import java.util.Locale;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700297import java.util.Map;
Daulet Zhanguzinc6c641f2020-01-02 17:18:30 +0000298import java.util.Objects;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700299import java.util.Set;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700300
301/**
302 * System service for managing activities and their containers (task, stacks, displays,... ).
303 *
304 * {@hide}
305 */
306public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
Wale Ogunwale98875612018-10-12 07:53:02 -0700307 private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskManagerService" : TAG_ATM;
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800308 static final String TAG_STACK = TAG + POSTFIX_STACK;
Wale Ogunwale196db712019-12-27 15:35:39 +0000309 static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700310 private static final String TAG_IMMERSIVE = TAG + POSTFIX_IMMERSIVE;
311 private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
312 private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;
313 private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700314 private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700315
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700316 // How long we wait until we timeout on key dispatching.
Wale Ogunwale51cc98a2018-10-15 10:41:05 -0700317 public static final int KEY_DISPATCHING_TIMEOUT_MS = 5 * 1000;
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700318 // How long we wait until we timeout on key dispatching during instrumentation.
Wale Ogunwale51cc98a2018-10-15 10:41:05 -0700319 static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT_MS = 60 * 1000;
Michal Karpinskifc6872e2019-05-21 15:18:44 +0100320 // How long we permit background activity starts after an activity in the process
321 // started or finished.
322 static final long ACTIVITY_BG_START_GRACE_PERIOD_MS = 10 * 1000;
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700323
Wale Ogunwale98875612018-10-12 07:53:02 -0700324 /** Used to indicate that an app transition should be animated. */
325 static final boolean ANIMATE = true;
326
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700327 /** Hardware-reported OpenGLES version. */
328 final int GL_ES_VERSION;
329
Wale Ogunwale31913b52018-10-13 08:29:31 -0700330 public static final String DUMP_ACTIVITIES_CMD = "activities" ;
331 public static final String DUMP_ACTIVITIES_SHORT_CMD = "a" ;
332 public static final String DUMP_LASTANR_CMD = "lastanr" ;
333 public static final String DUMP_LASTANR_TRACES_CMD = "lastanr-traces" ;
334 public static final String DUMP_STARTER_CMD = "starter" ;
335 public static final String DUMP_CONTAINERS_CMD = "containers" ;
336 public static final String DUMP_RECENTS_CMD = "recents" ;
337 public static final String DUMP_RECENTS_SHORT_CMD = "r" ;
338
Wale Ogunwale64258362018-10-16 15:13:37 -0700339 /** This activity is not being relaunched, or being relaunched for a non-resize reason. */
340 public static final int RELAUNCH_REASON_NONE = 0;
341 /** This activity is being relaunched due to windowing mode change. */
342 public static final int RELAUNCH_REASON_WINDOWING_MODE_RESIZE = 1;
343 /** This activity is being relaunched due to a free-resize operation. */
344 public static final int RELAUNCH_REASON_FREE_RESIZE = 2;
345
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700346 Context mContext;
Wale Ogunwale64258362018-10-16 15:13:37 -0700347
Wale Ogunwalef6733932018-06-27 05:14:34 -0700348 /**
349 * This Context is themable and meant for UI display (AlertDialogs, etc.). The theme can
350 * change at runtime. Use mContext for non-UI purposes.
351 */
352 final Context mUiContext;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700353 final ActivityThread mSystemThread;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700354 H mH;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700355 UiHandler mUiHandler;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700356 ActivityManagerInternal mAmInternal;
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -0700357 UriGrantsManagerInternal mUgmInternal;
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700358 private PackageManagerInternal mPmInternal;
Darryl L Johnsona0982222020-02-18 18:21:51 -0800359 /** The cached sys ui service component name from package manager. */
360 private ComponentName mSysUiServiceComponent;
Hai Zhangf4da9be2019-05-01 13:46:06 +0800361 private PermissionPolicyInternal mPermissionPolicyInternal;
Wale Ogunwaleb73f3962018-11-20 07:58:22 -0800362 @VisibleForTesting
363 final ActivityTaskManagerInternal mInternal;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700364 PowerManagerInternal mPowerManagerInternal;
365 private UsageStatsManagerInternal mUsageStatsInternal;
366
Wale Ogunwaleee6eca12018-09-19 20:37:53 -0700367 PendingIntentController mPendingIntentController;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700368 IntentFirewall mIntentFirewall;
369
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700370 /* Global service lock used by the package the owns this service. */
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800371 final WindowManagerGlobalLock mGlobalLock = new WindowManagerGlobalLock();
Riddle Hsud7088f82019-01-30 13:04:50 +0800372 /**
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700373 * It is the same instance as {@link #mGlobalLock}, just declared as a type that the
Riddle Hsud7088f82019-01-30 13:04:50 +0800374 * locked-region-code-injection does't recognize it. It is used to skip wrapping priority
375 * booster for places that are already in the scope of another booster (e.g. computing oom-adj).
376 *
377 * @see WindowManagerThreadPriorityBooster
378 */
379 final Object mGlobalLockWithoutBoost = mGlobalLock;
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700380 ActivityStackSupervisor mStackSupervisor;
Louis Chang149d5c82019-12-30 09:47:39 +0800381 RootWindowContainer mRootWindowContainer;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700382 WindowManagerService mWindowManager;
Wale Ogunwalef6733932018-06-27 05:14:34 -0700383 private UserManagerService mUserManager;
Philip P. Moltmannee295092020-02-10 08:46:26 -0800384 private AppOpsManager mAppOpsManager;
Wale Ogunwalebff2df42018-10-18 17:09:19 -0700385 /** All active uids in the system. */
Riddle Hsua0536432019-02-16 00:38:59 +0800386 private final MirrorActiveUids mActiveUids = new MirrorActiveUids();
Wale Ogunwale9de19442018-10-18 19:05:03 -0700387 private final SparseArray<String> mPendingTempWhitelist = new SparseArray<>();
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700388 /** All processes currently running that might have a window organized by name. */
389 final ProcessMap<WindowProcessController> mProcessNames = new ProcessMap<>();
Michal Karpinski2e0aad22019-04-12 16:22:55 +0100390 /** All processes we currently have running mapped by pid and uid */
391 final WindowProcessControllerMap mProcessMap = new WindowProcessControllerMap();
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700392 /** This is the process holding what we currently consider to be the "home" activity. */
393 WindowProcessController mHomeProcess;
Wale Ogunwale53783742018-09-16 10:21:51 -0700394 /** The currently running heavy-weight process, if any. */
395 WindowProcessController mHeavyWeightProcess = null;
Wale Ogunwale214f3482018-10-04 11:00:47 -0700396 boolean mHasHeavyWeightFeature;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700397 /**
398 * This is the process holding the activity the user last visited that is in a different process
399 * from the one they are currently in.
400 */
401 WindowProcessController mPreviousProcess;
402 /** The time at which the previous process was last visible. */
403 long mPreviousProcessVisibleTime;
404
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700405 /** List of intents that were used to start the most recent tasks. */
406 private RecentTasks mRecentTasks;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700407 /** State of external calls telling us if the device is awake or asleep. */
408 private boolean mKeyguardShown = false;
409
410 // Wrapper around VoiceInteractionServiceManager
411 private AssistUtils mAssistUtils;
412
413 // VoiceInteraction session ID that changes for each new request except when
414 // being called for multi-window assist in a single session.
415 private int mViSessionId = 1000;
416
417 // How long to wait in getAssistContextExtras for the activity and foreground services
418 // to respond with the result.
419 private static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500;
420
421 // How long top wait when going through the modern assist (which doesn't need to block
422 // on getting this result before starting to launch its UI).
423 private static final int PENDING_ASSIST_EXTRAS_LONG_TIMEOUT = 2000;
424
425 // How long to wait in getAutofillAssistStructure() for the activity to respond with the result.
426 private static final int PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT = 2000;
427
Alison Cichowlas3e340502018-08-07 17:15:01 -0400428 // Permission tokens are used to temporarily granted a trusted app the ability to call
429 // #startActivityAsCaller. A client is expected to dump its token after this time has elapsed,
430 // showing any appropriate error messages to the user.
431 private static final long START_AS_CALLER_TOKEN_TIMEOUT =
432 10 * MINUTE_IN_MILLIS;
433
434 // How long before the service actually expires a token. This is slightly longer than
435 // START_AS_CALLER_TOKEN_TIMEOUT, to provide a buffer so clients will rarely encounter the
436 // expiration exception.
437 private static final long START_AS_CALLER_TOKEN_TIMEOUT_IMPL =
438 START_AS_CALLER_TOKEN_TIMEOUT + 2 * 1000;
439
440 // How long the service will remember expired tokens, for the purpose of providing error
441 // messaging when a client uses an expired token.
442 private static final long START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT =
443 START_AS_CALLER_TOKEN_TIMEOUT_IMPL + 20 * MINUTE_IN_MILLIS;
444
445 // Activity tokens of system activities that are delegating their call to
446 // #startActivityByCaller, keyed by the permissionToken granted to the delegate.
447 final HashMap<IBinder, IBinder> mStartActivitySources = new HashMap<>();
448
449 // Permission tokens that have expired, but we remember for error reporting.
450 final ArrayList<IBinder> mExpiredStartAsCallerTokens = new ArrayList<>();
451
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700452 private final ArrayList<PendingAssistExtras> mPendingAssistExtras = new ArrayList<>();
453
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700454 // Keeps track of the active voice interaction service component, notified from
455 // VoiceInteractionManagerService
456 ComponentName mActiveVoiceInteractionServiceComponent;
457
Michal Karpinskida34cd42019-04-02 19:46:52 +0100458 // A map userId and all its companion app uids
459 private final Map<Integer, Set<Integer>> mCompanionAppUidsMap = new ArrayMap<>();
Ricky Wai2452e2d2019-03-18 19:19:08 +0000460
Wale Ogunwalee2172292018-10-25 10:11:10 -0700461 VrController mVrController;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700462 KeyguardController mKeyguardController;
463 private final ClientLifecycleManager mLifecycleManager;
464 private TaskChangeNotificationController mTaskChangeNotificationController;
Wale Ogunwaled95c06b2018-05-08 10:35:38 -0700465 /** The controller for all operations related to locktask. */
466 private LockTaskController mLockTaskController;
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -0700467 private ActivityStartController mActivityStartController;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700468
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700469 boolean mSuppressResizeConfigChanges;
470
Shivam Agrawal1d3db652019-07-01 15:26:11 -0700471 final UpdateConfigurationResult mTmpUpdateConfigurationResult =
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700472 new UpdateConfigurationResult();
473
474 static final class UpdateConfigurationResult {
475 // Configuration changes that were updated.
476 int changes;
477 // If the activity was relaunched to match the new configuration.
478 boolean activityRelaunched;
479
480 void reset() {
481 changes = 0;
482 activityRelaunched = false;
483 }
484 }
485
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700486 /** Current sequencing integer of the configuration, for skipping old configurations. */
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700487 private int mConfigurationSeq;
488 // To cache the list of supported system locales
489 private String[] mSupportedSystemLocales = null;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700490
491 /**
492 * Temp object used when global and/or display override configuration is updated. It is also
493 * sent to outer world instead of {@link #getGlobalConfiguration} because we don't trust
494 * anyone...
495 */
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700496 private Configuration mTempConfig = new Configuration();
497
Wale Ogunwalef6733932018-06-27 05:14:34 -0700498 /** Temporary to avoid allocations. */
499 final StringBuilder mStringBuilder = new StringBuilder(256);
500
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700501 // Amount of time after a call to stopAppSwitches() during which we will
502 // prevent further untrusted switches from happening.
503 private static final long APP_SWITCH_DELAY_TIME = 5 * 1000;
504
505 /**
506 * The time at which we will allow normal application switches again,
507 * after a call to {@link #stopAppSwitches()}.
508 */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700509 private long mAppSwitchesAllowedTime;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700510 /**
511 * This is set to true after the first switch after mAppSwitchesAllowedTime
512 * is set; any switches after that will clear the time.
513 */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700514 private boolean mDidAppSwitch;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700515
Ricky Wai906af482019-06-03 17:25:28 +0100516 /**
517 * Last stop app switches time, apps finished before this time cannot start background activity
518 * even if they are in grace period.
519 */
520 private long mLastStopAppSwitchesTime;
521
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700522 IActivityController mController = null;
523 boolean mControllerIsAMonkey = false;
524
Wale Ogunwale214f3482018-10-04 11:00:47 -0700525 final int mFactoryTest;
526
527 /** Used to control how we initialize the service. */
528 ComponentName mTopComponent;
529 String mTopAction = Intent.ACTION_MAIN;
530 String mTopData;
531
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800532 /** Profiling app information. */
533 String mProfileApp = null;
534 WindowProcessController mProfileProc = null;
535 ProfilerInfo mProfilerInfo = null;
536
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700537 /**
Wale Ogunwale31913b52018-10-13 08:29:31 -0700538 * Dump of the activity state at the time of the last ANR. Cleared after
539 * {@link WindowManagerService#LAST_ANR_LIFETIME_DURATION_MSECS}
540 */
541 String mLastANRState;
542
543 /**
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700544 * Used to retain an update lock when the foreground activity is in
545 * immersive mode.
546 */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700547 private final UpdateLock mUpdateLock = new UpdateLock("immersive");
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700548
549 /**
550 * Packages that are being allowed to perform unrestricted app switches. Mapping is
551 * User -> Type -> uid.
552 */
553 final SparseArray<ArrayMap<String, Integer>> mAllowAppSwitchUids = new SparseArray<>();
554
555 /** The dimensions of the thumbnails in the Recents UI. */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700556 private int mThumbnailWidth;
557 private int mThumbnailHeight;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700558
559 /**
560 * Flag that indicates if multi-window is enabled.
561 *
562 * For any particular form of multi-window to be enabled, generic multi-window must be enabled
563 * in {@link com.android.internal.R.bool#config_supportsMultiWindow} config or
564 * {@link Settings.Global#DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES} development option set.
565 * At least one of the forms of multi-window must be enabled in order for this flag to be
566 * initialized to 'true'.
567 *
568 * @see #mSupportsSplitScreenMultiWindow
569 * @see #mSupportsFreeformWindowManagement
570 * @see #mSupportsPictureInPicture
571 * @see #mSupportsMultiDisplay
572 */
573 boolean mSupportsMultiWindow;
574 boolean mSupportsSplitScreenMultiWindow;
575 boolean mSupportsFreeformWindowManagement;
576 boolean mSupportsPictureInPicture;
577 boolean mSupportsMultiDisplay;
578 boolean mForceResizableActivities;
Shivam Agrawal780b5bb2019-07-17 10:17:11 -0700579 boolean mSizeCompatFreeform;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700580
581 final List<ActivityTaskManagerInternal.ScreenObserver> mScreenObservers = new ArrayList<>();
582
583 // VR Vr2d Display Id.
584 int mVr2dDisplayId = INVALID_DISPLAY;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700585
Wale Ogunwalef6733932018-06-27 05:14:34 -0700586 /**
587 * Set while we are wanting to sleep, to prevent any
588 * activities from being started/resumed.
589 *
590 * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping.
591 *
592 * Currently mSleeping is set to true when transitioning into the sleep state, and remains true
593 * while in the sleep state until there is a pending transition out of sleep, in which case
594 * mSleeping is set to false, and remains false while awake.
595 *
596 * Whether mSleeping can quickly toggled between true/false without the device actually
597 * display changing states is undefined.
598 */
599 private boolean mSleeping = false;
600
601 /**
602 * The process state used for processes that are running the top activities.
603 * This changes between TOP and TOP_SLEEPING to following mSleeping.
604 */
605 int mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
606
Riddle Hsua0022cd2019-09-09 21:12:41 +0800607 @Retention(RetentionPolicy.SOURCE)
608 @IntDef({
609 LAYOUT_REASON_CONFIG_CHANGED,
610 LAYOUT_REASON_VISIBILITY_CHANGED,
611 })
612 @interface LayoutReason {}
613 static final int LAYOUT_REASON_CONFIG_CHANGED = 0x1;
614 static final int LAYOUT_REASON_VISIBILITY_CHANGED = 0x2;
615
616 /** The reasons to perform surface placement. */
617 @LayoutReason
618 private int mLayoutReasons;
619
Wale Ogunwalef6733932018-06-27 05:14:34 -0700620 // Whether we should show our dialogs (ANR, crash, etc) or just perform their default action
621 // automatically. Important for devices without direct input devices.
622 private boolean mShowDialogs = true;
623
624 /** Set if we are shutting down the system, similar to sleeping. */
625 boolean mShuttingDown = false;
626
627 /**
628 * We want to hold a wake lock while running a voice interaction session, since
629 * this may happen with the screen off and we need to keep the CPU running to
630 * be able to continue to interact with the user.
631 */
632 PowerManager.WakeLock mVoiceWakeLock;
633
634 /**
635 * Set while we are running a voice interaction. This overrides sleeping while it is active.
636 */
637 IVoiceInteractionSession mRunningVoice;
638
639 /**
640 * The last resumed activity. This is identical to the current resumed activity most
641 * of the time but could be different when we're pausing one activity before we resume
642 * another activity.
643 */
644 ActivityRecord mLastResumedActivity;
645
646 /**
647 * The activity that is currently being traced as the active resumed activity.
648 *
649 * @see #updateResumedAppTrace
650 */
651 private @Nullable ActivityRecord mTracedResumedActivity;
652
653 /** If non-null, we are tracking the time the user spends in the currently focused app. */
654 AppTimeTracker mCurAppTimeTracker;
655
Shivam Agrawal1d3db652019-07-01 15:26:11 -0700656 AppWarnings mAppWarnings;
Wale Ogunwale008163e2018-07-23 23:11:08 -0700657
Wale Ogunwale53783742018-09-16 10:21:51 -0700658 /**
659 * Packages that the user has asked to have run in screen size
660 * compatibility mode instead of filling the screen.
661 */
662 CompatModePackages mCompatModePackages;
663
Wale Ogunwalef6733932018-06-27 05:14:34 -0700664 private FontScaleSettingObserver mFontScaleSettingObserver;
665
Robert Carr8a2f9132019-11-11 15:03:15 -0800666 /**
667 * Stores the registration and state of TaskOrganizers in use.
668 */
Evan Rosky0037e5f2019-11-05 10:26:24 -0800669 TaskOrganizerController mTaskOrganizerController = new TaskOrganizerController(this);
Robert Carr8a2f9132019-11-11 15:03:15 -0800670
Ricky Wai96f5c352019-04-10 18:40:17 +0100671 private int mDeviceOwnerUid = Process.INVALID_UID;
Michal Karpinski4026cae2019-02-12 11:51:47 +0000672
Wale Ogunwalef6733932018-06-27 05:14:34 -0700673 private final class FontScaleSettingObserver extends ContentObserver {
674 private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
675 private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
676
677 public FontScaleSettingObserver() {
678 super(mH);
679 final ContentResolver resolver = mContext.getContentResolver();
680 resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL);
681 resolver.registerContentObserver(mHideErrorDialogsUri, false, this,
682 UserHandle.USER_ALL);
683 }
684
685 @Override
Jeff Sharkey8b0cff72020-03-09 15:49:01 -0600686 public void onChange(boolean selfChange, Collection<Uri> uris, int flags,
Riddle Hsu9c024d12020-03-09 16:10:07 +0800687 @UserIdInt int userId) {
688 for (Uri uri : uris) {
689 if (mFontScaleUri.equals(uri)) {
690 updateFontScaleIfNeeded(userId);
691 } else if (mHideErrorDialogsUri.equals(uri)) {
692 synchronized (mGlobalLock) {
693 updateShouldShowDialogsLocked(getGlobalConfiguration());
694 }
Wale Ogunwalef6733932018-06-27 05:14:34 -0700695 }
696 }
697 }
698 }
699
Riddle Hsua0536432019-02-16 00:38:59 +0800700 /** Indicates that the method may be invoked frequently or is sensitive to performance. */
701 @Target(ElementType.METHOD)
702 @Retention(RetentionPolicy.SOURCE)
703 @interface HotPath {
704 int NONE = 0;
705 int OOM_ADJUSTMENT = 1;
706 int LRU_UPDATE = 2;
707 int PROCESS_CHANGE = 3;
708 int caller() default NONE;
709 }
710
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800711 private final Runnable mUpdateOomAdjRunnable = new Runnable() {
712 @Override
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900713 public void run() {
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800714 mAmInternal.updateOomAdj();
715 }
716 };
717
Charles Chen8d98dd22018-12-26 17:36:54 +0800718 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
719 public ActivityTaskManagerService(Context context) {
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700720 mContext = context;
Wale Ogunwale214f3482018-10-04 11:00:47 -0700721 mFactoryTest = FactoryTest.getMode();
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700722 mSystemThread = ActivityThread.currentActivityThread();
723 mUiContext = mSystemThread.getSystemUiContext();
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700724 mLifecycleManager = new ClientLifecycleManager();
Wale Ogunwaleb73f3962018-11-20 07:58:22 -0800725 mInternal = new LocalService();
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700726 GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", GL_ES_VERSION_UNDEFINED);
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700727 }
728
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700729 public void onSystemReady() {
730 synchronized (mGlobalLock) {
731 mHasHeavyWeightFeature = mContext.getPackageManager().hasSystemFeature(
732 PackageManager.FEATURE_CANT_SAVE_STATE);
733 mAssistUtils = new AssistUtils(mContext);
734 mVrController.onSystemReady();
735 mRecentTasks.onSystemReadyLocked();
Garfield Tan891146c2018-10-09 12:14:00 -0700736 mStackSupervisor.onSystemReady();
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700737 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700738 }
739
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700740 public void onInitPowerManagement() {
741 synchronized (mGlobalLock) {
742 mStackSupervisor.initPowerManagement();
743 final PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
744 mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
745 mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*");
746 mVoiceWakeLock.setReferenceCounted(false);
747 }
Wale Ogunwalef6733932018-06-27 05:14:34 -0700748 }
749
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700750 public void installSystemProviders() {
Wale Ogunwalef6733932018-06-27 05:14:34 -0700751 mFontScaleSettingObserver = new FontScaleSettingObserver();
752 }
753
Wale Ogunwale59507092018-10-29 09:00:30 -0700754 public void retrieveSettings(ContentResolver resolver) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700755 final boolean freeformWindowManagement =
756 mContext.getPackageManager().hasSystemFeature(FEATURE_FREEFORM_WINDOW_MANAGEMENT)
757 || Settings.Global.getInt(
758 resolver, DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
759
760 final boolean supportsMultiWindow = ActivityTaskManager.supportsMultiWindow(mContext);
761 final boolean supportsPictureInPicture = supportsMultiWindow &&
762 mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
763 final boolean supportsSplitScreenMultiWindow =
764 ActivityTaskManager.supportsSplitScreenMultiWindow(mContext);
765 final boolean supportsMultiDisplay = mContext.getPackageManager()
766 .hasSystemFeature(FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700767 final boolean forceRtl = Settings.Global.getInt(resolver, DEVELOPMENT_FORCE_RTL, 0) != 0;
768 final boolean forceResizable = Settings.Global.getInt(
769 resolver, DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES, 0) != 0;
Shivam Agrawal780b5bb2019-07-17 10:17:11 -0700770 final boolean sizeCompatFreeform = Settings.Global.getInt(
771 resolver, DEVELOPMENT_ENABLE_SIZECOMPAT_FREEFORM, 0) != 0;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700772
773 // Transfer any global setting for forcing RTL layout, into a System Property
Kiyoung Kim0fe161d2018-12-20 18:26:10 +0900774 DisplayProperties.debug_force_rtl(forceRtl);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700775
776 final Configuration configuration = new Configuration();
777 Settings.System.getConfiguration(resolver, configuration);
778 if (forceRtl) {
779 // This will take care of setting the correct layout direction flags
780 configuration.setLayoutDirection(configuration.locale);
781 }
782
783 synchronized (mGlobalLock) {
784 mForceResizableActivities = forceResizable;
Shivam Agrawal780b5bb2019-07-17 10:17:11 -0700785 mSizeCompatFreeform = sizeCompatFreeform;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700786 final boolean multiWindowFormEnabled = freeformWindowManagement
787 || supportsSplitScreenMultiWindow
788 || supportsPictureInPicture
789 || supportsMultiDisplay;
790 if ((supportsMultiWindow || forceResizable) && multiWindowFormEnabled) {
791 mSupportsMultiWindow = true;
792 mSupportsFreeformWindowManagement = freeformWindowManagement;
793 mSupportsSplitScreenMultiWindow = supportsSplitScreenMultiWindow;
794 mSupportsPictureInPicture = supportsPictureInPicture;
795 mSupportsMultiDisplay = supportsMultiDisplay;
796 } else {
797 mSupportsMultiWindow = false;
798 mSupportsFreeformWindowManagement = false;
799 mSupportsSplitScreenMultiWindow = false;
800 mSupportsPictureInPicture = false;
801 mSupportsMultiDisplay = false;
802 }
Garfield Tanb5910b42019-03-14 14:50:59 -0700803 mWindowManager.mRoot.onSettingsRetrieved();
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700804 // This happens before any activities are started, so we can change global configuration
805 // in-place.
806 updateConfigurationLocked(configuration, null, true);
807 final Configuration globalConfig = getGlobalConfiguration();
808 if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Initial config: " + globalConfig);
809
810 // Load resources only after the current configuration has been set.
811 final Resources res = mContext.getResources();
812 mThumbnailWidth = res.getDimensionPixelSize(
813 com.android.internal.R.dimen.thumbnail_width);
814 mThumbnailHeight = res.getDimensionPixelSize(
815 com.android.internal.R.dimen.thumbnail_height);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700816 }
817 }
818
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800819 public WindowManagerGlobalLock getGlobalLock() {
820 return mGlobalLock;
821 }
822
Yunfan Chen585f2932019-01-29 16:04:45 +0900823 /** For test purpose only. */
824 @VisibleForTesting
825 public ActivityTaskManagerInternal getAtmInternal() {
826 return mInternal;
827 }
828
Riddle Hsud93a6c42018-11-29 21:50:06 +0800829 public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController,
830 Looper looper) {
831 mH = new H(looper);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700832 mUiHandler = new UiHandler();
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700833 mIntentFirewall = intentFirewall;
Wale Ogunwale53783742018-09-16 10:21:51 -0700834 final File systemDir = SystemServiceManager.ensureSystemDir();
Wale Ogunwaleda8b8272018-11-29 19:37:37 -0800835 mAppWarnings = createAppWarnings(mUiContext, mH, mUiHandler, systemDir);
Wale Ogunwale53783742018-09-16 10:21:51 -0700836 mCompatModePackages = new CompatModePackages(this, systemDir, mH);
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700837 mPendingIntentController = intentController;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700838 mStackSupervisor = createStackSupervisor();
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700839
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700840 mTaskChangeNotificationController =
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700841 new TaskChangeNotificationController(mGlobalLock, mStackSupervisor, mH);
Wale Ogunwaled95c06b2018-05-08 10:35:38 -0700842 mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH);
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700843 mActivityStartController = new ActivityStartController(this);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700844 setRecentTasks(new RecentTasks(this, mStackSupervisor));
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700845 mVrController = new VrController(mGlobalLock);
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700846 mKeyguardController = mStackSupervisor.getKeyguardController();
847 }
848
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700849 public void onActivityManagerInternalAdded() {
850 synchronized (mGlobalLock) {
851 mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
852 mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
853 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700854 }
855
Yunfan Chen75157d72018-07-27 14:47:21 +0900856 int increaseConfigurationSeqLocked() {
857 mConfigurationSeq = Math.max(++mConfigurationSeq, 1);
858 return mConfigurationSeq;
859 }
860
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700861 protected ActivityStackSupervisor createStackSupervisor() {
862 final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mH.getLooper());
863 supervisor.initialize();
864 return supervisor;
865 }
866
Wale Ogunwaleda8b8272018-11-29 19:37:37 -0800867 protected AppWarnings createAppWarnings(
868 Context uiContext, Handler handler, Handler uiHandler, File systemDir) {
869 return new AppWarnings(this, uiContext, handler, uiHandler, systemDir);
870 }
871
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700872 public void setWindowManager(WindowManagerService wm) {
873 synchronized (mGlobalLock) {
874 mWindowManager = wm;
Louis Chang149d5c82019-12-30 09:47:39 +0800875 mRootWindowContainer = wm.mRoot;
Louis Chang3ff72a82019-12-17 12:12:59 +0800876 mTempConfig.setToDefaults();
877 mTempConfig.setLocales(LocaleList.getDefault());
878 mConfigurationSeq = mTempConfig.seq = 1;
Louis Chang149d5c82019-12-30 09:47:39 +0800879 mRootWindowContainer.onConfigurationChanged(mTempConfig);
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700880 mLockTaskController.setWindowManager(wm);
881 mStackSupervisor.setWindowManager(wm);
Louis Chang149d5c82019-12-30 09:47:39 +0800882 mRootWindowContainer.setWindowManager(wm);
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700883 }
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700884 }
885
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700886 public void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) {
887 synchronized (mGlobalLock) {
888 mUsageStatsInternal = usageStatsManager;
889 }
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700890 }
891
Wale Ogunwalef6733932018-06-27 05:14:34 -0700892 UserManagerService getUserManager() {
893 if (mUserManager == null) {
894 IBinder b = ServiceManager.getService(Context.USER_SERVICE);
895 mUserManager = (UserManagerService) IUserManager.Stub.asInterface(b);
896 }
897 return mUserManager;
898 }
899
Philip P. Moltmannee295092020-02-10 08:46:26 -0800900 AppOpsManager getAppOpsManager() {
901 if (mAppOpsManager == null) {
902 mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
Wale Ogunwalef6733932018-06-27 05:14:34 -0700903 }
Philip P. Moltmannee295092020-02-10 08:46:26 -0800904 return mAppOpsManager;
Wale Ogunwalef6733932018-06-27 05:14:34 -0700905 }
906
907 boolean hasUserRestriction(String restriction, int userId) {
908 return getUserManager().hasUserRestriction(restriction, userId);
909 }
910
Michal Karpinski15486842019-04-25 17:33:42 +0100911 boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, String callingPackage) {
Philip P. Moltmannee295092020-02-10 08:46:26 -0800912 final int mode = getAppOpsManager().noteOpNoThrow(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
913 callingUid, callingPackage, /* featureId */ null, "");
Michal Karpinski15486842019-04-25 17:33:42 +0100914 if (mode == AppOpsManager.MODE_DEFAULT) {
915 return checkPermission(Manifest.permission.SYSTEM_ALERT_WINDOW, callingPid, callingUid)
916 == PERMISSION_GRANTED;
917 }
918 return mode == AppOpsManager.MODE_ALLOWED;
919 }
920
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700921 @VisibleForTesting
922 protected void setRecentTasks(RecentTasks recentTasks) {
923 mRecentTasks = recentTasks;
924 mStackSupervisor.setRecentTasks(recentTasks);
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700925 }
926
927 RecentTasks getRecentTasks() {
928 return mRecentTasks;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700929 }
930
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700931 ClientLifecycleManager getLifecycleManager() {
932 return mLifecycleManager;
933 }
934
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -0700935 ActivityStartController getActivityStartController() {
936 return mActivityStartController;
937 }
938
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700939 TaskChangeNotificationController getTaskChangeNotificationController() {
940 return mTaskChangeNotificationController;
941 }
942
Wale Ogunwaled95c06b2018-05-08 10:35:38 -0700943 LockTaskController getLockTaskController() {
944 return mLockTaskController;
945 }
946
Yunfan Chen75157d72018-07-27 14:47:21 +0900947 /**
948 * Return the global configuration used by the process corresponding to the input pid. This is
949 * usually the global configuration with some overrides specific to that process.
950 */
951 Configuration getGlobalConfigurationForCallingPid() {
952 final int pid = Binder.getCallingPid();
Yunfan Chenc2ff6cf2018-12-04 16:56:21 -0800953 return getGlobalConfigurationForPid(pid);
954 }
955
956 /**
957 * Return the global configuration used by the process corresponding to the given pid.
958 */
959 Configuration getGlobalConfigurationForPid(int pid) {
Yunfan Chen75157d72018-07-27 14:47:21 +0900960 if (pid == MY_PID || pid < 0) {
961 return getGlobalConfiguration();
962 }
963 synchronized (mGlobalLock) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +0100964 final WindowProcessController app = mProcessMap.getProcess(pid);
Yunfan Chen75157d72018-07-27 14:47:21 +0900965 return app != null ? app.getConfiguration() : getGlobalConfiguration();
966 }
967 }
968
969 /**
970 * Return the device configuration info used by the process corresponding to the input pid.
971 * The value is consistent with the global configuration for the process.
972 */
973 @Override
974 public ConfigurationInfo getDeviceConfigurationInfo() {
975 ConfigurationInfo config = new ConfigurationInfo();
976 synchronized (mGlobalLock) {
977 final Configuration globalConfig = getGlobalConfigurationForCallingPid();
978 config.reqTouchScreen = globalConfig.touchscreen;
979 config.reqKeyboardType = globalConfig.keyboard;
980 config.reqNavigation = globalConfig.navigation;
981 if (globalConfig.navigation == Configuration.NAVIGATION_DPAD
982 || globalConfig.navigation == Configuration.NAVIGATION_TRACKBALL) {
983 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
984 }
985 if (globalConfig.keyboard != Configuration.KEYBOARD_UNDEFINED
986 && globalConfig.keyboard != Configuration.KEYBOARD_NOKEYS) {
987 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
988 }
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700989 config.reqGlEsVersion = GL_ES_VERSION;
Yunfan Chen75157d72018-07-27 14:47:21 +0900990 }
991 return config;
992 }
993
Wale Ogunwale6767eae2018-05-03 15:52:51 -0700994 private void start() {
Wale Ogunwale53783742018-09-16 10:21:51 -0700995 LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
Wale Ogunwale6767eae2018-05-03 15:52:51 -0700996 }
997
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700998 public static final class Lifecycle extends SystemService {
999 private final ActivityTaskManagerService mService;
1000
1001 public Lifecycle(Context context) {
1002 super(context);
1003 mService = new ActivityTaskManagerService(context);
1004 }
1005
1006 @Override
1007 public void onStart() {
1008 publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07001009 mService.start();
Wale Ogunwale65ebd952018-04-25 15:41:44 -07001010 }
1011
Garfield Tan891146c2018-10-09 12:14:00 -07001012 @Override
1013 public void onUnlockUser(int userId) {
1014 synchronized (mService.getGlobalLock()) {
Garfield Tan0d407f42019-03-07 11:47:01 -08001015 mService.mStackSupervisor.onUserUnlocked(userId);
Garfield Tan891146c2018-10-09 12:14:00 -07001016 }
1017 }
1018
1019 @Override
1020 public void onCleanupUser(int userId) {
1021 synchronized (mService.getGlobalLock()) {
1022 mService.mStackSupervisor.mLaunchParamsPersister.onCleanupUser(userId);
1023 }
1024 }
1025
Wale Ogunwale65ebd952018-04-25 15:41:44 -07001026 public ActivityTaskManagerService getService() {
1027 return mService;
1028 }
1029 }
1030
1031 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001032 public final int startActivity(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001033 String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
1034 String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
1035 Bundle bOptions) {
1036 return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
1037 resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001038 UserHandle.getCallingUserId());
1039 }
1040
1041 @Override
1042 public final int startActivities(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001043 String callingFeatureId, Intent[] intents, String[] resolvedTypes, IBinder resultTo,
1044 Bundle bOptions, int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001045 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001046 final String reason = "startActivities";
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001047 enforceNotIsolatedCaller(reason);
1048 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, reason);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001049 // TODO: Switch to user app stacks here.
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00001050 return getActivityStartController().startActivities(caller, -1, 0, -1, callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001051 callingFeatureId, intents, resolvedTypes, resultTo,
1052 SafeActivityOptions.fromBundle(bOptions), userId, reason,
1053 null /* originatingPendingIntent */, false /* allowBackgroundActivityStart */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001054 }
1055
1056 @Override
1057 public int startActivityAsUser(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001058 String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
1059 String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
1060 Bundle bOptions, int userId) {
1061 return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
1062 resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001063 true /*validateIncomingUser*/);
1064 }
1065
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001066 private int startActivityAsUser(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001067 @Nullable String callingFeatureId, Intent intent, String resolvedType,
1068 IBinder resultTo, String resultWho, int requestCode, int startFlags,
1069 ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001070 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001071 enforceNotIsolatedCaller("startActivityAsUser");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001072
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001073 userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001074 Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
1075
1076 // TODO: Switch to user app stacks here.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001077 return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001078 .setCaller(caller)
1079 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001080 .setCallingFeatureId(callingFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001081 .setResolvedType(resolvedType)
1082 .setResultTo(resultTo)
1083 .setResultWho(resultWho)
1084 .setRequestCode(requestCode)
1085 .setStartFlags(startFlags)
1086 .setProfilerInfo(profilerInfo)
1087 .setActivityOptions(bOptions)
Louis Chang54fbb052019-10-16 17:10:17 +08001088 .setUserId(userId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001089 .execute();
1090
1091 }
1092
1093 @Override
1094 public int startActivityIntentSender(IApplicationThread caller, IIntentSender target,
1095 IBinder whitelistToken, Intent fillInIntent, String resolvedType, IBinder resultTo,
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001096 String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle bOptions) {
1097 enforceNotIsolatedCaller("startActivityIntentSender");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001098 // Refuse possible leaked file descriptors
1099 if (fillInIntent != null && fillInIntent.hasFileDescriptors()) {
1100 throw new IllegalArgumentException("File descriptors passed in Intent");
1101 }
1102
1103 if (!(target instanceof PendingIntentRecord)) {
1104 throw new IllegalArgumentException("Bad PendingIntent object");
1105 }
1106
1107 PendingIntentRecord pir = (PendingIntentRecord)target;
1108
1109 synchronized (mGlobalLock) {
1110 // If this is coming from the currently resumed activity, it is
1111 // effectively saying that app switches are allowed at this point.
Andrii Kulian5f750bc2018-07-17 08:57:23 -07001112 final ActivityStack stack = getTopDisplayFocusedStack();
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08001113 if (stack != null && stack.mResumedActivity != null
1114 && stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001115 mAppSwitchesAllowedTime = 0;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001116 }
1117 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001118 return pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001119 resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001120 }
1121
1122 @Override
1123 public boolean startNextMatchingActivity(IBinder callingActivity, Intent intent,
1124 Bundle bOptions) {
1125 // Refuse possible leaked file descriptors
1126 if (intent != null && intent.hasFileDescriptors()) {
1127 throw new IllegalArgumentException("File descriptors passed in Intent");
1128 }
1129 SafeActivityOptions options = SafeActivityOptions.fromBundle(bOptions);
1130
1131 synchronized (mGlobalLock) {
1132 final ActivityRecord r = ActivityRecord.isInStackLocked(callingActivity);
1133 if (r == null) {
1134 SafeActivityOptions.abort(options);
1135 return false;
1136 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001137 if (!r.attachedToProcess()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001138 // The caller is not running... d'oh!
1139 SafeActivityOptions.abort(options);
1140 return false;
1141 }
1142 intent = new Intent(intent);
1143 // The caller is not allowed to change the data.
1144 intent.setDataAndType(r.intent.getData(), r.intent.getType());
1145 // And we are resetting to find the next component...
1146 intent.setComponent(null);
1147
1148 final boolean debug = ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0);
1149
1150 ActivityInfo aInfo = null;
1151 try {
1152 List<ResolveInfo> resolves =
1153 AppGlobals.getPackageManager().queryIntentActivities(
1154 intent, r.resolvedType,
1155 PackageManager.MATCH_DEFAULT_ONLY | STOCK_PM_FLAGS,
1156 UserHandle.getCallingUserId()).getList();
1157
1158 // Look for the original activity in the list...
1159 final int N = resolves != null ? resolves.size() : 0;
1160 for (int i=0; i<N; i++) {
1161 ResolveInfo rInfo = resolves.get(i);
1162 if (rInfo.activityInfo.packageName.equals(r.packageName)
1163 && rInfo.activityInfo.name.equals(r.info.name)) {
1164 // We found the current one... the next matching is
1165 // after it.
1166 i++;
1167 if (i<N) {
1168 aInfo = resolves.get(i).activityInfo;
1169 }
1170 if (debug) {
1171 Slog.v(TAG, "Next matching activity: found current " + r.packageName
1172 + "/" + r.info.name);
1173 Slog.v(TAG, "Next matching activity: next is " + ((aInfo == null)
1174 ? "null" : aInfo.packageName + "/" + aInfo.name));
1175 }
1176 break;
1177 }
1178 }
1179 } catch (RemoteException e) {
1180 }
1181
1182 if (aInfo == null) {
1183 // Nobody who is next!
1184 SafeActivityOptions.abort(options);
1185 if (debug) Slog.d(TAG, "Next matching activity: nothing found");
1186 return false;
1187 }
1188
1189 intent.setComponent(new ComponentName(
1190 aInfo.applicationInfo.packageName, aInfo.name));
1191 intent.setFlags(intent.getFlags()&~(
1192 Intent.FLAG_ACTIVITY_FORWARD_RESULT|
1193 Intent.FLAG_ACTIVITY_CLEAR_TOP|
1194 Intent.FLAG_ACTIVITY_MULTIPLE_TASK|
1195 FLAG_ACTIVITY_NEW_TASK));
1196
1197 // Okay now we need to start the new activity, replacing the currently running activity.
1198 // This is a little tricky because we want to start the new one as if the current one is
1199 // finished, but not finish the current one first so that there is no flicker.
1200 // And thus...
1201 final boolean wasFinishing = r.finishing;
1202 r.finishing = true;
1203
1204 // Propagate reply information over to the new activity.
1205 final ActivityRecord resultTo = r.resultTo;
1206 final String resultWho = r.resultWho;
1207 final int requestCode = r.requestCode;
1208 r.resultTo = null;
1209 if (resultTo != null) {
1210 resultTo.removeResultsLocked(r, resultWho, requestCode);
1211 }
1212
1213 final long origId = Binder.clearCallingIdentity();
1214 // TODO(b/64750076): Check if calling pid should really be -1.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001215 final int res = getActivityStartController()
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001216 .obtainStarter(intent, "startNextMatchingActivity")
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001217 .setCaller(r.app.getThread())
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001218 .setResolvedType(r.resolvedType)
1219 .setActivityInfo(aInfo)
1220 .setResultTo(resultTo != null ? resultTo.appToken : null)
1221 .setResultWho(resultWho)
1222 .setRequestCode(requestCode)
1223 .setCallingPid(-1)
1224 .setCallingUid(r.launchedFromUid)
1225 .setCallingPackage(r.launchedFromPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001226 .setCallingFeatureId(r.launchedFromFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001227 .setRealCallingPid(-1)
1228 .setRealCallingUid(r.launchedFromUid)
1229 .setActivityOptions(options)
1230 .execute();
1231 Binder.restoreCallingIdentity(origId);
1232
1233 r.finishing = wasFinishing;
1234 if (res != ActivityManager.START_SUCCESS) {
1235 return false;
1236 }
1237 return true;
1238 }
1239 }
1240
1241 @Override
Galia Peycheva6861e912019-08-21 10:20:23 +02001242 public boolean startDreamActivity(Intent intent) {
Galia Peycheva52e89222020-02-18 23:41:43 +01001243 final WindowProcessController process = mProcessMap.getProcess(Binder.getCallingPid());
1244 final long origId = Binder.clearCallingIdentity();
1245
1246 // The dream activity is only called for non-doze dreams.
1247 final ComponentName currentDream = LocalServices.getService(DreamManagerInternal.class)
1248 .getActiveDreamComponent(/* doze= */ false);
1249
1250 if (currentDream == null || currentDream.getPackageName() == null
1251 || !currentDream.getPackageName().equals(process.mInfo.packageName)) {
1252 Slog.e(TAG, "Calling package is not the current dream package. "
1253 + "Aborting startDreamActivity...");
1254 return false;
1255 }
1256
Galia Peycheva6861e912019-08-21 10:20:23 +02001257 final ActivityInfo a = new ActivityInfo();
1258 a.theme = com.android.internal.R.style.Theme_Dream;
1259 a.exported = true;
1260 a.name = DreamActivity.class.getName();
1261
Galia Peycheva6861e912019-08-21 10:20:23 +02001262
1263 a.packageName = process.mInfo.packageName;
1264 a.applicationInfo = process.mInfo;
1265 a.processName = process.mInfo.processName;
1266 a.uiOptions = process.mInfo.uiOptions;
1267 a.taskAffinity = "android:" + a.packageName + "/dream";
1268 a.enabled = true;
1269 a.launchMode = ActivityInfo.LAUNCH_SINGLE_INSTANCE;
1270
1271 a.persistableMode = ActivityInfo.PERSIST_NEVER;
1272 a.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
1273 a.colorMode = ActivityInfo.COLOR_MODE_DEFAULT;
1274 a.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
1275
Galia Peycheva6861e912019-08-21 10:20:23 +02001276 try {
1277 getActivityStartController().obtainStarter(intent, "dream")
1278 .setActivityInfo(a)
1279 .setIsDream(true)
1280 .execute();
1281 return true;
1282 } finally {
1283 Binder.restoreCallingIdentity(origId);
1284 }
1285 }
1286
1287 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001288 public final WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001289 String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
1290 String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
1291 Bundle bOptions, int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001292 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001293 final WaitResult res = new WaitResult();
Riddle Hsufd66d4d2019-11-14 10:35:55 +08001294 enforceNotIsolatedCaller("startActivityAndWait");
1295 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
1296 userId, "startActivityAndWait");
1297 // TODO: Switch to user app stacks here.
1298 getActivityStartController().obtainStarter(intent, "startActivityAndWait")
1299 .setCaller(caller)
1300 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001301 .setCallingFeatureId(callingFeatureId)
Riddle Hsufd66d4d2019-11-14 10:35:55 +08001302 .setResolvedType(resolvedType)
1303 .setResultTo(resultTo)
1304 .setResultWho(resultWho)
1305 .setRequestCode(requestCode)
1306 .setStartFlags(startFlags)
1307 .setActivityOptions(bOptions)
1308 .setUserId(userId)
1309 .setProfilerInfo(profilerInfo)
1310 .setWaitResult(res)
1311 .execute();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001312 return res;
1313 }
1314
1315 @Override
1316 public final int startActivityWithConfig(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001317 String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
1318 String resultWho, int requestCode, int startFlags, Configuration config,
1319 Bundle bOptions, int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001320 assertPackageMatchesCallingUid(callingPackage);
Riddle Hsufd66d4d2019-11-14 10:35:55 +08001321 enforceNotIsolatedCaller("startActivityWithConfig");
1322 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,
1323 "startActivityWithConfig");
1324 // TODO: Switch to user app stacks here.
1325 return getActivityStartController().obtainStarter(intent, "startActivityWithConfig")
1326 .setCaller(caller)
1327 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001328 .setCallingFeatureId(callingFeatureId)
Riddle Hsufd66d4d2019-11-14 10:35:55 +08001329 .setResolvedType(resolvedType)
1330 .setResultTo(resultTo)
1331 .setResultWho(resultWho)
1332 .setRequestCode(requestCode)
1333 .setStartFlags(startFlags)
1334 .setGlobalConfiguration(config)
1335 .setActivityOptions(bOptions)
1336 .setUserId(userId)
1337 .execute();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001338 }
1339
Robert Carr8a2f9132019-11-11 15:03:15 -08001340 @Override
Alison Cichowlas3e340502018-08-07 17:15:01 -04001341 public IBinder requestStartActivityPermissionToken(IBinder delegatorToken) {
1342 int callingUid = Binder.getCallingUid();
1343 if (UserHandle.getAppId(callingUid) != SYSTEM_UID) {
1344 throw new SecurityException("Only the system process can request a permission token, "
1345 + "received request from uid: " + callingUid);
1346 }
1347 IBinder permissionToken = new Binder();
1348 synchronized (mGlobalLock) {
1349 mStartActivitySources.put(permissionToken, delegatorToken);
1350 }
1351
1352 Message expireMsg = PooledLambda.obtainMessage(
1353 ActivityTaskManagerService::expireStartAsCallerTokenMsg, this, permissionToken);
1354 mUiHandler.sendMessageDelayed(expireMsg, START_AS_CALLER_TOKEN_TIMEOUT_IMPL);
1355
1356 Message forgetMsg = PooledLambda.obtainMessage(
1357 ActivityTaskManagerService::forgetStartAsCallerTokenMsg, this, permissionToken);
1358 mUiHandler.sendMessageDelayed(forgetMsg, START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT);
1359
1360 return permissionToken;
1361 }
1362
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001363 @Override
1364 public final int startActivityAsCaller(IApplicationThread caller, String callingPackage,
1365 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
Alison Cichowlas3e340502018-08-07 17:15:01 -04001366 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, IBinder permissionToken,
1367 boolean ignoreTargetSecurity, int userId) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001368 // This is very dangerous -- it allows you to perform a start activity (including
Alison Cichowlas3e340502018-08-07 17:15:01 -04001369 // permission grants) as any app that may launch one of your own activities. So we only
1370 // allow this in two cases:
1371 // 1) The caller is an activity that is part of the core framework, and then only when it
1372 // is running as the system.
1373 // 2) The caller provides a valid permissionToken. Permission tokens are one-time use and
1374 // can only be requested by a system activity, which may then delegate this call to
1375 // another app.
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001376 final ActivityRecord sourceRecord;
1377 final int targetUid;
1378 final String targetPackage;
Philip P. Moltmannee295092020-02-10 08:46:26 -08001379 final String targetFeatureId;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001380 final boolean isResolver;
1381 synchronized (mGlobalLock) {
1382 if (resultTo == null) {
1383 throw new SecurityException("Must be called from an activity");
1384 }
Alison Cichowlas3e340502018-08-07 17:15:01 -04001385 final IBinder sourceToken;
1386 if (permissionToken != null) {
1387 // To even attempt to use a permissionToken, an app must also have this signature
1388 // permission.
1389 mAmInternal.enforceCallingPermission(
1390 android.Manifest.permission.START_ACTIVITY_AS_CALLER,
1391 "startActivityAsCaller");
1392 // If called with a permissionToken, we want the sourceRecord from the delegator
1393 // activity that requested this token.
1394 sourceToken = mStartActivitySources.remove(permissionToken);
1395 if (sourceToken == null) {
1396 // Invalid permissionToken, check if it recently expired.
1397 if (mExpiredStartAsCallerTokens.contains(permissionToken)) {
1398 throw new SecurityException("Called with expired permission token: "
1399 + permissionToken);
1400 } else {
1401 throw new SecurityException("Called with invalid permission token: "
1402 + permissionToken);
1403 }
1404 }
1405 } else {
1406 // This method was called directly by the source.
1407 sourceToken = resultTo;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001408 }
Alison Cichowlas3e340502018-08-07 17:15:01 -04001409
Louis Chang149d5c82019-12-30 09:47:39 +08001410 sourceRecord = mRootWindowContainer.isInAnyStack(sourceToken);
Alison Cichowlas3e340502018-08-07 17:15:01 -04001411 if (sourceRecord == null) {
1412 throw new SecurityException("Called with bad activity token: " + sourceToken);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001413 }
1414 if (sourceRecord.app == null) {
1415 throw new SecurityException("Called without a process attached to activity");
1416 }
Alison Cichowlas3e340502018-08-07 17:15:01 -04001417
1418 // Whether called directly or from a delegate, the source activity must be from the
1419 // android package.
1420 if (!sourceRecord.info.packageName.equals("android")) {
1421 throw new SecurityException("Must be called from an activity that is "
1422 + "declared in the android package");
1423 }
1424
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001425 if (UserHandle.getAppId(sourceRecord.app.mUid) != SYSTEM_UID) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001426 // This is still okay, as long as this activity is running under the
1427 // uid of the original calling activity.
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001428 if (sourceRecord.app.mUid != sourceRecord.launchedFromUid) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001429 throw new SecurityException(
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001430 "Calling activity in uid " + sourceRecord.app.mUid
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001431 + " must be system uid or original calling uid "
1432 + sourceRecord.launchedFromUid);
1433 }
1434 }
1435 if (ignoreTargetSecurity) {
1436 if (intent.getComponent() == null) {
1437 throw new SecurityException(
1438 "Component must be specified with ignoreTargetSecurity");
1439 }
1440 if (intent.getSelector() != null) {
1441 throw new SecurityException(
1442 "Selector not allowed with ignoreTargetSecurity");
1443 }
1444 }
1445 targetUid = sourceRecord.launchedFromUid;
1446 targetPackage = sourceRecord.launchedFromPackage;
Philip P. Moltmannee295092020-02-10 08:46:26 -08001447 targetFeatureId = sourceRecord.launchedFromFeatureId;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001448 isResolver = sourceRecord.isResolverOrChildActivity();
1449 }
1450
1451 if (userId == UserHandle.USER_NULL) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001452 userId = UserHandle.getUserId(sourceRecord.app.mUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001453 }
1454
1455 // TODO: Switch to user app stacks here.
1456 try {
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001457 return getActivityStartController().obtainStarter(intent, "startActivityAsCaller")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001458 .setCallingUid(targetUid)
1459 .setCallingPackage(targetPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001460 .setCallingFeatureId(targetFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001461 .setResolvedType(resolvedType)
1462 .setResultTo(resultTo)
1463 .setResultWho(resultWho)
1464 .setRequestCode(requestCode)
1465 .setStartFlags(startFlags)
1466 .setActivityOptions(bOptions)
Louis Chang54fbb052019-10-16 17:10:17 +08001467 .setUserId(userId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001468 .setIgnoreTargetSecurity(ignoreTargetSecurity)
1469 .setFilterCallingUid(isResolver ? 0 /* system */ : targetUid)
Alan Stokes2f4a4ed2019-05-08 16:56:45 +01001470 // The target may well be in the background, which would normally prevent it
1471 // from starting an activity. Here we definitely want the start to succeed.
1472 .setAllowBackgroundActivityStart(true)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001473 .execute();
1474 } catch (SecurityException e) {
1475 // XXX need to figure out how to propagate to original app.
1476 // A SecurityException here is generally actually a fault of the original
1477 // calling activity (such as a fairly granting permissions), so propagate it
1478 // back to them.
1479 /*
1480 StringBuilder msg = new StringBuilder();
1481 msg.append("While launching");
1482 msg.append(intent.toString());
1483 msg.append(": ");
1484 msg.append(e.getMessage());
1485 */
1486 throw e;
1487 }
1488 }
1489
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001490 int handleIncomingUser(int callingPid, int callingUid, int userId, String name) {
1491 return mAmInternal.handleIncomingUser(callingPid, callingUid, userId, false /* allowAll */,
Jonathan Scott92335342019-12-17 14:46:26 +00001492 ALLOW_NON_FULL, name, null /* callerPackage */);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001493 }
1494
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001495 @Override
Philip P. Moltmannee295092020-02-10 08:46:26 -08001496 public int startVoiceActivity(String callingPackage, String callingFeatureId, int callingPid,
1497 int callingUid, Intent intent, String resolvedType, IVoiceInteractionSession session,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001498 IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo,
1499 Bundle bOptions, int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001500 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001501 mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startVoiceActivity()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001502 if (session == null || interactor == null) {
1503 throw new NullPointerException("null session or interactor");
1504 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001505 userId = handleIncomingUser(callingPid, callingUid, userId, "startVoiceActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001506 // TODO: Switch to user app stacks here.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001507 return getActivityStartController().obtainStarter(intent, "startVoiceActivity")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001508 .setCallingUid(callingUid)
1509 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001510 .setCallingFeatureId(callingFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001511 .setResolvedType(resolvedType)
1512 .setVoiceSession(session)
1513 .setVoiceInteractor(interactor)
1514 .setStartFlags(startFlags)
1515 .setProfilerInfo(profilerInfo)
1516 .setActivityOptions(bOptions)
Louis Chang54fbb052019-10-16 17:10:17 +08001517 .setUserId(userId)
Michal Karpinski85fa2022019-02-08 12:05:09 +00001518 .setAllowBackgroundActivityStart(true)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001519 .execute();
1520 }
1521
1522 @Override
Philip P. Moltmannee295092020-02-10 08:46:26 -08001523 public int startAssistantActivity(String callingPackage, @NonNull String callingFeatureId,
1524 int callingPid, int callingUid, Intent intent, String resolvedType, Bundle bOptions,
1525 int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001526 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001527 mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startAssistantActivity()");
1528 userId = handleIncomingUser(callingPid, callingUid, userId, "startAssistantActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001529
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001530 return getActivityStartController().obtainStarter(intent, "startAssistantActivity")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001531 .setCallingUid(callingUid)
1532 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001533 .setCallingFeatureId(callingFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001534 .setResolvedType(resolvedType)
1535 .setActivityOptions(bOptions)
Louis Chang54fbb052019-10-16 17:10:17 +08001536 .setUserId(userId)
Michal Karpinski85fa2022019-02-08 12:05:09 +00001537 .setAllowBackgroundActivityStart(true)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001538 .execute();
1539 }
1540
Riddle Hsu609a8e22019-06-27 16:46:29 -06001541 /**
1542 * Start the recents activity to perform the recents animation.
1543 *
1544 * @param intent The intent to start the recents activity.
1545 * @param recentsAnimationRunner Pass {@code null} to only preload the activity.
1546 */
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001547 @Override
Riddle Hsu609a8e22019-06-27 16:46:29 -06001548 public void startRecentsActivity(Intent intent, @Deprecated IAssistDataReceiver unused,
1549 @Nullable IRecentsAnimationRunner recentsAnimationRunner) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001550 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001551 final int callingPid = Binder.getCallingPid();
Jorim Jaggi589c5ba2019-07-30 16:50:13 +02001552 final int callingUid = Binder.getCallingUid();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001553 final long origId = Binder.clearCallingIdentity();
1554 try {
1555 synchronized (mGlobalLock) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07001556 final ComponentName recentsComponent = mRecentTasks.getRecentsComponent();
Philip P. Moltmannee295092020-02-10 08:46:26 -08001557 final String recentsFeatureId = mRecentTasks.getRecentsComponentFeatureId();
Wale Ogunwale16e505a2018-05-07 15:00:49 -07001558 final int recentsUid = mRecentTasks.getRecentsComponentUid();
Jorim Jaggi589c5ba2019-07-30 16:50:13 +02001559 final WindowProcessController caller = getProcessController(callingPid, callingUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001560
1561 // Start a new recents animation
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001562 final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor,
Riddle Hsu609a8e22019-06-27 16:46:29 -06001563 getActivityStartController(), mWindowManager, intent, recentsComponent,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001564 recentsFeatureId, recentsUid, caller);
Riddle Hsu609a8e22019-06-27 16:46:29 -06001565 if (recentsAnimationRunner == null) {
1566 anim.preloadRecentsActivity();
1567 } else {
1568 anim.startRecentsActivity(recentsAnimationRunner);
1569 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001570 }
1571 } finally {
1572 Binder.restoreCallingIdentity(origId);
1573 }
1574 }
1575
1576 @Override
1577 public final int startActivityFromRecents(int taskId, Bundle bOptions) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001578 enforceCallerIsRecentsOrHasPermission(START_TASKS_FROM_RECENTS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001579 "startActivityFromRecents()");
1580
1581 final int callingPid = Binder.getCallingPid();
1582 final int callingUid = Binder.getCallingUid();
1583 final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(bOptions);
1584 final long origId = Binder.clearCallingIdentity();
1585 try {
1586 synchronized (mGlobalLock) {
1587 return mStackSupervisor.startActivityFromRecents(callingPid, callingUid, taskId,
1588 safeOptions);
1589 }
1590 } finally {
1591 Binder.restoreCallingIdentity(origId);
1592 }
1593 }
1594
1595 /**
Andrii Kulian2eb84b22018-12-13 18:18:54 -08001596 * Public API to check if the client is allowed to start an activity on specified display.
1597 *
1598 * If the target display is private or virtual, some restrictions will apply.
1599 *
1600 * @param displayId Target display id.
1601 * @param intent Intent used to launch the activity.
1602 * @param resolvedType The MIME type of the intent.
1603 * @param userId The id of the user for whom the call is made.
1604 * @return {@code true} if a call to start an activity on the target display should succeed and
1605 * no {@link SecurityException} will be thrown, {@code false} otherwise.
1606 */
1607 @Override
1608 public final boolean isActivityStartAllowedOnDisplay(int displayId, Intent intent,
1609 String resolvedType, int userId) {
1610 final int callingUid = Binder.getCallingUid();
1611 final int callingPid = Binder.getCallingPid();
1612 final long origId = Binder.clearCallingIdentity();
1613
1614 try {
1615 // Collect information about the target of the Intent.
1616 ActivityInfo aInfo = mStackSupervisor.resolveActivity(intent, resolvedType,
1617 0 /* startFlags */, null /* profilerInfo */, userId,
1618 ActivityStarter.computeResolveFilterUid(callingUid, callingUid,
1619 UserHandle.USER_NULL));
1620 aInfo = mAmInternal.getActivityInfoForUser(aInfo, userId);
1621
1622 synchronized (mGlobalLock) {
1623 return mStackSupervisor.canPlaceEntityOnDisplay(displayId, callingPid, callingUid,
1624 aInfo);
1625 }
1626 } finally {
1627 Binder.restoreCallingIdentity(origId);
1628 }
1629 }
1630
1631 /**
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001632 * This is the internal entry point for handling Activity.finish().
1633 *
1634 * @param token The Binder token referencing the Activity we want to finish.
1635 * @param resultCode Result code, if any, from this Activity.
1636 * @param resultData Result data (Intent), if any, from this Activity.
1637 * @param finishTask Whether to finish the task associated with this Activity.
1638 *
1639 * @return Returns true if the activity successfully finished, or false if it is still running.
1640 */
1641 @Override
1642 public final boolean finishActivity(IBinder token, int resultCode, Intent resultData,
1643 int finishTask) {
1644 // Refuse possible leaked file descriptors
1645 if (resultData != null && resultData.hasFileDescriptors()) {
1646 throw new IllegalArgumentException("File descriptors passed in Intent");
1647 }
1648
1649 synchronized (mGlobalLock) {
Andrii Kulian057a6512019-07-15 16:15:51 -07001650 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001651 if (r == null) {
1652 return true;
1653 }
1654 // Keep track of the root activity of the task before we finish it
Louis Changcdec0802019-11-11 11:45:07 +08001655 final Task tr = r.getTask();
Andrii Kulian057a6512019-07-15 16:15:51 -07001656 final ActivityRecord rootR = tr.getRootActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001657 if (rootR == null) {
1658 Slog.w(TAG, "Finishing task with all activities already finished");
1659 }
1660 // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps can
1661 // finish.
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07001662 if (getLockTaskController().activityBlockedFromFinish(r)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001663 return false;
1664 }
1665
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001666 // TODO: There is a dup. of this block of code in ActivityStack.navigateUpToLocked
1667 // We should consolidate.
1668 if (mController != null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001669 // Find the first activity that is not finishing.
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09001670 final ActivityRecord next =
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08001671 r.getRootTask().topRunningActivity(token, INVALID_TASK_ID);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001672 if (next != null) {
1673 // ask watcher if this is allowed
1674 boolean resumeOK = true;
1675 try {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001676 resumeOK = mController.activityResuming(next.packageName);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001677 } catch (RemoteException e) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001678 mController = null;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001679 Watchdog.getInstance().setActivityController(null);
1680 }
1681
1682 if (!resumeOK) {
1683 Slog.i(TAG, "Not finishing activity because controller resumed");
1684 return false;
1685 }
1686 }
1687 }
Michal Karpinskifc6872e2019-05-21 15:18:44 +01001688
1689 // note down that the process has finished an activity and is in background activity
1690 // starts grace period
1691 if (r.app != null) {
1692 r.app.setLastActivityFinishTimeIfNeeded(SystemClock.uptimeMillis());
1693 }
1694
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001695 final long origId = Binder.clearCallingIdentity();
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001696 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "finishActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001697 try {
1698 boolean res;
1699 final boolean finishWithRootActivity =
1700 finishTask == Activity.FINISH_TASK_WITH_ROOT_ACTIVITY;
1701 if (finishTask == Activity.FINISH_TASK_WITH_ACTIVITY
1702 || (finishWithRootActivity && r == rootR)) {
1703 // If requested, remove the task that is associated to this activity only if it
1704 // was the root activity in the task. The result code and data is ignored
1705 // because we don't support returning them across task boundaries. Also, to
1706 // keep backwards compatibility we remove the task from recents when finishing
1707 // task with root activity.
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09001708 mStackSupervisor.removeTask(tr, false /*killProcess*/,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001709 finishWithRootActivity, "finish-activity");
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09001710 res = true;
Garfield Tan2746ab52018-07-25 12:33:01 -07001711 // Explicitly dismissing the activity so reset its relaunch flag.
Wale Ogunwale64258362018-10-16 15:13:37 -07001712 r.mRelaunchReason = RELAUNCH_REASON_NONE;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001713 } else {
Louis Chang7b03ad92019-08-21 12:32:33 +08001714 r.finishIfPossible(resultCode, resultData, "app-request", true /* oomAdj */);
Andrii Kulian40eda672019-07-30 15:05:57 -07001715 res = r.finishing;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001716 if (!res) {
1717 Slog.i(TAG, "Failed to finish by app-request");
1718 }
1719 }
1720 return res;
1721 } finally {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001722 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001723 Binder.restoreCallingIdentity(origId);
1724 }
1725 }
1726 }
1727
1728 @Override
1729 public boolean finishActivityAffinity(IBinder token) {
1730 synchronized (mGlobalLock) {
1731 final long origId = Binder.clearCallingIdentity();
1732 try {
1733 ActivityRecord r = ActivityRecord.isInStackLocked(token);
1734 if (r == null) {
1735 return false;
1736 }
1737
1738 // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps
1739 // can finish.
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07001740 if (getLockTaskController().activityBlockedFromFinish(r)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001741 return false;
1742 }
Wale Ogunwalea38654f2019-11-17 20:37:15 -08001743
1744 final PooledFunction p = PooledLambda.obtainFunction(
1745 ActivityRecord::finishIfSameAffinity, r,
1746 PooledLambda.__(ActivityRecord.class));
1747 r.getTask().forAllActivities(
1748 p, r, true /*includeBoundary*/, true /*traverseTopToBottom*/);
1749 p.recycle();
1750
Andrii Kuliande93eff2019-07-12 12:21:27 -07001751 return true;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001752 } finally {
1753 Binder.restoreCallingIdentity(origId);
1754 }
1755 }
1756 }
1757
1758 @Override
1759 public final void activityIdle(IBinder token, Configuration config, boolean stopProfiling) {
1760 final long origId = Binder.clearCallingIdentity();
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001761 try {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001762 synchronized (mGlobalLock) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001763 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityIdle");
Riddle Hsufc8ab262019-12-31 15:31:24 +08001764 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
1765 if (r == null) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001766 return;
1767 }
Riddle Hsufc8ab262019-12-31 15:31:24 +08001768 mStackSupervisor.activityIdleInternal(r, false /* fromTimeout */,
1769 false /* processPausingActivities */, config);
1770 if (stopProfiling && r.hasProcess()) {
1771 r.app.clearProfilerIfNeeded();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001772 }
1773 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001774 } finally {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001775 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001776 Binder.restoreCallingIdentity(origId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001777 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001778 }
1779
1780 @Override
1781 public final void activityResumed(IBinder token) {
1782 final long origId = Binder.clearCallingIdentity();
1783 synchronized (mGlobalLock) {
1784 ActivityRecord.activityResumedLocked(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001785 }
1786 Binder.restoreCallingIdentity(origId);
1787 }
1788
1789 @Override
Andrii Kulian86e70fc2019-02-12 11:04:10 +00001790 public final void activityTopResumedStateLost() {
1791 final long origId = Binder.clearCallingIdentity();
1792 synchronized (mGlobalLock) {
1793 mStackSupervisor.handleTopResumedStateReleased(false /* timeout */);
1794 }
1795 Binder.restoreCallingIdentity(origId);
1796 }
1797
1798 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001799 public final void activityPaused(IBinder token) {
1800 final long origId = Binder.clearCallingIdentity();
1801 synchronized (mGlobalLock) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001802 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityPaused");
Wale Ogunwale196db712019-12-27 15:35:39 +00001803 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
1804 if (r != null) {
1805 r.activityPaused(false);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001806 }
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001807 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001808 }
1809 Binder.restoreCallingIdentity(origId);
1810 }
1811
1812 @Override
1813 public final void activityStopped(IBinder token, Bundle icicle,
1814 PersistableBundle persistentState, CharSequence description) {
1815 if (DEBUG_ALL) Slog.v(TAG, "Activity stopped: token=" + token);
1816
1817 // Refuse possible leaked file descriptors
1818 if (icicle != null && icicle.hasFileDescriptors()) {
1819 throw new IllegalArgumentException("File descriptors passed in Bundle");
1820 }
1821
1822 final long origId = Binder.clearCallingIdentity();
1823
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001824 String restartingName = null;
1825 int restartingUid = 0;
1826 final ActivityRecord r;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001827 synchronized (mGlobalLock) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001828 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityStopped");
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001829 r = ActivityRecord.isInStackLocked(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001830 if (r != null) {
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001831 if (r.attachedToProcess()
1832 && r.isState(ActivityStack.ActivityState.RESTARTING_PROCESS)) {
1833 // The activity was requested to restart from
1834 // {@link #restartActivityProcessIfVisible}.
1835 restartingName = r.app.mName;
1836 restartingUid = r.app.mUid;
1837 }
Wale Ogunwale196db712019-12-27 15:35:39 +00001838 r.activityStopped(icicle, persistentState, description);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001839 }
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001840 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001841 }
1842
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001843 if (restartingName != null) {
1844 // In order to let the foreground activity can be restarted with its saved state from
1845 // {@link android.app.Activity#onSaveInstanceState}, the kill operation is postponed
1846 // until the activity reports stopped with the state. And the activity record will be
1847 // kept because the record state is restarting, then the activity will be restarted
1848 // immediately if it is still the top one.
1849 mStackSupervisor.removeRestartTimeouts(r);
1850 mAmInternal.killProcess(restartingName, restartingUid, "restartActivityProcess");
1851 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001852 mAmInternal.trimApplications();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001853
1854 Binder.restoreCallingIdentity(origId);
1855 }
1856
1857 @Override
1858 public final void activityDestroyed(IBinder token) {
1859 if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "ACTIVITY DESTROYED: " + token);
1860 synchronized (mGlobalLock) {
Andrii Kulian79d67982019-08-19 11:56:16 -07001861 final long origId = Binder.clearCallingIdentity();
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001862 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityDestroyed");
Andrii Kulian79d67982019-08-19 11:56:16 -07001863 try {
1864 final ActivityRecord activity = ActivityRecord.forTokenLocked(token);
1865 if (activity != null) {
1866 activity.destroyed("activityDestroyed");
1867 }
1868 } finally {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001869 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Andrii Kulian79d67982019-08-19 11:56:16 -07001870 Binder.restoreCallingIdentity(origId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001871 }
1872 }
1873 }
1874
1875 @Override
1876 public final void activityRelaunched(IBinder token) {
1877 final long origId = Binder.clearCallingIdentity();
1878 synchronized (mGlobalLock) {
1879 mStackSupervisor.activityRelaunchedLocked(token);
1880 }
1881 Binder.restoreCallingIdentity(origId);
1882 }
1883
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001884 @Override
1885 public void setRequestedOrientation(IBinder token, int requestedOrientation) {
1886 synchronized (mGlobalLock) {
1887 ActivityRecord r = ActivityRecord.isInStackLocked(token);
1888 if (r == null) {
1889 return;
1890 }
1891 final long origId = Binder.clearCallingIdentity();
1892 try {
1893 r.setRequestedOrientation(requestedOrientation);
1894 } finally {
1895 Binder.restoreCallingIdentity(origId);
1896 }
1897 }
1898 }
1899
1900 @Override
1901 public int getRequestedOrientation(IBinder token) {
1902 synchronized (mGlobalLock) {
Wale Ogunwaleda8b8272018-11-29 19:37:37 -08001903 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1904 return (r != null)
1905 ? r.getRequestedOrientation() : ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001906 }
1907 }
1908
1909 @Override
1910 public void setImmersive(IBinder token, boolean immersive) {
1911 synchronized (mGlobalLock) {
1912 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1913 if (r == null) {
1914 throw new IllegalArgumentException();
1915 }
1916 r.immersive = immersive;
1917
1918 // update associated state if we're frontmost
Andrii Kulian52d255c2018-07-13 11:32:19 -07001919 if (r.isResumedActivityOnDisplay()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001920 if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, "Frontmost changed immersion: "+ r);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001921 applyUpdateLockStateLocked(r);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001922 }
1923 }
1924 }
1925
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001926 void applyUpdateLockStateLocked(ActivityRecord r) {
1927 // Modifications to the UpdateLock state are done on our handler, outside
1928 // the activity manager's locks. The new state is determined based on the
1929 // state *now* of the relevant activity record. The object is passed to
1930 // the handler solely for logging detail, not to be consulted/modified.
1931 final boolean nextState = r != null && r.immersive;
1932 mH.post(() -> {
1933 if (mUpdateLock.isHeld() != nextState) {
1934 if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE,
1935 "Applying new update lock state '" + nextState + "' for " + r);
1936 if (nextState) {
1937 mUpdateLock.acquire();
1938 } else {
1939 mUpdateLock.release();
1940 }
1941 }
1942 });
1943 }
1944
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001945 @Override
1946 public boolean isImmersive(IBinder token) {
1947 synchronized (mGlobalLock) {
1948 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1949 if (r == null) {
1950 throw new IllegalArgumentException();
1951 }
1952 return r.immersive;
1953 }
1954 }
1955
1956 @Override
1957 public boolean isTopActivityImmersive() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001958 enforceNotIsolatedCaller("isTopActivityImmersive");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001959 synchronized (mGlobalLock) {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08001960 final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
1961 if (topFocusedStack == null) {
1962 return false;
1963 }
1964
1965 final ActivityRecord r = topFocusedStack.topRunningActivity();
1966 return r != null && r.immersive;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001967 }
1968 }
1969
1970 @Override
1971 public void overridePendingTransition(IBinder token, String packageName,
1972 int enterAnim, int exitAnim) {
1973 synchronized (mGlobalLock) {
1974 ActivityRecord self = ActivityRecord.isInStackLocked(token);
1975 if (self == null) {
1976 return;
1977 }
1978
1979 final long origId = Binder.clearCallingIdentity();
1980
1981 if (self.isState(
1982 ActivityStack.ActivityState.RESUMED, ActivityStack.ActivityState.PAUSING)) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08001983 self.getDisplay().mDisplayContent.mAppTransition.overridePendingAppTransition(
lumark588a3e82018-07-20 18:53:54 +08001984 packageName, enterAnim, exitAnim, null);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001985 }
1986
1987 Binder.restoreCallingIdentity(origId);
1988 }
1989 }
1990
1991 @Override
1992 public int getFrontActivityScreenCompatMode() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001993 enforceNotIsolatedCaller("getFrontActivityScreenCompatMode");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001994 synchronized (mGlobalLock) {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08001995 final ActivityStack stack = getTopDisplayFocusedStack();
1996 final ActivityRecord r = stack != null ? stack.topRunningActivity() : null;
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001997 if (r == null) {
1998 return ActivityManager.COMPAT_MODE_UNKNOWN;
1999 }
Wale Ogunwale53783742018-09-16 10:21:51 -07002000 return mCompatModePackages.computeCompatModeLocked(r.info.applicationInfo);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002001 }
2002 }
2003
2004 @Override
2005 public void setFrontActivityScreenCompatMode(int mode) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002006 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002007 "setFrontActivityScreenCompatMode");
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002008 ApplicationInfo ai;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002009 synchronized (mGlobalLock) {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08002010 final ActivityStack stack = getTopDisplayFocusedStack();
2011 final ActivityRecord r = stack != null ? stack.topRunningActivity() : null;
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002012 if (r == null) {
2013 Slog.w(TAG, "setFrontActivityScreenCompatMode failed: no top activity");
2014 return;
2015 }
2016 ai = r.info.applicationInfo;
Wale Ogunwale53783742018-09-16 10:21:51 -07002017 mCompatModePackages.setPackageScreenCompatModeLocked(ai, mode);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002018 }
2019 }
2020
2021 @Override
2022 public int getLaunchedFromUid(IBinder activityToken) {
2023 ActivityRecord srec;
2024 synchronized (mGlobalLock) {
2025 srec = ActivityRecord.forTokenLocked(activityToken);
2026 }
2027 if (srec == null) {
2028 return -1;
2029 }
2030 return srec.launchedFromUid;
2031 }
2032
2033 @Override
2034 public String getLaunchedFromPackage(IBinder activityToken) {
2035 ActivityRecord srec;
2036 synchronized (mGlobalLock) {
2037 srec = ActivityRecord.forTokenLocked(activityToken);
2038 }
2039 if (srec == null) {
2040 return null;
2041 }
2042 return srec.launchedFromPackage;
2043 }
2044
2045 @Override
2046 public boolean convertFromTranslucent(IBinder token) {
2047 final long origId = Binder.clearCallingIdentity();
2048 try {
2049 synchronized (mGlobalLock) {
2050 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
2051 if (r == null) {
2052 return false;
2053 }
Wale Ogunwale83b8a6b2019-06-27 20:15:15 -07002054 return r.setOccludesParent(true);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002055 }
2056 } finally {
2057 Binder.restoreCallingIdentity(origId);
2058 }
2059 }
2060
2061 @Override
2062 public boolean convertToTranslucent(IBinder token, Bundle options) {
2063 SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(options);
2064 final long origId = Binder.clearCallingIdentity();
2065 try {
2066 synchronized (mGlobalLock) {
2067 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
2068 if (r == null) {
2069 return false;
2070 }
Wale Ogunwalea38654f2019-11-17 20:37:15 -08002071 final ActivityRecord under = r.getTask().getActivityBelow(r);
2072 if (under != null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002073 under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null;
2074 }
Wale Ogunwale83b8a6b2019-06-27 20:15:15 -07002075 return r.setOccludesParent(false);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002076 }
2077 } finally {
2078 Binder.restoreCallingIdentity(origId);
2079 }
2080 }
2081
2082 @Override
2083 public void notifyActivityDrawn(IBinder token) {
2084 if (DEBUG_VISIBILITY) Slog.d(TAG_VISIBILITY, "notifyActivityDrawn: token=" + token);
2085 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002086 ActivityRecord r = mRootWindowContainer.isInAnyStack(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002087 if (r != null) {
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002088 r.getRootTask().notifyActivityDrawnLocked(r);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002089 }
2090 }
2091 }
2092
2093 @Override
2094 public void reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle) {
2095 synchronized (mGlobalLock) {
2096 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2097 if (r == null) {
2098 return;
2099 }
2100 r.reportFullyDrawnLocked(restoredFromBundle);
2101 }
2102 }
2103
2104 @Override
Louis Chang677921f2019-12-06 16:44:24 +08002105 public int getDisplayId(IBinder activityToken) throws RemoteException {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002106 synchronized (mGlobalLock) {
2107 final ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
Wale Ogunwale8f93b642019-12-26 12:10:52 -08002108 if (stack != null) {
2109 final int displayId = stack.getDisplayId();
2110 return displayId != INVALID_DISPLAY ? displayId : DEFAULT_DISPLAY;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002111 }
2112 return DEFAULT_DISPLAY;
2113 }
2114 }
2115
2116 @Override
2117 public ActivityManager.StackInfo getFocusedStackInfo() throws RemoteException {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002118 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002119 long ident = Binder.clearCallingIdentity();
2120 try {
2121 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07002122 ActivityStack focusedStack = getTopDisplayFocusedStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002123 if (focusedStack != null) {
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002124 return mRootWindowContainer.getStackInfo(focusedStack.mTaskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002125 }
2126 return null;
2127 }
2128 } finally {
2129 Binder.restoreCallingIdentity(ident);
2130 }
2131 }
2132
2133 @Override
2134 public void setFocusedStack(int stackId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002135 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002136 if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedStack: stackId=" + stackId);
2137 final long callingId = Binder.clearCallingIdentity();
2138 try {
2139 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002140 final ActivityStack stack = mRootWindowContainer.getStack(stackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002141 if (stack == null) {
2142 Slog.w(TAG, "setFocusedStack: No stack with id=" + stackId);
2143 return;
2144 }
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09002145 final ActivityRecord r = stack.topRunningActivity();
Louis Chang19443452018-10-09 12:10:21 +08002146 if (r != null && r.moveFocusableActivityToTop("setFocusedStack")) {
Louis Chang149d5c82019-12-30 09:47:39 +08002147 mRootWindowContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002148 }
2149 }
2150 } finally {
2151 Binder.restoreCallingIdentity(callingId);
2152 }
2153 }
2154
2155 @Override
2156 public void setFocusedTask(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002157 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedTask()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002158 if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedTask: taskId=" + taskId);
2159 final long callingId = Binder.clearCallingIdentity();
2160 try {
2161 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002162 final Task task = mRootWindowContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002163 MATCH_TASK_IN_STACKS_ONLY);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002164 if (task == null) {
2165 return;
2166 }
2167 final ActivityRecord r = task.topRunningActivityLocked();
Louis Chang19443452018-10-09 12:10:21 +08002168 if (r != null && r.moveFocusableActivityToTop("setFocusedTask")) {
Louis Chang149d5c82019-12-30 09:47:39 +08002169 mRootWindowContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002170 }
2171 }
2172 } finally {
2173 Binder.restoreCallingIdentity(callingId);
2174 }
2175 }
2176
2177 @Override
Riddle Hsu7b766fd2019-01-28 21:14:59 +08002178 public void restartActivityProcessIfVisible(IBinder activityToken) {
2179 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "restartActivityProcess()");
2180 final long callingId = Binder.clearCallingIdentity();
2181 try {
2182 synchronized (mGlobalLock) {
2183 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
2184 if (r == null) {
2185 return;
2186 }
2187 r.restartProcessIfVisible();
2188 }
2189 } finally {
2190 Binder.restoreCallingIdentity(callingId);
2191 }
2192 }
2193
2194 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002195 public boolean removeTask(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002196 enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeTask()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002197 synchronized (mGlobalLock) {
2198 final long ident = Binder.clearCallingIdentity();
2199 try {
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09002200 return mStackSupervisor.removeTaskById(taskId, true, REMOVE_FROM_RECENTS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002201 "remove-task");
2202 } finally {
2203 Binder.restoreCallingIdentity(ident);
2204 }
2205 }
2206 }
2207
2208 @Override
Winson Chunge6439102018-07-30 15:48:01 -07002209 public void removeAllVisibleRecentTasks() {
2210 enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeAllVisibleRecentTasks()");
2211 synchronized (mGlobalLock) {
2212 final long ident = Binder.clearCallingIdentity();
2213 try {
Winson Chung42fa21f2019-04-02 16:23:46 -07002214 getRecentTasks().removeAllVisibleTasks(mAmInternal.getCurrentUserId());
Winson Chunge6439102018-07-30 15:48:01 -07002215 } finally {
2216 Binder.restoreCallingIdentity(ident);
2217 }
2218 }
2219 }
2220
2221 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002222 public boolean shouldUpRecreateTask(IBinder token, String destAffinity) {
2223 synchronized (mGlobalLock) {
2224 final ActivityRecord srec = ActivityRecord.forTokenLocked(token);
2225 if (srec != null) {
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002226 return srec.getRootTask().shouldUpRecreateTaskLocked(srec, destAffinity);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002227 }
2228 }
2229 return false;
2230 }
2231
2232 @Override
2233 public boolean navigateUpTo(IBinder token, Intent destIntent, int resultCode,
2234 Intent resultData) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002235
Jeff Sharkey344ce7c2019-05-29 14:52:59 -06002236 synchronized (mGlobalLock) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002237 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
2238 if (r != null) {
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002239 return r.getRootTask().navigateUpTo(
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002240 r, destIntent, resultCode, resultData);
Jeff Sharkey344ce7c2019-05-29 14:52:59 -06002241 }
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002242 return false;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002243 }
2244 }
2245
2246 /**
2247 * Attempts to move a task backwards in z-order (the order of activities within the task is
2248 * unchanged).
2249 *
2250 * There are several possible results of this call:
2251 * - if the task is locked, then we will show the lock toast
2252 * - if there is a task behind the provided task, then that task is made visible and resumed as
2253 * this task is moved to the back
2254 * - otherwise, if there are no other tasks in the stack:
2255 * - if this task is in the pinned stack, then we remove the stack completely, which will
2256 * have the effect of moving the task to the top or bottom of the fullscreen stack
2257 * (depending on whether it is visible)
2258 * - otherwise, we simply return home and hide this task
2259 *
2260 * @param token A reference to the activity we wish to move
2261 * @param nonRoot If false then this only works if the activity is the root
2262 * of a task; if true it will work for any activity in a task.
2263 * @return Returns true if the move completed, false if not.
2264 */
2265 @Override
2266 public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002267 enforceNotIsolatedCaller("moveActivityTaskToBack");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002268 synchronized (mGlobalLock) {
2269 final long origId = Binder.clearCallingIdentity();
2270 try {
2271 int taskId = ActivityRecord.getTaskForActivityLocked(token, !nonRoot);
Louis Chang149d5c82019-12-30 09:47:39 +08002272 final Task task = mRootWindowContainer.anyTaskForId(taskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002273 if (task != null) {
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09002274 return ActivityRecord.getStackLocked(token).moveTaskToBack(task);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002275 }
2276 } finally {
2277 Binder.restoreCallingIdentity(origId);
2278 }
2279 }
2280 return false;
2281 }
2282
2283 @Override
2284 public Rect getTaskBounds(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002285 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "getTaskBounds()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002286 long ident = Binder.clearCallingIdentity();
2287 Rect rect = new Rect();
2288 try {
2289 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002290 final Task task = mRootWindowContainer.anyTaskForId(taskId,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002291 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
2292 if (task == null) {
2293 Slog.w(TAG, "getTaskBounds: taskId=" + taskId + " not found");
2294 return rect;
2295 }
Wale Ogunwale2322bed2019-10-10 17:24:19 +02002296 if (task.getParent() != null) {
2297 rect.set(task.getBounds());
2298 } else if (task.mLastNonFullscreenBounds != null) {
2299 rect.set(task.mLastNonFullscreenBounds);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002300 }
2301 }
2302 } finally {
2303 Binder.restoreCallingIdentity(ident);
2304 }
2305 return rect;
2306 }
2307
2308 @Override
2309 public ActivityManager.TaskDescription getTaskDescription(int id) {
2310 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002311 enforceCallerIsRecentsOrHasPermission(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002312 MANAGE_ACTIVITY_STACKS, "getTaskDescription()");
Louis Chang149d5c82019-12-30 09:47:39 +08002313 final Task tr = mRootWindowContainer.anyTaskForId(id,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002314 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
2315 if (tr != null) {
Wale Ogunwale2322bed2019-10-10 17:24:19 +02002316 return tr.getTaskDescription();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002317 }
2318 }
2319 return null;
2320 }
2321
2322 @Override
Winson Chung7ccc6812020-01-23 16:15:10 -08002323 public boolean setTaskWindowingMode(int taskId, int windowingMode, boolean toTop) {
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002324 if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
Evan Rosky73a7fe92019-11-18 18:28:01 -08002325 return setTaskWindowingModeSplitScreenPrimary(taskId, toTop);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002326 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002327 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setTaskWindowingMode()");
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002328 synchronized (mGlobalLock) {
2329 final long ident = Binder.clearCallingIdentity();
2330 try {
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002331 if (WindowConfiguration.isSplitScreenWindowingMode(windowingMode)) {
2332 return setTaskWindowingModeSplitScreen(taskId, windowingMode, toTop);
2333 }
Louis Chang149d5c82019-12-30 09:47:39 +08002334 final Task task = mRootWindowContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002335 MATCH_TASK_IN_STACKS_ONLY);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002336 if (task == null) {
2337 Slog.w(TAG, "setTaskWindowingMode: No task for id=" + taskId);
Winson Chung7ccc6812020-01-23 16:15:10 -08002338 return false;
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002339 }
2340
2341 if (DEBUG_STACK) Slog.d(TAG_STACK, "setTaskWindowingMode: moving task=" + taskId
2342 + " to windowingMode=" + windowingMode + " toTop=" + toTop);
2343
2344 if (!task.isActivityTypeStandardOrUndefined()) {
2345 throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
2346 + " non-standard task " + taskId + " to windowing mode="
2347 + windowingMode);
2348 }
2349
2350 final ActivityStack stack = task.getStack();
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002351 // Convert some windowing-mode changes into root-task reparents for split-screen.
2352 if (stack.getTile() != null) {
2353 stack.getDisplay().onSplitScreenModeDismissed();
2354 }
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002355 if (toTop) {
2356 stack.moveToFront("setTaskWindowingMode", task);
2357 }
2358 stack.setWindowingMode(windowingMode);
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002359 stack.getDisplay().ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS,
2360 true /* notifyClients */);
Winson Chung7ccc6812020-01-23 16:15:10 -08002361 return true;
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002362 } finally {
2363 Binder.restoreCallingIdentity(ident);
2364 }
2365 }
2366 }
2367
2368 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002369 public String getCallingPackage(IBinder token) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002370 synchronized (mGlobalLock) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002371 ActivityRecord r = getCallingRecordLocked(token);
2372 return r != null ? r.info.packageName : null;
2373 }
2374 }
2375
2376 @Override
2377 public ComponentName getCallingActivity(IBinder token) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002378 synchronized (mGlobalLock) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002379 ActivityRecord r = getCallingRecordLocked(token);
2380 return r != null ? r.intent.getComponent() : null;
2381 }
2382 }
2383
2384 private ActivityRecord getCallingRecordLocked(IBinder token) {
2385 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2386 if (r == null) {
2387 return null;
2388 }
2389 return r.resultTo;
2390 }
2391
2392 @Override
2393 public void unhandledBack() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002394 mAmInternal.enforceCallingPermission(android.Manifest.permission.FORCE_BACK, "unhandledBack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002395
2396 synchronized (mGlobalLock) {
2397 final long origId = Binder.clearCallingIdentity();
2398 try {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08002399 final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
2400 if (topFocusedStack != null) {
2401 topFocusedStack.unhandledBackLocked();
2402 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002403 } finally {
2404 Binder.restoreCallingIdentity(origId);
2405 }
2406 }
2407 }
2408
Mark Renouf446251d2019-04-26 10:22:41 -04002409 @Override
2410 public void onBackPressedOnTaskRoot(IBinder token, IRequestFinishCallback callback) {
2411 synchronized (mGlobalLock) {
2412 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2413 if (r == null) {
2414 return;
2415 }
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002416 ActivityStack stack = r.getRootTask();
Mark Renouf446251d2019-04-26 10:22:41 -04002417 if (stack != null && stack.isSingleTaskInstance()) {
2418 // Single-task stacks are used for activities which are presented in floating
2419 // windows above full screen activities. Instead of directly finishing the
2420 // task, a task change listener is used to notify SystemUI so the action can be
2421 // handled specially.
Louis Changcdec0802019-11-11 11:45:07 +08002422 final Task task = r.getTask();
Mark Renouf446251d2019-04-26 10:22:41 -04002423 mTaskChangeNotificationController
2424 .notifyBackPressedOnTaskRoot(task.getTaskInfo());
2425 } else {
2426 try {
2427 callback.requestFinish();
2428 } catch (RemoteException e) {
2429 Slog.e(TAG, "Failed to invoke request finish callback", e);
2430 }
2431 }
2432 }
2433 }
2434
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002435 /**
2436 * TODO: Add mController hook
2437 */
2438 @Override
Ricky Waiaca8a772019-04-04 16:01:06 +01002439 public void moveTaskToFront(IApplicationThread appThread, String callingPackage, int taskId,
2440 int flags, Bundle bOptions) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002441 mAmInternal.enforceCallingPermission(android.Manifest.permission.REORDER_TASKS, "moveTaskToFront()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002442
2443 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToFront: moving taskId=" + taskId);
2444 synchronized (mGlobalLock) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002445 moveTaskToFrontLocked(appThread, callingPackage, taskId, flags,
2446 SafeActivityOptions.fromBundle(bOptions), false /* fromRecents */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002447 }
2448 }
2449
Ricky Waiaca8a772019-04-04 16:01:06 +01002450 void moveTaskToFrontLocked(@Nullable IApplicationThread appThread,
2451 @Nullable String callingPackage, int taskId, int flags, SafeActivityOptions options,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002452 boolean fromRecents) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002453 final int callingPid = Binder.getCallingPid();
2454 final int callingUid = Binder.getCallingUid();
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07002455 assertPackageMatchesCallingUid(callingPackage);
Ricky Waiaca8a772019-04-04 16:01:06 +01002456 if (!checkAppSwitchAllowedLocked(callingPid, callingUid, -1, -1, "Task to front")) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002457 SafeActivityOptions.abort(options);
2458 return;
2459 }
2460 final long origId = Binder.clearCallingIdentity();
Ricky Waiaca8a772019-04-04 16:01:06 +01002461 WindowProcessController callerApp = null;
2462 if (appThread != null) {
2463 callerApp = getProcessController(appThread);
2464 }
2465 final ActivityStarter starter = getActivityStartController().obtainStarter(
2466 null /* intent */, "moveTaskToFront");
2467 if (starter.shouldAbortBackgroundActivityStart(callingUid, callingPid, callingPackage, -1,
Galia Peycheva6861e912019-08-21 10:20:23 +02002468 -1, callerApp, null, false, false, null)) {
Alan Stokes9e245762019-05-21 14:54:28 +01002469 if (!isBackgroundActivityStartsEnabled()) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002470 return;
2471 }
2472 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002473 try {
Louis Chang149d5c82019-12-30 09:47:39 +08002474 final Task task = mRootWindowContainer.anyTaskForId(taskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002475 if (task == null) {
2476 Slog.d(TAG, "Could not find task for id: "+ taskId);
Winson Chungd0243682018-09-25 18:11:54 -07002477 SafeActivityOptions.abort(options);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002478 return;
2479 }
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07002480 if (getLockTaskController().isLockTaskModeViolation(task)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002481 Slog.e(TAG, "moveTaskToFront: Attempt to violate Lock Task Mode");
Winson Chungd0243682018-09-25 18:11:54 -07002482 SafeActivityOptions.abort(options);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002483 return;
2484 }
2485 ActivityOptions realOptions = options != null
2486 ? options.getOptions(mStackSupervisor)
2487 : null;
2488 mStackSupervisor.findTaskToMoveToFront(task, flags, realOptions, "moveTaskToFront",
2489 false /* forceNonResizable */);
2490
Wale Ogunwale21e06482019-11-18 05:14:15 -08002491 final ActivityRecord topActivity = task.getTopNonFinishingActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002492 if (topActivity != null) {
2493
2494 // We are reshowing a task, use a starting window to hide the initial draw delay
2495 // so the transition can start earlier.
2496 topActivity.showStartingWindow(null /* prev */, false /* newTask */,
2497 true /* taskSwitch */, fromRecents);
2498 }
2499 } finally {
2500 Binder.restoreCallingIdentity(origId);
2501 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002502 }
2503
Ricky Waiaca8a772019-04-04 16:01:06 +01002504 /**
2505 * Return true if callingUid is system, or packageName belongs to that callingUid.
2506 */
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07002507 private boolean isSameApp(int callingUid, @Nullable String packageName) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002508 try {
2509 if (callingUid != 0 && callingUid != SYSTEM_UID) {
2510 if (packageName == null) {
2511 return false;
2512 }
2513 final int uid = AppGlobals.getPackageManager().getPackageUid(packageName,
2514 PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
2515 UserHandle.getUserId(callingUid));
2516 return UserHandle.isSameApp(callingUid, uid);
2517 }
2518 } catch (RemoteException e) {
2519 // Should not happen
2520 }
2521 return true;
2522 }
2523
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07002524 /**
2525 * Checks that the provided package name matches the current calling UID, throws a security
2526 * exception if it doesn't.
2527 */
2528 void assertPackageMatchesCallingUid(@Nullable String packageName) {
2529 final int callingUid = Binder.getCallingUid();
2530 if (isSameApp(callingUid, packageName)) {
2531 return;
2532 }
2533 final String msg = "Permission Denial: package=" + packageName
2534 + " does not belong to uid=" + callingUid;
2535 Slog.w(TAG, msg);
2536 throw new SecurityException(msg);
2537 }
2538
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002539 boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid,
2540 int callingPid, int callingUid, String name) {
2541 if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) {
2542 return true;
2543 }
2544
2545 if (getRecentTasks().isCallerRecents(sourceUid)) {
2546 return true;
2547 }
2548
2549 int perm = checkComponentPermission(STOP_APP_SWITCHES, sourcePid, sourceUid, -1, true);
2550 if (perm == PackageManager.PERMISSION_GRANTED) {
2551 return true;
2552 }
2553 if (checkAllowAppSwitchUid(sourceUid)) {
2554 return true;
2555 }
2556
2557 // If the actual IPC caller is different from the logical source, then
2558 // also see if they are allowed to control app switches.
2559 if (callingUid != -1 && callingUid != sourceUid) {
2560 perm = checkComponentPermission(STOP_APP_SWITCHES, callingPid, callingUid, -1, true);
2561 if (perm == PackageManager.PERMISSION_GRANTED) {
2562 return true;
2563 }
2564 if (checkAllowAppSwitchUid(callingUid)) {
2565 return true;
2566 }
2567 }
2568
2569 Slog.w(TAG, name + " request from " + sourceUid + " stopped");
2570 return false;
2571 }
2572
2573 private boolean checkAllowAppSwitchUid(int uid) {
2574 ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(UserHandle.getUserId(uid));
2575 if (types != null) {
2576 for (int i = types.size() - 1; i >= 0; i--) {
2577 if (types.valueAt(i).intValue() == uid) {
2578 return true;
2579 }
2580 }
2581 }
2582 return false;
2583 }
2584
2585 @Override
2586 public void setActivityController(IActivityController controller, boolean imAMonkey) {
2587 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
2588 "setActivityController()");
2589 synchronized (mGlobalLock) {
2590 mController = controller;
2591 mControllerIsAMonkey = imAMonkey;
2592 Watchdog.getInstance().setActivityController(controller);
2593 }
2594 }
2595
Wale Ogunwale387b34c2018-10-25 19:59:40 -07002596 public boolean isControllerAMonkey() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002597 synchronized (mGlobalLock) {
2598 return mController != null && mControllerIsAMonkey;
2599 }
2600 }
2601
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002602 @Override
2603 public int getTaskForActivity(IBinder token, boolean onlyRoot) {
2604 synchronized (mGlobalLock) {
2605 return ActivityRecord.getTaskForActivityLocked(token, onlyRoot);
2606 }
2607 }
2608
2609 @Override
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002610 public List<ActivityManager.RunningTaskInfo> getTasks(int maxNum) {
2611 return getFilteredTasks(maxNum, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED);
2612 }
2613
2614 @Override
2615 public List<ActivityManager.RunningTaskInfo> getFilteredTasks(int maxNum,
2616 @WindowConfiguration.ActivityType int ignoreActivityType,
2617 @WindowConfiguration.WindowingMode int ignoreWindowingMode) {
2618 final int callingUid = Binder.getCallingUid();
Nicholas Sauer0259e532019-08-30 08:24:55 -07002619 final int callingPid = Binder.getCallingPid();
2620 final boolean crossUser = isCrossUserAllowed(callingPid, callingUid);
Nicholas Sauer3f9249f2019-09-10 20:23:41 -07002621 final int[] profileIds = getUserManager().getProfileIds(
2622 UserHandle.getUserId(callingUid), true);
2623 ArraySet<Integer> callingProfileIds = new ArraySet<>();
2624 for (int i = 0; i < profileIds.length; i++) {
2625 callingProfileIds.add(profileIds[i]);
2626 }
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002627 ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>();
2628
2629 synchronized (mGlobalLock) {
2630 if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum);
2631
Nicholas Sauer0259e532019-08-30 08:24:55 -07002632 final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid);
Louis Chang149d5c82019-12-30 09:47:39 +08002633 mRootWindowContainer.getRunningTasks(maxNum, list, ignoreActivityType,
Nicholas Sauer3f9249f2019-09-10 20:23:41 -07002634 ignoreWindowingMode, callingUid, allowed, crossUser, callingProfileIds);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002635 }
2636
2637 return list;
2638 }
2639
2640 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002641 public final void finishSubActivity(IBinder token, String resultWho, int requestCode) {
2642 synchronized (mGlobalLock) {
2643 final long origId = Binder.clearCallingIdentity();
Wale Ogunwalea38654f2019-11-17 20:37:15 -08002644 try {
2645 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2646 if (r == null) return;
2647
2648 final PooledConsumer c = PooledLambda.obtainConsumer(
2649 ActivityRecord::finishIfSubActivity, PooledLambda.__(ActivityRecord.class),
2650 r, resultWho, requestCode);
2651 // TODO: This should probably only loop over the task since you need to be in the
2652 // same task to return results.
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002653 r.getRootTask().forAllActivities(c);
Wale Ogunwalea38654f2019-11-17 20:37:15 -08002654 c.recycle();
2655
2656 updateOomAdj();
2657 } finally {
2658 Binder.restoreCallingIdentity(origId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002659 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002660 }
2661 }
2662
2663 @Override
2664 public boolean willActivityBeVisible(IBinder token) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002665 synchronized (mGlobalLock) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002666 ActivityStack stack = ActivityRecord.getStackLocked(token);
2667 if (stack != null) {
Wale Ogunwalea38654f2019-11-17 20:37:15 -08002668 return stack.willActivityBeVisible(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002669 }
2670 return false;
2671 }
2672 }
2673
2674 @Override
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002675 public void moveTaskToStack(int taskId, int stackId, boolean toTop) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002676 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "moveTaskToStack()");
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002677 synchronized (mGlobalLock) {
2678 final long ident = Binder.clearCallingIdentity();
2679 try {
Louis Chang149d5c82019-12-30 09:47:39 +08002680 final Task task = mRootWindowContainer.anyTaskForId(taskId);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002681 if (task == null) {
2682 Slog.w(TAG, "moveTaskToStack: No task for id=" + taskId);
2683 return;
2684 }
2685
2686 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToStack: moving task=" + taskId
2687 + " to stackId=" + stackId + " toTop=" + toTop);
2688
Louis Chang149d5c82019-12-30 09:47:39 +08002689 final ActivityStack stack = mRootWindowContainer.getStack(stackId);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002690 if (stack == null) {
2691 throw new IllegalStateException(
2692 "moveTaskToStack: No stack for stackId=" + stackId);
2693 }
2694 if (!stack.isActivityTypeStandardOrUndefined()) {
2695 throw new IllegalArgumentException("moveTaskToStack: Attempt to move task "
2696 + taskId + " to stack " + stackId);
2697 }
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002698 task.reparent(stack, toTop, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE, !DEFER_RESUME,
2699 "moveTaskToStack");
2700 } finally {
2701 Binder.restoreCallingIdentity(ident);
2702 }
2703 }
2704 }
2705
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002706 /**
2707 * Moves the specified task to the primary-split-screen stack.
2708 *
2709 * @param taskId Id of task to move.
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002710 * @param toTop If the task and stack should be moved to the top.
Winson Chung7ccc6812020-01-23 16:15:10 -08002711 * @return Whether the task was successfully put into splitscreen.
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002712 */
2713 @Override
Evan Rosky73a7fe92019-11-18 18:28:01 -08002714 public boolean setTaskWindowingModeSplitScreenPrimary(int taskId, boolean toTop) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002715 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002716 "setTaskWindowingModeSplitScreenPrimary()");
2717 synchronized (mGlobalLock) {
2718 final long ident = Binder.clearCallingIdentity();
2719 try {
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002720 return setTaskWindowingModeSplitScreen(taskId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY,
2721 toTop);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002722 } finally {
2723 Binder.restoreCallingIdentity(ident);
2724 }
2725 }
2726 }
2727
2728 /**
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002729 * Moves the specified task into a split-screen tile.
2730 */
2731 private boolean setTaskWindowingModeSplitScreen(int taskId, int windowingMode, boolean toTop) {
2732 if (!WindowConfiguration.isSplitScreenWindowingMode(windowingMode)) {
2733 throw new IllegalArgumentException("Calling setTaskWindowingModeSplitScreen with non"
2734 + "split-screen mode: " + windowingMode);
2735 }
2736 if (isInLockTaskMode()) {
2737 Slog.w(TAG, "setTaskWindowingModeSplitScreen: Is in lock task mode="
2738 + getLockTaskModeState());
2739 return false;
2740 }
2741
2742 final Task task = mRootWindowContainer.anyTaskForId(taskId,
2743 MATCH_TASK_IN_STACKS_ONLY);
2744 if (task == null) {
2745 Slog.w(TAG, "setTaskWindowingModeSplitScreenPrimary: No task for id=" + taskId);
2746 return false;
2747 }
2748 if (!task.isActivityTypeStandardOrUndefined()) {
2749 throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
2750 + " non-standard task " + taskId + " to split-screen windowing mode");
2751 }
Wale Ogunwale0d465192020-01-23 19:14:44 -08002752 if (!task.supportsSplitScreenWindowingMode()) {
2753 return false;
2754 }
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002755
2756 final int prevMode = task.getWindowingMode();
Wale Ogunwale0d465192020-01-23 19:14:44 -08002757 moveTaskToSplitScreenPrimaryTile(task, toTop);
2758 return prevMode != task.getWindowingMode();
2759 }
2760
2761 void moveTaskToSplitScreenPrimaryTile(Task task, boolean toTop) {
2762 ActivityStack stack = task.getStack();
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002763 TaskTile tile = null;
2764 for (int i = stack.getDisplay().getStackCount() - 1; i >= 0; --i) {
2765 tile = stack.getDisplay().getStackAt(i).asTile();
2766 if (tile != null && tile.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
2767 break;
2768 }
2769 }
2770 if (tile == null) {
2771 throw new IllegalStateException("Can't enter split without associated tile");
2772 }
2773 WindowContainerTransaction wct = new WindowContainerTransaction();
2774 wct.reparent(stack.mRemoteToken, tile.mRemoteToken, toTop);
2775 mTaskOrganizerController.applyContainerTransaction(wct, null);
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002776 }
2777
2778 /**
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002779 * Removes stacks in the input windowing modes from the system if they are of activity type
2780 * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
2781 */
2782 @Override
2783 public void removeStacksInWindowingModes(int[] windowingModes) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002784 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002785 "removeStacksInWindowingModes()");
2786
2787 synchronized (mGlobalLock) {
2788 final long ident = Binder.clearCallingIdentity();
2789 try {
Louis Chang149d5c82019-12-30 09:47:39 +08002790 mRootWindowContainer.removeStacksInWindowingModes(windowingModes);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002791 } finally {
2792 Binder.restoreCallingIdentity(ident);
2793 }
2794 }
2795 }
2796
2797 @Override
2798 public void removeStacksWithActivityTypes(int[] activityTypes) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002799 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002800 "removeStacksWithActivityTypes()");
2801
2802 synchronized (mGlobalLock) {
2803 final long ident = Binder.clearCallingIdentity();
2804 try {
Louis Chang149d5c82019-12-30 09:47:39 +08002805 mRootWindowContainer.removeStacksWithActivityTypes(activityTypes);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002806 } finally {
2807 Binder.restoreCallingIdentity(ident);
2808 }
2809 }
2810 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002811
2812 @Override
2813 public ParceledListSlice<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags,
2814 int userId) {
2815 final int callingUid = Binder.getCallingUid();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002816 userId = handleIncomingUser(Binder.getCallingPid(), callingUid, userId, "getRecentTasks");
2817 final boolean allowed = isGetTasksAllowed("getRecentTasks", Binder.getCallingPid(),
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002818 callingUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002819 synchronized (mGlobalLock) {
Winson Chung66b08f02020-03-03 14:32:35 -08002820 return mRecentTasks.getRecentTasks(maxNum, flags, allowed, userId, callingUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002821 }
2822 }
2823
Evan Rosky29d4a0a2020-02-04 16:40:44 -08002824 // TODO(148895075): deprecate and replace with task equivalents
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002825 @Override
2826 public List<ActivityManager.StackInfo> getAllStackInfos() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002827 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002828 long ident = Binder.clearCallingIdentity();
2829 try {
2830 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002831 return mRootWindowContainer.getAllStackInfos(INVALID_DISPLAY);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002832 }
2833 } finally {
2834 Binder.restoreCallingIdentity(ident);
2835 }
2836 }
2837
2838 @Override
2839 public ActivityManager.StackInfo getStackInfo(int windowingMode, int activityType) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002840 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002841 long ident = Binder.clearCallingIdentity();
2842 try {
2843 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002844 return mRootWindowContainer.getStackInfo(windowingMode, activityType);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002845 }
2846 } finally {
2847 Binder.restoreCallingIdentity(ident);
2848 }
2849 }
2850
Evan Rosky29d4a0a2020-02-04 16:40:44 -08002851 // TODO(148895075): deprecate and replace with task equivalents
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002852 @Override
Evan Roskyfd439692019-11-06 16:12:59 -08002853 public List<ActivityManager.StackInfo> getAllStackInfosOnDisplay(int displayId) {
2854 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getAllStackInfos()");
2855 long ident = Binder.clearCallingIdentity();
2856 try {
2857 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002858 return mRootWindowContainer.getAllStackInfos(displayId);
Evan Roskyfd439692019-11-06 16:12:59 -08002859 }
2860 } finally {
2861 Binder.restoreCallingIdentity(ident);
2862 }
2863 }
2864
2865 @Override
2866 public ActivityManager.StackInfo getStackInfoOnDisplay(int windowingMode, int activityType,
2867 int displayId) {
2868 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
2869 long ident = Binder.clearCallingIdentity();
2870 try {
2871 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002872 return mRootWindowContainer.getStackInfo(windowingMode, activityType, displayId);
Evan Roskyfd439692019-11-06 16:12:59 -08002873 }
2874 } finally {
2875 Binder.restoreCallingIdentity(ident);
2876 }
2877 }
2878
2879 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002880 public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002881 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "cancelRecentsAnimation()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002882 final long callingUid = Binder.getCallingUid();
2883 final long origId = Binder.clearCallingIdentity();
2884 try {
2885 synchronized (mGlobalLock) {
2886 // Cancel the recents animation synchronously (do not hold the WM lock)
Wale Ogunwalea441b922019-06-27 19:21:44 -07002887 mWindowManager.cancelRecentsAnimation(restoreHomeStackPosition
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002888 ? REORDER_MOVE_TO_ORIGINAL_POSITION
2889 : REORDER_KEEP_IN_PLACE, "cancelRecentsAnimation/uid=" + callingUid);
2890 }
2891 } finally {
2892 Binder.restoreCallingIdentity(origId);
2893 }
2894 }
2895
2896 @Override
2897 public void startLockTaskModeByToken(IBinder token) {
2898 synchronized (mGlobalLock) {
2899 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
2900 if (r == null) {
2901 return;
2902 }
Louis Changcdec0802019-11-11 11:45:07 +08002903 startLockTaskModeLocked(r.getTask(), false /* isSystemCaller */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002904 }
2905 }
2906
2907 @Override
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002908 public void startSystemLockTaskMode(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002909 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "startSystemLockTaskMode");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002910 // This makes inner call to look as if it was initiated by system.
2911 long ident = Binder.clearCallingIdentity();
2912 try {
2913 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002914 final Task task = mRootWindowContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002915 MATCH_TASK_IN_STACKS_ONLY);
2916 if (task == null) {
2917 return;
2918 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002919
2920 // When starting lock task mode the stack must be in front and focused
2921 task.getStack().moveToFront("startSystemLockTaskMode");
2922 startLockTaskModeLocked(task, true /* isSystemCaller */);
2923 }
2924 } finally {
2925 Binder.restoreCallingIdentity(ident);
2926 }
2927 }
2928
2929 @Override
2930 public void stopLockTaskModeByToken(IBinder token) {
2931 synchronized (mGlobalLock) {
2932 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
2933 if (r == null) {
2934 return;
2935 }
Louis Changcdec0802019-11-11 11:45:07 +08002936 stopLockTaskModeInternal(r.getTask(), false /* isSystemCaller */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002937 }
2938 }
2939
2940 /**
2941 * This API should be called by SystemUI only when user perform certain action to dismiss
2942 * lock task mode. We should only dismiss pinned lock task mode in this case.
2943 */
2944 @Override
2945 public void stopSystemLockTaskMode() throws RemoteException {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002946 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "stopSystemLockTaskMode");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002947 stopLockTaskModeInternal(null, true /* isSystemCaller */);
2948 }
2949
Louis Changcdec0802019-11-11 11:45:07 +08002950 private void startLockTaskModeLocked(@Nullable Task task, boolean isSystemCaller) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002951 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "startLockTaskModeLocked: " + task);
2952 if (task == null || task.mLockTaskAuth == LOCK_TASK_AUTH_DONT_LOCK) {
2953 return;
2954 }
2955
Louis Chang149d5c82019-12-30 09:47:39 +08002956 final ActivityStack stack = mRootWindowContainer.getTopDisplayFocusedStack();
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09002957 if (stack == null || task != stack.getTopMostTask()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002958 throw new IllegalArgumentException("Invalid task, not in foreground");
2959 }
2960
2961 // {@code isSystemCaller} is used to distinguish whether this request is initiated by the
2962 // system or a specific app.
2963 // * System-initiated requests will only start the pinned mode (screen pinning)
2964 // * App-initiated requests
2965 // - will put the device in fully locked mode (LockTask), if the app is whitelisted
2966 // - will start the pinned mode, otherwise
2967 final int callingUid = Binder.getCallingUid();
2968 long ident = Binder.clearCallingIdentity();
2969 try {
2970 // When a task is locked, dismiss the pinned stack if it exists
Louis Chang149d5c82019-12-30 09:47:39 +08002971 mRootWindowContainer.removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002972
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07002973 getLockTaskController().startLockTaskMode(task, isSystemCaller, callingUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002974 } finally {
2975 Binder.restoreCallingIdentity(ident);
2976 }
2977 }
2978
Louis Changcdec0802019-11-11 11:45:07 +08002979 private void stopLockTaskModeInternal(@Nullable Task task, boolean isSystemCaller) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002980 final int callingUid = Binder.getCallingUid();
2981 long ident = Binder.clearCallingIdentity();
2982 try {
2983 synchronized (mGlobalLock) {
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07002984 getLockTaskController().stopLockTaskMode(task, isSystemCaller, callingUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002985 }
2986 // Launch in-call UI if a call is ongoing. This is necessary to allow stopping the lock
2987 // task and jumping straight into a call in the case of emergency call back.
2988 TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
2989 if (tm != null) {
2990 tm.showInCallScreen(false);
2991 }
2992 } finally {
2993 Binder.restoreCallingIdentity(ident);
2994 }
2995 }
2996
2997 @Override
Wale Ogunwale27c48ae2018-10-25 19:01:01 -07002998 public void updateLockTaskPackages(int userId, String[] packages) {
2999 final int callingUid = Binder.getCallingUid();
3000 if (callingUid != 0 && callingUid != SYSTEM_UID) {
3001 mAmInternal.enforceCallingPermission(Manifest.permission.UPDATE_LOCK_TASK_PACKAGES,
3002 "updateLockTaskPackages()");
3003 }
Riddle Hsu8419e4b2019-09-18 23:28:01 +08003004 synchronized (mGlobalLock) {
Wale Ogunwale27c48ae2018-10-25 19:01:01 -07003005 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "Whitelisting " + userId + ":"
3006 + Arrays.toString(packages));
3007 getLockTaskController().updateLockTaskPackages(userId, packages);
3008 }
3009 }
3010
3011 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003012 public boolean isInLockTaskMode() {
3013 return getLockTaskModeState() != LOCK_TASK_MODE_NONE;
3014 }
3015
3016 @Override
3017 public int getLockTaskModeState() {
3018 synchronized (mGlobalLock) {
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07003019 return getLockTaskController().getLockTaskModeState();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003020 }
3021 }
3022
3023 @Override
3024 public void setTaskDescription(IBinder token, ActivityManager.TaskDescription td) {
3025 synchronized (mGlobalLock) {
3026 ActivityRecord r = ActivityRecord.isInStackLocked(token);
3027 if (r != null) {
3028 r.setTaskDescription(td);
Louis Changcdec0802019-11-11 11:45:07 +08003029 final Task task = r.getTask();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003030 task.updateTaskDescription();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003031 }
3032 }
3033 }
3034
3035 @Override
3036 public Bundle getActivityOptions(IBinder token) {
3037 final long origId = Binder.clearCallingIdentity();
3038 try {
3039 synchronized (mGlobalLock) {
3040 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
3041 if (r != null) {
Jorim Jaggi346702a2019-05-08 17:49:33 +02003042 final ActivityOptions activityOptions = r.takeOptionsLocked(
3043 true /* fromClient */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003044 return activityOptions == null ? null : activityOptions.toBundle();
3045 }
3046 return null;
3047 }
3048 } finally {
3049 Binder.restoreCallingIdentity(origId);
3050 }
3051 }
3052
3053 @Override
3054 public List<IBinder> getAppTasks(String callingPackage) {
3055 int callingUid = Binder.getCallingUid();
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07003056 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003057 long ident = Binder.clearCallingIdentity();
3058 try {
3059 synchronized (mGlobalLock) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07003060 return mRecentTasks.getAppTasksList(callingUid, callingPackage);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003061 }
3062 } finally {
3063 Binder.restoreCallingIdentity(ident);
3064 }
3065 }
3066
3067 @Override
3068 public void finishVoiceTask(IVoiceInteractionSession session) {
3069 synchronized (mGlobalLock) {
3070 final long origId = Binder.clearCallingIdentity();
3071 try {
3072 // TODO: VI Consider treating local voice interactions and voice tasks
3073 // differently here
Louis Chang149d5c82019-12-30 09:47:39 +08003074 mRootWindowContainer.finishVoiceTask(session);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003075 } finally {
3076 Binder.restoreCallingIdentity(origId);
3077 }
3078 }
3079
3080 }
3081
3082 @Override
3083 public boolean isTopOfTask(IBinder token) {
3084 synchronized (mGlobalLock) {
3085 ActivityRecord r = ActivityRecord.isInStackLocked(token);
Wale Ogunwale21e06482019-11-18 05:14:15 -08003086 return r != null && r.getTask().getTopNonFinishingActivity() == r;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003087 }
3088 }
3089
3090 @Override
3091 public void notifyLaunchTaskBehindComplete(IBinder token) {
3092 mStackSupervisor.scheduleLaunchTaskBehindComplete(token);
3093 }
3094
3095 @Override
3096 public void notifyEnterAnimationComplete(IBinder token) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003097 mH.post(() -> {
3098 synchronized (mGlobalLock) {
3099 ActivityRecord r = ActivityRecord.forTokenLocked(token);
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003100 if (r != null && r.attachedToProcess()) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003101 try {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003102 r.app.getThread().scheduleEnterAnimationComplete(r.appToken);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003103 } catch (RemoteException e) {
3104 }
3105 }
3106 }
3107
3108 });
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003109 }
3110
3111 /** Called from an app when assist data is ready. */
3112 @Override
3113 public void reportAssistContextExtras(IBinder token, Bundle extras, AssistStructure structure,
3114 AssistContent content, Uri referrer) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003115 PendingAssistExtras pae = (PendingAssistExtras) token;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003116 synchronized (pae) {
3117 pae.result = extras;
3118 pae.structure = structure;
3119 pae.content = content;
3120 if (referrer != null) {
3121 pae.extras.putParcelable(Intent.EXTRA_REFERRER, referrer);
3122 }
3123 if (structure != null) {
Winson Chung48b25652018-10-22 14:04:30 -07003124 // Pre-fill the task/activity component for all assist data receivers
Louis Changcdec0802019-11-11 11:45:07 +08003125 structure.setTaskId(pae.activity.getTask().mTaskId);
Wale Ogunwale8b19de92018-11-29 19:58:26 -08003126 structure.setActivityComponent(pae.activity.mActivityComponent);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003127 structure.setHomeActivity(pae.isHome);
3128 }
3129 pae.haveResult = true;
3130 pae.notifyAll();
3131 if (pae.intent == null && pae.receiver == null) {
3132 // Caller is just waiting for the result.
3133 return;
3134 }
3135 }
3136 // We are now ready to launch the assist activity.
3137 IAssistDataReceiver sendReceiver = null;
3138 Bundle sendBundle = null;
3139 synchronized (mGlobalLock) {
3140 buildAssistBundleLocked(pae, extras);
3141 boolean exists = mPendingAssistExtras.remove(pae);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003142 mUiHandler.removeCallbacks(pae);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003143 if (!exists) {
3144 // Timed out.
3145 return;
3146 }
3147
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003148 if ((sendReceiver = pae.receiver) != null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003149 // Caller wants result sent back to them.
3150 sendBundle = new Bundle();
Sunny Goyald40c3452019-03-20 12:46:55 -07003151 sendBundle.putInt(ActivityTaskManagerInternal.ASSIST_TASK_ID,
Louis Changcdec0802019-11-11 11:45:07 +08003152 pae.activity.getTask().mTaskId);
Sunny Goyald40c3452019-03-20 12:46:55 -07003153 sendBundle.putBinder(ActivityTaskManagerInternal.ASSIST_ACTIVITY_ID,
3154 pae.activity.assistToken);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003155 sendBundle.putBundle(ASSIST_KEY_DATA, pae.extras);
3156 sendBundle.putParcelable(ASSIST_KEY_STRUCTURE, pae.structure);
3157 sendBundle.putParcelable(ASSIST_KEY_CONTENT, pae.content);
3158 sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras);
3159 }
3160 }
3161 if (sendReceiver != null) {
3162 try {
3163 sendReceiver.onHandleAssistData(sendBundle);
3164 } catch (RemoteException e) {
3165 }
3166 return;
3167 }
3168
3169 final long ident = Binder.clearCallingIdentity();
3170 try {
3171 if (TextUtils.equals(pae.intent.getAction(),
3172 android.service.voice.VoiceInteractionService.SERVICE_INTERFACE)) {
Galia Peychevabffbfc32019-06-18 10:11:35 +02003173 // Start voice interaction through VoiceInteractionManagerService.
3174 mAssistUtils.showSessionForActiveService(sendBundle, SHOW_SOURCE_APPLICATION,
3175 null, null);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003176 } else {
3177 pae.intent.replaceExtras(pae.extras);
3178 pae.intent.setFlags(FLAG_ACTIVITY_NEW_TASK
3179 | Intent.FLAG_ACTIVITY_SINGLE_TOP
3180 | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Wale Ogunwale31913b52018-10-13 08:29:31 -07003181 mInternal.closeSystemDialogs("assist");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003182
3183 try {
3184 mContext.startActivityAsUser(pae.intent, new UserHandle(pae.userHandle));
3185 } catch (ActivityNotFoundException e) {
3186 Slog.w(TAG, "No activity to handle assist action.", e);
3187 }
3188 }
3189 } finally {
3190 Binder.restoreCallingIdentity(ident);
3191 }
3192 }
3193
3194 @Override
3195 public int addAppTask(IBinder activityToken, Intent intent,
3196 ActivityManager.TaskDescription description, Bitmap thumbnail) throws RemoteException {
3197 final int callingUid = Binder.getCallingUid();
3198 final long callingIdent = Binder.clearCallingIdentity();
3199
3200 try {
3201 synchronized (mGlobalLock) {
3202 ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
3203 if (r == null) {
3204 throw new IllegalArgumentException("Activity does not exist; token="
3205 + activityToken);
3206 }
3207 ComponentName comp = intent.getComponent();
3208 if (comp == null) {
3209 throw new IllegalArgumentException("Intent " + intent
3210 + " must specify explicit component");
3211 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003212 if (thumbnail.getWidth() != mThumbnailWidth
3213 || thumbnail.getHeight() != mThumbnailHeight) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003214 throw new IllegalArgumentException("Bad thumbnail size: got "
3215 + thumbnail.getWidth() + "x" + thumbnail.getHeight() + ", require "
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003216 + mThumbnailWidth + "x" + mThumbnailHeight);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003217 }
3218 if (intent.getSelector() != null) {
3219 intent.setSelector(null);
3220 }
3221 if (intent.getSourceBounds() != null) {
3222 intent.setSourceBounds(null);
3223 }
3224 if ((intent.getFlags()&Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0) {
3225 if ((intent.getFlags()&Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS) == 0) {
3226 // The caller has added this as an auto-remove task... that makes no
3227 // sense, so turn off auto-remove.
3228 intent.addFlags(Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
3229 }
3230 }
3231 final ActivityInfo ainfo = AppGlobals.getPackageManager().getActivityInfo(comp,
3232 STOCK_PM_FLAGS, UserHandle.getUserId(callingUid));
3233 if (ainfo.applicationInfo.uid != callingUid) {
3234 throw new SecurityException(
3235 "Can't add task for another application: target uid="
3236 + ainfo.applicationInfo.uid + ", calling uid=" + callingUid);
3237 }
3238
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08003239 final ActivityStack stack = r.getRootTask();
Wale Ogunwale0d465192020-01-23 19:14:44 -08003240 final Task task = stack.getDisplay().createStack(stack.getWindowingMode(),
3241 stack.getActivityType(), !ON_TOP, ainfo, intent);
3242
Wale Ogunwale16e505a2018-05-07 15:00:49 -07003243 if (!mRecentTasks.addToBottom(task)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003244 // The app has too many tasks already and we can't add any more
Wale Ogunwale2322bed2019-10-10 17:24:19 +02003245 stack.removeChild(task, "addAppTask");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003246 return INVALID_TASK_ID;
3247 }
Wale Ogunwale2322bed2019-10-10 17:24:19 +02003248 task.getTaskDescription().copyFrom(description);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003249
3250 // TODO: Send the thumbnail to WM to store it.
3251
Wale Ogunwale4e79a1c2019-10-05 20:52:40 -07003252 return task.mTaskId;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003253 }
3254 } finally {
3255 Binder.restoreCallingIdentity(callingIdent);
3256 }
3257 }
3258
3259 @Override
3260 public Point getAppTaskThumbnailSize() {
3261 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003262 return new Point(mThumbnailWidth, mThumbnailHeight);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003263 }
3264 }
3265
3266 @Override
3267 public void setTaskResizeable(int taskId, int resizeableMode) {
3268 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08003269 final Task task = mRootWindowContainer.anyTaskForId(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003270 taskId, MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
3271 if (task == null) {
3272 Slog.w(TAG, "setTaskResizeable: taskId=" + taskId + " not found");
3273 return;
3274 }
3275 task.setResizeMode(resizeableMode);
3276 }
3277 }
3278
3279 @Override
3280 public void resizeTask(int taskId, Rect bounds, int resizeMode) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003281 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "resizeTask()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003282 long ident = Binder.clearCallingIdentity();
3283 try {
3284 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08003285 final Task task = mRootWindowContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08003286 MATCH_TASK_IN_STACKS_ONLY);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003287 if (task == null) {
3288 Slog.w(TAG, "resizeTask: taskId=" + taskId + " not found");
3289 return;
3290 }
3291 // Place the task in the right stack if it isn't there already based on
3292 // the requested bounds.
3293 // The stack transition logic is:
3294 // - a null bounds on a freeform task moves that task to fullscreen
3295 // - a non-null bounds on a non-freeform (fullscreen OR docked) task moves
3296 // that task to freeform
3297 // - otherwise the task is not moved
3298 ActivityStack stack = task.getStack();
3299 if (!task.getWindowConfiguration().canResizeTask()) {
3300 throw new IllegalArgumentException("resizeTask not allowed on task=" + task);
3301 }
3302 if (bounds == null && stack.getWindowingMode() == WINDOWING_MODE_FREEFORM) {
3303 stack = stack.getDisplay().getOrCreateStack(
3304 WINDOWING_MODE_FULLSCREEN, stack.getActivityType(), ON_TOP);
3305 } else if (bounds != null && stack.getWindowingMode() != WINDOWING_MODE_FREEFORM) {
3306 stack = stack.getDisplay().getOrCreateStack(
3307 WINDOWING_MODE_FREEFORM, stack.getActivityType(), ON_TOP);
3308 }
3309
3310 // Reparent the task to the right stack if necessary
3311 boolean preserveWindow = (resizeMode & RESIZE_MODE_PRESERVE_WINDOW) != 0;
3312 if (stack != task.getStack()) {
3313 // Defer resume until the task is resized below
3314 task.reparent(stack, ON_TOP, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE,
3315 DEFER_RESUME, "resizeTask");
3316 preserveWindow = false;
3317 }
3318
3319 // After reparenting (which only resizes the task to the stack bounds), resize the
3320 // task to the actual bounds provided
3321 task.resize(bounds, resizeMode, preserveWindow, !DEFER_RESUME);
3322 }
3323 } finally {
3324 Binder.restoreCallingIdentity(ident);
3325 }
3326 }
3327
3328 @Override
3329 public boolean releaseActivityInstance(IBinder token) {
3330 synchronized (mGlobalLock) {
3331 final long origId = Binder.clearCallingIdentity();
3332 try {
Andrii Kulianf49a58c2019-08-14 17:34:27 -07003333 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
3334 if (r == null || !r.isDestroyable()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003335 return false;
3336 }
Andrii Kulianf49a58c2019-08-14 17:34:27 -07003337 r.destroyImmediately(true /* removeFromApp */, "app-req");
3338 return r.isState(DESTROYING, DESTROYED);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003339 } finally {
3340 Binder.restoreCallingIdentity(origId);
3341 }
3342 }
3343 }
3344
3345 @Override
3346 public void releaseSomeActivities(IApplicationThread appInt) {
3347 synchronized (mGlobalLock) {
3348 final long origId = Binder.clearCallingIdentity();
3349 try {
Wale Ogunwale342fbe92018-10-09 08:44:10 -07003350 final WindowProcessController app = getProcessController(appInt);
Wale Ogunwalea38654f2019-11-17 20:37:15 -08003351 app.releaseSomeActivities("low-mem");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003352 } finally {
3353 Binder.restoreCallingIdentity(origId);
3354 }
3355 }
3356 }
3357
3358 @Override
wilsonshih177261f2019-02-22 12:02:18 +08003359 public void setLockScreenShown(boolean keyguardShowing, boolean aodShowing) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003360 if (checkCallingPermission(android.Manifest.permission.DEVICE_POWER)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003361 != PackageManager.PERMISSION_GRANTED) {
3362 throw new SecurityException("Requires permission "
3363 + android.Manifest.permission.DEVICE_POWER);
3364 }
3365
3366 synchronized (mGlobalLock) {
3367 long ident = Binder.clearCallingIdentity();
3368 if (mKeyguardShown != keyguardShowing) {
3369 mKeyguardShown = keyguardShowing;
Wale Ogunwale342fbe92018-10-09 08:44:10 -07003370 final Message msg = PooledLambda.obtainMessage(
3371 ActivityManagerInternal::reportCurKeyguardUsageEvent, mAmInternal,
3372 keyguardShowing);
3373 mH.sendMessage(msg);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003374 }
3375 try {
wilsonshih177261f2019-02-22 12:02:18 +08003376 mKeyguardController.setKeyguardShown(keyguardShowing, aodShowing);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003377 } finally {
3378 Binder.restoreCallingIdentity(ident);
3379 }
3380 }
3381
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003382 mH.post(() -> {
3383 for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
3384 mScreenObservers.get(i).onKeyguardStateChanged(keyguardShowing);
3385 }
3386 });
3387 }
3388
Wale Ogunwale387b34c2018-10-25 19:59:40 -07003389 public void onScreenAwakeChanged(boolean isAwake) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003390 mH.post(() -> {
3391 for (int i = mScreenObservers.size() - 1; i >= 0; i--) {
3392 mScreenObservers.get(i).onAwakeStateChanged(isAwake);
3393 }
3394 });
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003395 }
3396
3397 @Override
3398 public Bitmap getTaskDescriptionIcon(String filePath, int userId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003399 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
3400 userId, "getTaskDescriptionIcon");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003401
3402 final File passedIconFile = new File(filePath);
3403 final File legitIconFile = new File(TaskPersister.getUserImagesDir(userId),
3404 passedIconFile.getName());
3405 if (!legitIconFile.getPath().equals(filePath)
3406 || !filePath.contains(ActivityRecord.ACTIVITY_ICON_SUFFIX)) {
3407 throw new IllegalArgumentException("Bad file path: " + filePath
3408 + " passed for userId " + userId);
3409 }
Wale Ogunwale16e505a2018-05-07 15:00:49 -07003410 return mRecentTasks.getTaskDescriptionIcon(filePath);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003411 }
3412
3413 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003414 public void removeStack(int stackId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003415 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "removeStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003416 synchronized (mGlobalLock) {
3417 final long ident = Binder.clearCallingIdentity();
3418 try {
Louis Chang149d5c82019-12-30 09:47:39 +08003419 final ActivityStack stack = mRootWindowContainer.getStack(stackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003420 if (stack == null) {
3421 Slog.w(TAG, "removeStack: No stack with id=" + stackId);
3422 return;
3423 }
3424 if (!stack.isActivityTypeStandardOrUndefined()) {
3425 throw new IllegalArgumentException(
3426 "Removing non-standard stack is not allowed.");
3427 }
3428 mStackSupervisor.removeStack(stack);
3429 } finally {
3430 Binder.restoreCallingIdentity(ident);
3431 }
3432 }
3433 }
3434
3435 @Override
3436 public void moveStackToDisplay(int stackId, int displayId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003437 mAmInternal.enforceCallingPermission(INTERNAL_SYSTEM_WINDOW, "moveStackToDisplay()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003438
3439 synchronized (mGlobalLock) {
3440 final long ident = Binder.clearCallingIdentity();
3441 try {
3442 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveStackToDisplay: moving stackId=" + stackId
3443 + " to displayId=" + displayId);
Louis Chang149d5c82019-12-30 09:47:39 +08003444 mRootWindowContainer.moveStackToDisplay(stackId, displayId, ON_TOP);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003445 } finally {
3446 Binder.restoreCallingIdentity(ident);
3447 }
3448 }
3449 }
3450
3451 @Override
Yunfan Chend967af82019-01-17 18:30:18 +09003452 public void toggleFreeformWindowingMode(IBinder token) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003453 synchronized (mGlobalLock) {
3454 long ident = Binder.clearCallingIdentity();
3455 try {
3456 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
3457 if (r == null) {
3458 throw new IllegalArgumentException(
Yunfan Chend967af82019-01-17 18:30:18 +09003459 "toggleFreeformWindowingMode: No activity record matching token="
3460 + token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003461 }
3462
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08003463 final ActivityStack stack = r.getRootTask();
Yunfan Chend967af82019-01-17 18:30:18 +09003464 if (stack == null) {
3465 throw new IllegalStateException("toggleFreeformWindowingMode: the activity "
3466 + "doesn't have a stack");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003467 }
3468
Yunfan Chend967af82019-01-17 18:30:18 +09003469 if (!stack.inFreeformWindowingMode()
3470 && stack.getWindowingMode() != WINDOWING_MODE_FULLSCREEN) {
3471 throw new IllegalStateException("toggleFreeformWindowingMode: You can only "
3472 + "toggle between fullscreen and freeform.");
3473 }
3474
3475 if (stack.inFreeformWindowingMode()) {
3476 stack.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
Evan Rosky3a8d7fe2019-11-06 17:08:35 -08003477 } else if (!mSizeCompatFreeform && r.inSizeCompatMode()) {
Shivam Agrawal780b5bb2019-07-17 10:17:11 -07003478 throw new IllegalStateException("Size-compat windows are currently not"
3479 + "freeform-enabled");
Yunfan Chene9c1c312019-04-18 14:49:15 +09003480 } else if (stack.getParent().inFreeformWindowingMode()) {
3481 // If the window is on a freeform display, set it to undefined. It will be
3482 // resolved to freeform and it can adjust windowing mode when the display mode
3483 // changes in runtime.
3484 stack.setWindowingMode(WINDOWING_MODE_UNDEFINED);
Yunfan Chend967af82019-01-17 18:30:18 +09003485 } else {
3486 stack.setWindowingMode(WINDOWING_MODE_FREEFORM);
3487 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003488 } finally {
3489 Binder.restoreCallingIdentity(ident);
3490 }
3491 }
3492 }
3493
3494 /** Sets the task stack listener that gets callbacks when a task stack changes. */
3495 @Override
3496 public void registerTaskStackListener(ITaskStackListener listener) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003497 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003498 "registerTaskStackListener()");
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003499 mTaskChangeNotificationController.registerTaskStackListener(listener);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003500 }
3501
3502 /** Unregister a task stack listener so that it stops receiving callbacks. */
3503 @Override
3504 public void unregisterTaskStackListener(ITaskStackListener listener) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003505 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003506 "unregisterTaskStackListener()");
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003507 mTaskChangeNotificationController.unregisterTaskStackListener(listener);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003508 }
3509
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003510 @Override
3511 public boolean requestAssistContextExtras(int requestType, IAssistDataReceiver receiver,
3512 Bundle receiverExtras, IBinder activityToken, boolean focused, boolean newSessionId) {
3513 return enqueueAssistContext(requestType, null, null, receiver, receiverExtras,
3514 activityToken, focused, newSessionId, UserHandle.getCallingUserId(), null,
3515 PENDING_ASSIST_EXTRAS_LONG_TIMEOUT, 0) != null;
3516 }
3517
3518 @Override
3519 public boolean requestAutofillData(IAssistDataReceiver receiver, Bundle receiverExtras,
3520 IBinder activityToken, int flags) {
3521 return enqueueAssistContext(ActivityManager.ASSIST_CONTEXT_AUTOFILL, null, null,
3522 receiver, receiverExtras, activityToken, true, true, UserHandle.getCallingUserId(),
3523 null, PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT, flags) != null;
3524 }
3525
3526 @Override
3527 public boolean launchAssistIntent(Intent intent, int requestType, String hint, int userHandle,
3528 Bundle args) {
3529 return enqueueAssistContext(requestType, intent, hint, null, null, null,
3530 true /* focused */, true /* newSessionId */, userHandle, args,
3531 PENDING_ASSIST_EXTRAS_TIMEOUT, 0) != null;
3532 }
3533
3534 @Override
3535 public Bundle getAssistContextExtras(int requestType) {
3536 PendingAssistExtras pae = enqueueAssistContext(requestType, null, null, null,
3537 null, null, true /* focused */, true /* newSessionId */,
3538 UserHandle.getCallingUserId(), null, PENDING_ASSIST_EXTRAS_TIMEOUT, 0);
3539 if (pae == null) {
3540 return null;
3541 }
3542 synchronized (pae) {
3543 while (!pae.haveResult) {
3544 try {
3545 pae.wait();
3546 } catch (InterruptedException e) {
3547 }
3548 }
3549 }
3550 synchronized (mGlobalLock) {
3551 buildAssistBundleLocked(pae, pae.result);
3552 mPendingAssistExtras.remove(pae);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003553 mUiHandler.removeCallbacks(pae);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003554 }
3555 return pae.extras;
3556 }
3557
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003558 /**
3559 * Binder IPC calls go through the public entry point.
3560 * This can be called with or without the global lock held.
3561 */
3562 private static int checkCallingPermission(String permission) {
3563 return checkPermission(
3564 permission, Binder.getCallingPid(), UserHandle.getAppId(Binder.getCallingUid()));
3565 }
3566
3567 /** This can be called with or without the global lock held. */
Wale Ogunwale214f3482018-10-04 11:00:47 -07003568 private void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003569 if (!getRecentTasks().isCallerRecents(Binder.getCallingUid())) {
3570 mAmInternal.enforceCallingPermission(permission, func);
3571 }
3572 }
3573
3574 @VisibleForTesting
3575 int checkGetTasksPermission(String permission, int pid, int uid) {
3576 return checkPermission(permission, pid, uid);
3577 }
3578
3579 static int checkPermission(String permission, int pid, int uid) {
3580 if (permission == null) {
3581 return PackageManager.PERMISSION_DENIED;
3582 }
3583 return checkComponentPermission(permission, pid, uid, -1, true);
3584 }
3585
Wale Ogunwale214f3482018-10-04 11:00:47 -07003586 public static int checkComponentPermission(String permission, int pid, int uid,
3587 int owningUid, boolean exported) {
3588 return ActivityManagerService.checkComponentPermission(
3589 permission, pid, uid, owningUid, exported);
3590 }
3591
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003592 boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
3593 if (getRecentTasks().isCallerRecents(callingUid)) {
3594 // Always allow the recents component to get tasks
3595 return true;
3596 }
3597
3598 boolean allowed = checkGetTasksPermission(android.Manifest.permission.REAL_GET_TASKS,
3599 callingPid, callingUid) == PackageManager.PERMISSION_GRANTED;
3600 if (!allowed) {
3601 if (checkGetTasksPermission(android.Manifest.permission.GET_TASKS,
3602 callingPid, callingUid) == PackageManager.PERMISSION_GRANTED) {
3603 // Temporary compatibility: some existing apps on the system image may
3604 // still be requesting the old permission and not switched to the new
3605 // one; if so, we'll still allow them full access. This means we need
3606 // to see if they are holding the old permission and are a system app.
3607 try {
3608 if (AppGlobals.getPackageManager().isUidPrivileged(callingUid)) {
3609 allowed = true;
3610 if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid
3611 + " is using old GET_TASKS but privileged; allowing");
3612 }
3613 } catch (RemoteException e) {
3614 }
3615 }
3616 if (DEBUG_TASKS) Slog.w(TAG, caller + ": caller " + callingUid
3617 + " does not hold REAL_GET_TASKS; limiting output");
3618 }
3619 return allowed;
3620 }
3621
Nicholas Sauer0259e532019-08-30 08:24:55 -07003622 boolean isCrossUserAllowed(int pid, int uid) {
3623 return checkPermission(INTERACT_ACROSS_USERS, pid, uid) == PERMISSION_GRANTED
3624 || checkPermission(INTERACT_ACROSS_USERS_FULL, pid, uid) == PERMISSION_GRANTED;
3625 }
3626
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003627 private PendingAssistExtras enqueueAssistContext(int requestType, Intent intent, String hint,
3628 IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken,
3629 boolean focused, boolean newSessionId, int userHandle, Bundle args, long timeout,
3630 int flags) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003631 mAmInternal.enforceCallingPermission(android.Manifest.permission.GET_TOP_ACTIVITY_INFO,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003632 "enqueueAssistContext()");
3633
3634 synchronized (mGlobalLock) {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08003635 final ActivityStack stack = getTopDisplayFocusedStack();
3636 ActivityRecord activity = stack != null ? stack.getTopNonFinishingActivity() : null;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003637 if (activity == null) {
3638 Slog.w(TAG, "getAssistContextExtras failed: no top activity");
3639 return null;
3640 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003641 if (!activity.attachedToProcess()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003642 Slog.w(TAG, "getAssistContextExtras failed: no process for " + activity);
3643 return null;
3644 }
3645 if (focused) {
3646 if (activityToken != null) {
3647 ActivityRecord caller = ActivityRecord.forTokenLocked(activityToken);
3648 if (activity != caller) {
3649 Slog.w(TAG, "enqueueAssistContext failed: caller " + caller
3650 + " is not current top " + activity);
3651 return null;
3652 }
3653 }
3654 } else {
3655 activity = ActivityRecord.forTokenLocked(activityToken);
3656 if (activity == null) {
3657 Slog.w(TAG, "enqueueAssistContext failed: activity for token=" + activityToken
3658 + " couldn't be found");
3659 return null;
3660 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003661 if (!activity.attachedToProcess()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003662 Slog.w(TAG, "enqueueAssistContext failed: no process for " + activity);
3663 return null;
3664 }
3665 }
3666
3667 PendingAssistExtras pae;
3668 Bundle extras = new Bundle();
3669 if (args != null) {
3670 extras.putAll(args);
3671 }
3672 extras.putString(Intent.EXTRA_ASSIST_PACKAGE, activity.packageName);
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003673 extras.putInt(Intent.EXTRA_ASSIST_UID, activity.app.mUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003674
3675 pae = new PendingAssistExtras(activity, extras, intent, hint, receiver, receiverExtras,
3676 userHandle);
3677 pae.isHome = activity.isActivityTypeHome();
3678
3679 // Increment the sessionId if necessary
3680 if (newSessionId) {
3681 mViSessionId++;
3682 }
3683 try {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07003684 activity.app.getThread().requestAssistContextExtras(activity.appToken, pae,
3685 requestType, mViSessionId, flags);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003686 mPendingAssistExtras.add(pae);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003687 mUiHandler.postDelayed(pae, timeout);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003688 } catch (RemoteException e) {
3689 Slog.w(TAG, "getAssistContextExtras failed: crash calling " + activity);
3690 return null;
3691 }
3692 return pae;
3693 }
3694 }
3695
3696 private void buildAssistBundleLocked(PendingAssistExtras pae, Bundle result) {
3697 if (result != null) {
3698 pae.extras.putBundle(Intent.EXTRA_ASSIST_CONTEXT, result);
3699 }
3700 if (pae.hint != null) {
3701 pae.extras.putBoolean(pae.hint, true);
3702 }
3703 }
3704
3705 private void pendingAssistExtrasTimedOut(PendingAssistExtras pae) {
3706 IAssistDataReceiver receiver;
3707 synchronized (mGlobalLock) {
3708 mPendingAssistExtras.remove(pae);
3709 receiver = pae.receiver;
3710 }
3711 if (receiver != null) {
3712 // Caller wants result sent back to them.
3713 Bundle sendBundle = new Bundle();
3714 // At least return the receiver extras
3715 sendBundle.putBundle(ASSIST_KEY_RECEIVER_EXTRAS, pae.receiverExtras);
3716 try {
3717 pae.receiver.onHandleAssistData(sendBundle);
3718 } catch (RemoteException e) {
3719 }
3720 }
3721 }
3722
3723 public class PendingAssistExtras extends Binder implements Runnable {
3724 public final ActivityRecord activity;
3725 public boolean isHome;
3726 public final Bundle extras;
3727 public final Intent intent;
3728 public final String hint;
3729 public final IAssistDataReceiver receiver;
3730 public final int userHandle;
3731 public boolean haveResult = false;
3732 public Bundle result = null;
3733 public AssistStructure structure = null;
3734 public AssistContent content = null;
3735 public Bundle receiverExtras;
3736
3737 public PendingAssistExtras(ActivityRecord _activity, Bundle _extras, Intent _intent,
3738 String _hint, IAssistDataReceiver _receiver, Bundle _receiverExtras,
3739 int _userHandle) {
3740 activity = _activity;
3741 extras = _extras;
3742 intent = _intent;
3743 hint = _hint;
3744 receiver = _receiver;
3745 receiverExtras = _receiverExtras;
3746 userHandle = _userHandle;
3747 }
3748
3749 @Override
3750 public void run() {
3751 Slog.w(TAG, "getAssistContextExtras failed: timeout retrieving from " + activity);
3752 synchronized (this) {
3753 haveResult = true;
3754 notifyAll();
3755 }
3756 pendingAssistExtrasTimedOut(this);
3757 }
3758 }
3759
3760 @Override
3761 public boolean isAssistDataAllowedOnCurrentActivity() {
3762 int userId;
3763 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07003764 final ActivityStack focusedStack = getTopDisplayFocusedStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003765 if (focusedStack == null || focusedStack.isActivityTypeAssistant()) {
3766 return false;
3767 }
3768
Wale Ogunwale21e06482019-11-18 05:14:15 -08003769 final ActivityRecord activity = focusedStack.getTopNonFinishingActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003770 if (activity == null) {
3771 return false;
3772 }
Wale Ogunwale8b19de92018-11-29 19:58:26 -08003773 userId = activity.mUserId;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003774 }
3775 return !DevicePolicyCache.getInstance().getScreenCaptureDisabled(userId);
3776 }
3777
3778 @Override
3779 public boolean showAssistFromActivity(IBinder token, Bundle args) {
3780 long ident = Binder.clearCallingIdentity();
3781 try {
3782 synchronized (mGlobalLock) {
3783 ActivityRecord caller = ActivityRecord.forTokenLocked(token);
Wale Ogunwale21e06482019-11-18 05:14:15 -08003784 ActivityRecord top = getTopDisplayFocusedStack().getTopNonFinishingActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003785 if (top != caller) {
3786 Slog.w(TAG, "showAssistFromActivity failed: caller " + caller
3787 + " is not current top " + top);
3788 return false;
3789 }
3790 if (!top.nowVisible) {
3791 Slog.w(TAG, "showAssistFromActivity failed: caller " + caller
3792 + " is not visible");
3793 return false;
3794 }
3795 }
3796 return mAssistUtils.showSessionForActiveService(args, SHOW_SOURCE_APPLICATION, null,
3797 token);
3798 } finally {
3799 Binder.restoreCallingIdentity(ident);
3800 }
3801 }
3802
3803 @Override
3804 public boolean isRootVoiceInteraction(IBinder token) {
3805 synchronized (mGlobalLock) {
3806 ActivityRecord r = ActivityRecord.isInStackLocked(token);
3807 if (r == null) {
3808 return false;
3809 }
3810 return r.rootVoiceInteraction;
3811 }
3812 }
3813
Wale Ogunwalef6733932018-06-27 05:14:34 -07003814 private void onLocalVoiceInteractionStartedLocked(IBinder activity,
3815 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
3816 ActivityRecord activityToCallback = ActivityRecord.forTokenLocked(activity);
3817 if (activityToCallback == null) return;
3818 activityToCallback.setVoiceSessionLocked(voiceSession);
3819
3820 // Inform the activity
3821 try {
3822 activityToCallback.app.getThread().scheduleLocalVoiceInteractionStarted(activity,
3823 voiceInteractor);
3824 long token = Binder.clearCallingIdentity();
3825 try {
Andrii Kulianeceebbf2019-06-26 17:36:51 -07003826 startRunningVoiceLocked(voiceSession, activityToCallback.info.applicationInfo.uid);
Wale Ogunwalef6733932018-06-27 05:14:34 -07003827 } finally {
3828 Binder.restoreCallingIdentity(token);
3829 }
3830 // TODO: VI Should we cache the activity so that it's easier to find later
3831 // rather than scan through all the stacks and activities?
3832 } catch (RemoteException re) {
3833 activityToCallback.clearVoiceSessionLocked();
3834 // TODO: VI Should this terminate the voice session?
3835 }
3836 }
3837
3838 private void startRunningVoiceLocked(IVoiceInteractionSession session, int targetUid) {
3839 Slog.d(TAG, "<<< startRunningVoiceLocked()");
3840 mVoiceWakeLock.setWorkSource(new WorkSource(targetUid));
3841 if (mRunningVoice == null || mRunningVoice.asBinder() != session.asBinder()) {
3842 boolean wasRunningVoice = mRunningVoice != null;
3843 mRunningVoice = session;
3844 if (!wasRunningVoice) {
3845 mVoiceWakeLock.acquire();
3846 updateSleepIfNeededLocked();
3847 }
3848 }
3849 }
3850
3851 void finishRunningVoiceLocked() {
3852 if (mRunningVoice != null) {
3853 mRunningVoice = null;
3854 mVoiceWakeLock.release();
3855 updateSleepIfNeededLocked();
3856 }
3857 }
3858
3859 @Override
3860 public void setVoiceKeepAwake(IVoiceInteractionSession session, boolean keepAwake) {
3861 synchronized (mGlobalLock) {
3862 if (mRunningVoice != null && mRunningVoice.asBinder() == session.asBinder()) {
3863 if (keepAwake) {
3864 mVoiceWakeLock.acquire();
3865 } else {
3866 mVoiceWakeLock.release();
3867 }
3868 }
3869 }
3870 }
3871
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003872 @Override
3873 public ComponentName getActivityClassForToken(IBinder token) {
3874 synchronized (mGlobalLock) {
3875 ActivityRecord r = ActivityRecord.isInStackLocked(token);
3876 if (r == null) {
3877 return null;
3878 }
3879 return r.intent.getComponent();
3880 }
3881 }
3882
3883 @Override
3884 public String getPackageForToken(IBinder token) {
3885 synchronized (mGlobalLock) {
3886 ActivityRecord r = ActivityRecord.isInStackLocked(token);
3887 if (r == null) {
3888 return null;
3889 }
3890 return r.packageName;
3891 }
3892 }
3893
3894 @Override
3895 public void showLockTaskEscapeMessage(IBinder token) {
3896 synchronized (mGlobalLock) {
3897 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
3898 if (r == null) {
3899 return;
3900 }
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07003901 getLockTaskController().showLockTaskToast();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003902 }
3903 }
3904
3905 @Override
3906 public void keyguardGoingAway(int flags) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003907 enforceNotIsolatedCaller("keyguardGoingAway");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003908 final long token = Binder.clearCallingIdentity();
3909 try {
3910 synchronized (mGlobalLock) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07003911 mKeyguardController.keyguardGoingAway(flags);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003912 }
3913 } finally {
3914 Binder.restoreCallingIdentity(token);
3915 }
3916 }
3917
3918 /**
3919 * Try to place task to provided position. The final position might be different depending on
3920 * current user and stacks state. The task will be moved to target stack if it's currently in
3921 * different stack.
3922 */
3923 @Override
3924 public void positionTaskInStack(int taskId, int stackId, int position) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003925 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "positionTaskInStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003926 synchronized (mGlobalLock) {
3927 long ident = Binder.clearCallingIdentity();
3928 try {
3929 if (DEBUG_STACK) Slog.d(TAG_STACK, "positionTaskInStack: positioning task="
3930 + taskId + " in stackId=" + stackId + " at position=" + position);
Louis Chang149d5c82019-12-30 09:47:39 +08003931 final Task task = mRootWindowContainer.anyTaskForId(taskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003932 if (task == null) {
3933 throw new IllegalArgumentException("positionTaskInStack: no task for id="
3934 + taskId);
3935 }
3936
Louis Chang149d5c82019-12-30 09:47:39 +08003937 final ActivityStack stack = mRootWindowContainer.getStack(stackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003938
3939 if (stack == null) {
3940 throw new IllegalArgumentException("positionTaskInStack: no stack for id="
3941 + stackId);
3942 }
3943 if (!stack.isActivityTypeStandardOrUndefined()) {
3944 throw new IllegalArgumentException("positionTaskInStack: Attempt to change"
3945 + " the position of task " + taskId + " in/to non-standard stack");
3946 }
3947
3948 // TODO: Have the callers of this API call a separate reparent method if that is
3949 // what they intended to do vs. having this method also do reparenting.
3950 if (task.getStack() == stack) {
3951 // Change position in current stack.
3952 stack.positionChildAt(task, position);
3953 } else {
3954 // Reparent to new stack.
3955 task.reparent(stack, position, REPARENT_LEAVE_STACK_IN_PLACE, !ANIMATE,
3956 !DEFER_RESUME, "positionTaskInStack");
3957 }
3958 } finally {
3959 Binder.restoreCallingIdentity(ident);
3960 }
3961 }
3962 }
3963
3964 @Override
3965 public void reportSizeConfigurations(IBinder token, int[] horizontalSizeConfiguration,
3966 int[] verticalSizeConfigurations, int[] smallestSizeConfigurations) {
3967 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Report configuration: " + token + " "
Yuichiro Hanadae7e930b2019-06-06 19:07:21 +09003968 + Arrays.toString(horizontalSizeConfiguration) + " "
3969 + Arrays.toString(verticalSizeConfigurations));
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003970 synchronized (mGlobalLock) {
3971 ActivityRecord record = ActivityRecord.isInStackLocked(token);
3972 if (record == null) {
3973 throw new IllegalArgumentException("reportSizeConfigurations: ActivityRecord not "
3974 + "found for: " + token);
3975 }
3976 record.setSizeConfigurations(horizontalSizeConfiguration,
3977 verticalSizeConfigurations, smallestSizeConfigurations);
3978 }
3979 }
3980
3981 /**
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003982 * Dismisses Pip
3983 * @param animate True if the dismissal should be animated.
3984 * @param animationDuration The duration of the resize animation in milliseconds or -1 if the
3985 * default animation duration should be used.
3986 */
3987 @Override
3988 public void dismissPip(boolean animate, int animationDuration) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07003989 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "dismissPip()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003990 final long ident = Binder.clearCallingIdentity();
3991 try {
3992 synchronized (mGlobalLock) {
Yunfan Chen279f5582018-12-12 15:24:50 -08003993 final ActivityStack stack =
Wale Ogunwale734b8962020-01-21 12:17:42 -08003994 mRootWindowContainer.getDefaultDisplay().getRootPinnedTask();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07003995 if (stack == null) {
3996 Slog.w(TAG, "dismissPip: pinned stack not found.");
3997 return;
3998 }
3999 if (stack.getWindowingMode() != WINDOWING_MODE_PINNED) {
4000 throw new IllegalArgumentException("Stack: " + stack
4001 + " doesn't support animated resize.");
4002 }
Hongwei Wang85cf41f2020-01-15 15:14:47 -08004003 stack.dismissPip();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004004 }
4005 } finally {
4006 Binder.restoreCallingIdentity(ident);
4007 }
4008 }
4009
4010 @Override
4011 public void suppressResizeConfigChanges(boolean suppress) throws RemoteException {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004012 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "suppressResizeConfigChanges()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004013 synchronized (mGlobalLock) {
4014 mSuppressResizeConfigChanges = suppress;
4015 }
4016 }
4017
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004018 @Override
4019 // TODO: API should just be about changing windowing modes...
4020 public void moveTasksToFullscreenStack(int fromStackId, boolean onTop) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004021 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004022 "moveTasksToFullscreenStack()");
4023 synchronized (mGlobalLock) {
4024 final long origId = Binder.clearCallingIdentity();
4025 try {
Louis Chang149d5c82019-12-30 09:47:39 +08004026 final ActivityStack stack = mRootWindowContainer.getStack(fromStackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004027 if (stack != null){
4028 if (!stack.isActivityTypeStandardOrUndefined()) {
4029 throw new IllegalArgumentException(
4030 "You can't move tasks from non-standard stacks.");
4031 }
4032 mStackSupervisor.moveTasksToFullscreenStackLocked(stack, onTop);
4033 }
4034 } finally {
4035 Binder.restoreCallingIdentity(origId);
4036 }
4037 }
4038 }
4039
4040 /**
4041 * Moves the top activity in the input stackId to the pinned stack.
4042 *
4043 * @param stackId Id of stack to move the top activity to pinned stack.
4044 * @param bounds Bounds to use for pinned stack.
4045 *
4046 * @return True if the top activity of the input stack was successfully moved to the pinned
4047 * stack.
4048 */
4049 @Override
4050 public boolean moveTopActivityToPinnedStack(int stackId, Rect bounds) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004051 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004052 "moveTopActivityToPinnedStack()");
4053 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004054 if (!mSupportsPictureInPicture) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004055 throw new IllegalStateException("moveTopActivityToPinnedStack:"
4056 + "Device doesn't support picture-in-picture mode");
4057 }
4058
4059 long ident = Binder.clearCallingIdentity();
4060 try {
Louis Chang149d5c82019-12-30 09:47:39 +08004061 return mRootWindowContainer.moveTopStackActivityToPinnedStack(stackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004062 } finally {
4063 Binder.restoreCallingIdentity(ident);
4064 }
4065 }
4066 }
4067
4068 @Override
4069 public boolean isInMultiWindowMode(IBinder token) {
4070 final long origId = Binder.clearCallingIdentity();
4071 try {
4072 synchronized (mGlobalLock) {
4073 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4074 if (r == null) {
4075 return false;
4076 }
4077 // An activity is consider to be in multi-window mode if its task isn't fullscreen.
4078 return r.inMultiWindowMode();
4079 }
4080 } finally {
4081 Binder.restoreCallingIdentity(origId);
4082 }
4083 }
4084
4085 @Override
4086 public boolean isInPictureInPictureMode(IBinder token) {
4087 final long origId = Binder.clearCallingIdentity();
4088 try {
4089 synchronized (mGlobalLock) {
4090 return isInPictureInPictureMode(ActivityRecord.forTokenLocked(token));
4091 }
4092 } finally {
4093 Binder.restoreCallingIdentity(origId);
4094 }
4095 }
4096
4097 private boolean isInPictureInPictureMode(ActivityRecord r) {
Hongwei Wang85cf41f2020-01-15 15:14:47 -08004098 return r != null
4099 && r.getRootTask() != null
4100 && r.inPinnedWindowingMode()
4101 && r.getRootTask().isInStackLocked(r) != null;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004102 }
4103
4104 @Override
4105 public boolean enterPictureInPictureMode(IBinder token, final PictureInPictureParams params) {
4106 final long origId = Binder.clearCallingIdentity();
4107 try {
4108 synchronized (mGlobalLock) {
4109 final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
4110 "enterPictureInPictureMode", token, params);
4111
4112 // If the activity is already in picture in picture mode, then just return early
4113 if (isInPictureInPictureMode(r)) {
4114 return true;
4115 }
4116
4117 // Activity supports picture-in-picture, now check that we can enter PiP at this
4118 // point, if it is
4119 if (!r.checkEnterPictureInPictureState("enterPictureInPictureMode",
4120 false /* beforeStopping */)) {
4121 return false;
4122 }
4123
4124 final Runnable enterPipRunnable = () -> {
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004125 synchronized (mGlobalLock) {
Hyangseok Chaeed0624e2019-11-07 10:15:46 +09004126 if (r.getParent() == null) {
4127 Slog.e(TAG, "Skip enterPictureInPictureMode, destroyed " + r);
4128 return;
4129 }
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004130 // Only update the saved args from the args that are set
Robert Carrf6690d12020-02-04 14:16:21 -08004131 r.setPictureInPictureParams(params);
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004132 final float aspectRatio = r.pictureInPictureArgs.getAspectRatio();
4133 final List<RemoteAction> actions = r.pictureInPictureArgs.getActions();
4134 // Adjust the source bounds by the insets for the transition down
4135 final Rect sourceBounds = new Rect(
4136 r.pictureInPictureArgs.getSourceRectHint());
Louis Chang149d5c82019-12-30 09:47:39 +08004137 mRootWindowContainer.moveActivityToPinnedStack(
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004138 r, sourceBounds, aspectRatio, "enterPictureInPictureMode");
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08004139 final ActivityStack stack = r.getRootTask();
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004140 stack.setPictureInPictureAspectRatio(aspectRatio);
4141 stack.setPictureInPictureActions(actions);
Andrii Kulianeceebbf2019-06-26 17:36:51 -07004142 MetricsLoggerWrapper.logPictureInPictureEnter(mContext,
4143 r.info.applicationInfo.uid, r.shortComponentName,
4144 r.supportsEnterPipOnTaskSwitch);
Wale Ogunwalef276a6f2018-06-15 08:26:07 -07004145 logPictureInPictureArgs(params);
4146 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004147 };
4148
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004149 if (isKeyguardLocked()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004150 // If the keyguard is showing or occluded, then try and dismiss it before
4151 // entering picture-in-picture (this will prompt the user to authenticate if the
4152 // device is currently locked).
4153 dismissKeyguard(token, new KeyguardDismissCallback() {
4154 @Override
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004155 public void onDismissSucceeded() {
4156 mH.post(enterPipRunnable);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004157 }
4158 }, null /* message */);
4159 } else {
4160 // Enter picture in picture immediately otherwise
4161 enterPipRunnable.run();
4162 }
4163 return true;
4164 }
4165 } finally {
4166 Binder.restoreCallingIdentity(origId);
4167 }
4168 }
4169
4170 @Override
4171 public void setPictureInPictureParams(IBinder token, final PictureInPictureParams params) {
4172 final long origId = Binder.clearCallingIdentity();
4173 try {
4174 synchronized (mGlobalLock) {
4175 final ActivityRecord r = ensureValidPictureInPictureActivityParamsLocked(
4176 "setPictureInPictureParams", token, params);
4177
4178 // Only update the saved args from the args that are set
Robert Carrf6690d12020-02-04 14:16:21 -08004179 r.setPictureInPictureParams(params);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004180 if (r.inPinnedWindowingMode()) {
4181 // If the activity is already in picture-in-picture, update the pinned stack now
4182 // if it is not already expanding to fullscreen. Otherwise, the arguments will
4183 // be used the next time the activity enters PiP
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08004184 final ActivityStack stack = r.getRootTask();
Hongwei Wang85cf41f2020-01-15 15:14:47 -08004185 stack.setPictureInPictureAspectRatio(
4186 r.pictureInPictureArgs.getAspectRatio());
4187 stack.setPictureInPictureActions(r.pictureInPictureArgs.getActions());
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004188 }
4189 logPictureInPictureArgs(params);
4190 }
4191 } finally {
4192 Binder.restoreCallingIdentity(origId);
4193 }
4194 }
4195
4196 @Override
4197 public int getMaxNumPictureInPictureActions(IBinder token) {
4198 // Currently, this is a static constant, but later, we may change this to be dependent on
4199 // the context of the activity
4200 return 3;
4201 }
4202
4203 private void logPictureInPictureArgs(PictureInPictureParams params) {
4204 if (params.hasSetActions()) {
4205 MetricsLogger.histogram(mContext, "tron_varz_picture_in_picture_actions_count",
4206 params.getActions().size());
4207 }
4208 if (params.hasSetAspectRatio()) {
4209 LogMaker lm = new LogMaker(MetricsEvent.ACTION_PICTURE_IN_PICTURE_ASPECT_RATIO_CHANGED);
4210 lm.addTaggedData(MetricsEvent.PICTURE_IN_PICTURE_ASPECT_RATIO, params.getAspectRatio());
4211 MetricsLogger.action(lm);
4212 }
4213 }
4214
4215 /**
4216 * Checks the state of the system and the activity associated with the given {@param token} to
4217 * verify that picture-in-picture is supported for that activity.
4218 *
4219 * @return the activity record for the given {@param token} if all the checks pass.
4220 */
4221 private ActivityRecord ensureValidPictureInPictureActivityParamsLocked(String caller,
4222 IBinder token, PictureInPictureParams params) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004223 if (!mSupportsPictureInPicture) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004224 throw new IllegalStateException(caller
4225 + ": Device doesn't support picture-in-picture mode.");
4226 }
4227
4228 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
4229 if (r == null) {
4230 throw new IllegalStateException(caller
4231 + ": Can't find activity for token=" + token);
4232 }
4233
4234 if (!r.supportsPictureInPicture()) {
4235 throw new IllegalStateException(caller
4236 + ": Current activity does not support picture-in-picture.");
4237 }
4238
4239 if (params.hasSetAspectRatio()
Wale Ogunwale8b19de92018-11-29 19:58:26 -08004240 && !mWindowManager.isValidPictureInPictureAspectRatio(
Wale Ogunwale8f93b642019-12-26 12:10:52 -08004241 r.getDisplay(), params.getAspectRatio())) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004242 final float minAspectRatio = mContext.getResources().getFloat(
4243 com.android.internal.R.dimen.config_pictureInPictureMinAspectRatio);
4244 final float maxAspectRatio = mContext.getResources().getFloat(
4245 com.android.internal.R.dimen.config_pictureInPictureMaxAspectRatio);
4246 throw new IllegalArgumentException(String.format(caller
4247 + ": Aspect ratio is too extreme (must be between %f and %f).",
4248 minAspectRatio, maxAspectRatio));
4249 }
4250
4251 // Truncate the number of actions if necessary
4252 params.truncateActions(getMaxNumPictureInPictureActions(token));
4253
4254 return r;
4255 }
4256
4257 @Override
4258 public IBinder getUriPermissionOwnerForActivity(IBinder activityToken) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004259 enforceNotIsolatedCaller("getUriPermissionOwnerForActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004260 synchronized (mGlobalLock) {
4261 ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
4262 if (r == null) {
4263 throw new IllegalArgumentException("Activity does not exist; token="
4264 + activityToken);
4265 }
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -07004266 return r.getUriPermissionsLocked().getExternalToken();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004267 }
4268 }
4269
Evan Rosky73a7fe92019-11-18 18:28:01 -08004270 // TODO(b/149338177): remove when CTS no-longer requires it
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004271 @Override
4272 public void resizeDockedStack(Rect dockedBounds, Rect tempDockedTaskBounds,
4273 Rect tempDockedTaskInsetBounds,
4274 Rect tempOtherTaskBounds, Rect tempOtherTaskInsetBounds) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004275 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "resizeDockedStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004276 long ident = Binder.clearCallingIdentity();
4277 try {
4278 synchronized (mGlobalLock) {
Evan Rosky73a7fe92019-11-18 18:28:01 -08004279 final DisplayContent dc = mRootWindowContainer.getDefaultDisplay();
4280 TaskTile primary = null;
4281 TaskTile secondary = null;
4282 for (int i = dc.getStackCount() - 1; i >= 0; --i) {
4283 final TaskTile t = dc.getStackAt(i).asTile();
4284 if (t == null) {
4285 continue;
4286 }
4287 if (t.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
4288 primary = t;
4289 } else if (t.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY) {
4290 secondary = t;
4291 }
4292 }
4293 if (primary == null || secondary == null) {
4294 return;
4295 }
4296 final WindowContainerTransaction wct = new WindowContainerTransaction();
4297 final Rect primaryRect =
4298 tempDockedTaskInsetBounds != null ? tempDockedTaskInsetBounds
4299 : (tempDockedTaskBounds != null ? tempDockedTaskBounds
4300 : dockedBounds);
4301 wct.setBounds(primary.mRemoteToken, primaryRect);
4302 Rect otherRect = tempOtherTaskInsetBounds != null ? tempOtherTaskInsetBounds
4303 : tempOtherTaskBounds;
4304 if (otherRect == null) {
4305 // Temporary estimation... again this is just for tests.
4306 otherRect = new Rect(secondary.getBounds());
4307 if (dc.getBounds().width() > dc.getBounds().height()) {
4308 otherRect.left = primaryRect.right + 6;
4309 } else {
4310 otherRect.top = primaryRect.bottom + 6;
4311 }
4312 }
4313 wct.setBounds(secondary.mRemoteToken, otherRect);
4314 mTaskOrganizerController.applyContainerTransaction(wct, null /* organizer */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004315 }
4316 } finally {
4317 Binder.restoreCallingIdentity(ident);
4318 }
4319 }
4320
4321 @Override
4322 public void setSplitScreenResizing(boolean resizing) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004323 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setSplitScreenResizing()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004324 final long ident = Binder.clearCallingIdentity();
4325 try {
4326 synchronized (mGlobalLock) {
4327 mStackSupervisor.setSplitScreenResizing(resizing);
4328 }
4329 } finally {
4330 Binder.restoreCallingIdentity(ident);
4331 }
4332 }
4333
Evan Rosky0037e5f2019-11-05 10:26:24 -08004334 @Override
4335 public ITaskOrganizerController getTaskOrganizerController() {
4336 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS,
4337 "getTaskOrganizerController()");
4338 return mTaskOrganizerController;
4339 }
4340
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004341 /**
4342 * Check that we have the features required for VR-related API calls, and throw an exception if
4343 * not.
4344 */
Wale Ogunwale59507092018-10-29 09:00:30 -07004345 public void enforceSystemHasVrFeature() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004346 if (!mContext.getPackageManager().hasSystemFeature(
4347 PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE)) {
4348 throw new UnsupportedOperationException("VR mode not supported on this device!");
4349 }
4350 }
4351
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004352 @Override
4353 public int setVrMode(IBinder token, boolean enabled, ComponentName packageName) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004354 enforceSystemHasVrFeature();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004355
4356 final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
4357
4358 ActivityRecord r;
4359 synchronized (mGlobalLock) {
4360 r = ActivityRecord.isInStackLocked(token);
4361 }
4362
4363 if (r == null) {
4364 throw new IllegalArgumentException();
4365 }
4366
4367 int err;
Wale Ogunwale8b19de92018-11-29 19:58:26 -08004368 if ((err = vrService.hasVrPackage(packageName, r.mUserId)) !=
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004369 VrManagerInternal.NO_ERROR) {
4370 return err;
4371 }
4372
4373 // Clear the binder calling uid since this path may call moveToTask().
4374 final long callingId = Binder.clearCallingIdentity();
4375 try {
4376 synchronized (mGlobalLock) {
4377 r.requestedVrComponent = (enabled) ? packageName : null;
4378
4379 // Update associated state if this activity is currently focused
Andrii Kulian52d255c2018-07-13 11:32:19 -07004380 if (r.isResumedActivityOnDisplay()) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004381 applyUpdateVrModeLocked(r);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004382 }
4383 return 0;
4384 }
4385 } finally {
4386 Binder.restoreCallingIdentity(callingId);
4387 }
4388 }
4389
4390 @Override
4391 public void startLocalVoiceInteraction(IBinder callingActivity, Bundle options) {
4392 Slog.i(TAG, "Activity tried to startLocalVoiceInteraction");
4393 synchronized (mGlobalLock) {
Wale Ogunwale21e06482019-11-18 05:14:15 -08004394 ActivityRecord activity = getTopDisplayFocusedStack().getTopNonFinishingActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004395 if (ActivityRecord.forTokenLocked(callingActivity) != activity) {
4396 throw new SecurityException("Only focused activity can call startVoiceInteraction");
4397 }
Louis Changcdec0802019-11-11 11:45:07 +08004398 if (mRunningVoice != null || activity.getTask().voiceSession != null
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004399 || activity.voiceSession != null) {
4400 Slog.w(TAG, "Already in a voice interaction, cannot start new voice interaction");
4401 return;
4402 }
4403 if (activity.pendingVoiceInteractionStart) {
4404 Slog.w(TAG, "Pending start of voice interaction already.");
4405 return;
4406 }
4407 activity.pendingVoiceInteractionStart = true;
4408 }
4409 LocalServices.getService(VoiceInteractionManagerInternal.class)
4410 .startLocalVoiceInteraction(callingActivity, options);
4411 }
4412
4413 @Override
4414 public void stopLocalVoiceInteraction(IBinder callingActivity) {
4415 LocalServices.getService(VoiceInteractionManagerInternal.class)
4416 .stopLocalVoiceInteraction(callingActivity);
4417 }
4418
4419 @Override
4420 public boolean supportsLocalVoiceInteraction() {
4421 return LocalServices.getService(VoiceInteractionManagerInternal.class)
4422 .supportsLocalVoiceInteraction();
4423 }
4424
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004425 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004426 public boolean updateConfiguration(Configuration values) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004427 mAmInternal.enforceCallingPermission(CHANGE_CONFIGURATION, "updateConfiguration()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004428
4429 synchronized (mGlobalLock) {
Riddle Hsua0022cd2019-09-09 21:12:41 +08004430 if (mWindowManager == null) {
4431 Slog.w(TAG, "Skip updateConfiguration because mWindowManager isn't set");
4432 return false;
4433 }
4434
4435 if (values == null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004436 // sentinel: fetch the current configuration from the window manager
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004437 values = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004438 }
4439
Riddle Hsua0022cd2019-09-09 21:12:41 +08004440 mH.sendMessage(PooledLambda.obtainMessage(
4441 ActivityManagerInternal::updateOomLevelsForDisplay, mAmInternal,
4442 DEFAULT_DISPLAY));
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004443
4444 final long origId = Binder.clearCallingIdentity();
4445 try {
4446 if (values != null) {
4447 Settings.System.clearConfiguration(values);
4448 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004449 updateConfigurationLocked(values, null, false, false /* persistent */,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004450 UserHandle.USER_NULL, false /* deferResume */,
4451 mTmpUpdateConfigurationResult);
4452 return mTmpUpdateConfigurationResult.changes != 0;
4453 } finally {
4454 Binder.restoreCallingIdentity(origId);
4455 }
4456 }
4457 }
4458
4459 @Override
4460 public void dismissKeyguard(IBinder token, IKeyguardDismissCallback callback,
4461 CharSequence message) {
4462 if (message != null) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004463 mAmInternal.enforceCallingPermission(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004464 Manifest.permission.SHOW_KEYGUARD_MESSAGE, "dismissKeyguard()");
4465 }
4466 final long callingId = Binder.clearCallingIdentity();
4467 try {
4468 synchronized (mGlobalLock) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004469 mKeyguardController.dismissKeyguard(token, callback, message);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004470 }
4471 } finally {
4472 Binder.restoreCallingIdentity(callingId);
4473 }
4474 }
4475
4476 @Override
4477 public void cancelTaskWindowTransition(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004478 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004479 "cancelTaskWindowTransition()");
4480 final long ident = Binder.clearCallingIdentity();
4481 try {
4482 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08004483 final Task task = mRootWindowContainer.anyTaskForId(taskId,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004484 MATCH_TASK_IN_STACKS_ONLY);
4485 if (task == null) {
4486 Slog.w(TAG, "cancelTaskWindowTransition: taskId=" + taskId + " not found");
4487 return;
4488 }
Wale Ogunwale2322bed2019-10-10 17:24:19 +02004489 task.cancelTaskWindowTransition();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004490 }
4491 } finally {
4492 Binder.restoreCallingIdentity(ident);
4493 }
4494 }
4495
4496 @Override
Peter Kalauskas4dc04602020-02-12 18:49:03 -08004497 public ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004498 enforceCallerIsRecentsOrHasPermission(READ_FRAME_BUFFER, "getTaskSnapshot()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004499 final long ident = Binder.clearCallingIdentity();
4500 try {
Peter Kalauskas4dc04602020-02-12 18:49:03 -08004501 return getTaskSnapshot(taskId, isLowResolution, true /* restoreFromDisk */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004502 } finally {
4503 Binder.restoreCallingIdentity(ident);
4504 }
4505 }
4506
Peter Kalauskas4dc04602020-02-12 18:49:03 -08004507 private ActivityManager.TaskSnapshot getTaskSnapshot(int taskId, boolean isLowResolution,
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02004508 boolean restoreFromDisk) {
Louis Changcdec0802019-11-11 11:45:07 +08004509 final Task task;
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02004510 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08004511 task = mRootWindowContainer.anyTaskForId(taskId,
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02004512 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
4513 if (task == null) {
4514 Slog.w(TAG, "getTaskSnapshot: taskId=" + taskId + " not found");
4515 return null;
4516 }
4517 }
4518 // Don't call this while holding the lock as this operation might hit the disk.
Peter Kalauskas4dc04602020-02-12 18:49:03 -08004519 return task.getSnapshot(isLowResolution, restoreFromDisk);
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02004520 }
4521
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004522 @Override
4523 public void setDisablePreviewScreenshots(IBinder token, boolean disable) {
4524 synchronized (mGlobalLock) {
4525 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4526 if (r == null) {
4527 Slog.w(TAG, "setDisablePreviewScreenshots: Unable to find activity for token="
4528 + token);
4529 return;
4530 }
4531 final long origId = Binder.clearCallingIdentity();
4532 try {
4533 r.setDisablePreviewScreenshots(disable);
4534 } finally {
4535 Binder.restoreCallingIdentity(origId);
4536 }
4537 }
4538 }
4539
Riddle Hsu440f88b2019-11-06 22:17:35 +08004540 @Override
4541 public void invalidateHomeTaskSnapshot(IBinder token) {
4542 synchronized (mGlobalLock) {
4543 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4544 if (r == null || !r.isActivityTypeHome()) {
4545 return;
4546 }
4547 mWindowManager.mTaskSnapshotController.removeSnapshotCache(r.getTask().mTaskId);
4548 }
4549 }
4550
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004551 /** Return the user id of the last resumed activity. */
4552 @Override
4553 public @UserIdInt
4554 int getLastResumedActivityUserId() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004555 mAmInternal.enforceCallingPermission(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004556 Manifest.permission.INTERACT_ACROSS_USERS_FULL, "getLastResumedActivityUserId()");
4557 synchronized (mGlobalLock) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07004558 if (mLastResumedActivity == null) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004559 return getCurrentUserId();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004560 }
Wale Ogunwale8b19de92018-11-29 19:58:26 -08004561 return mLastResumedActivity.mUserId;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004562 }
4563 }
4564
4565 @Override
4566 public void updateLockTaskFeatures(int userId, int flags) {
4567 final int callingUid = Binder.getCallingUid();
4568 if (callingUid != 0 && callingUid != SYSTEM_UID) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004569 mAmInternal.enforceCallingPermission(android.Manifest.permission.UPDATE_LOCK_TASK_PACKAGES,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004570 "updateLockTaskFeatures()");
4571 }
4572 synchronized (mGlobalLock) {
4573 if (DEBUG_LOCKTASK) Slog.w(TAG_LOCKTASK, "Allowing features " + userId + ":0x" +
4574 Integer.toHexString(flags));
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07004575 getLockTaskController().updateLockTaskFeatures(userId, flags);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004576 }
4577 }
4578
4579 @Override
4580 public void setShowWhenLocked(IBinder token, boolean showWhenLocked) {
4581 synchronized (mGlobalLock) {
4582 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4583 if (r == null) {
4584 return;
4585 }
4586 final long origId = Binder.clearCallingIdentity();
4587 try {
4588 r.setShowWhenLocked(showWhenLocked);
4589 } finally {
4590 Binder.restoreCallingIdentity(origId);
4591 }
4592 }
4593 }
4594
4595 @Override
Issei Suzuki74e1eb22018-12-20 17:42:52 +01004596 public void setInheritShowWhenLocked(IBinder token, boolean inheritShowWhenLocked) {
4597 synchronized (mGlobalLock) {
4598 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4599 if (r == null) {
4600 return;
4601 }
4602 final long origId = Binder.clearCallingIdentity();
4603 try {
4604 r.setInheritShowWhenLocked(inheritShowWhenLocked);
4605 } finally {
4606 Binder.restoreCallingIdentity(origId);
4607 }
4608 }
4609 }
4610
4611 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004612 public void setTurnScreenOn(IBinder token, boolean turnScreenOn) {
4613 synchronized (mGlobalLock) {
4614 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4615 if (r == null) {
4616 return;
4617 }
4618 final long origId = Binder.clearCallingIdentity();
4619 try {
4620 r.setTurnScreenOn(turnScreenOn);
4621 } finally {
4622 Binder.restoreCallingIdentity(origId);
4623 }
4624 }
4625 }
4626
4627 @Override
4628 public void registerRemoteAnimations(IBinder token, RemoteAnimationDefinition definition) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004629 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004630 "registerRemoteAnimations");
Jorim Jaggi589c5ba2019-07-30 16:50:13 +02004631 definition.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid());
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004632 synchronized (mGlobalLock) {
4633 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4634 if (r == null) {
4635 return;
4636 }
4637 final long origId = Binder.clearCallingIdentity();
4638 try {
4639 r.registerRemoteAnimations(definition);
4640 } finally {
4641 Binder.restoreCallingIdentity(origId);
4642 }
4643 }
4644 }
4645
4646 @Override
Winson Chung10fc25d2019-12-10 14:13:56 -08004647 public void unregisterRemoteAnimations(IBinder token) {
4648 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
4649 "unregisterRemoteAnimations");
4650 synchronized (mGlobalLock) {
4651 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
4652 if (r == null) {
4653 return;
4654 }
4655 final long origId = Binder.clearCallingIdentity();
4656 try {
4657 r.unregisterRemoteAnimations();
4658 } finally {
4659 Binder.restoreCallingIdentity(origId);
4660 }
4661 }
4662 }
4663
4664 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004665 public void registerRemoteAnimationForNextActivityStart(String packageName,
4666 RemoteAnimationAdapter adapter) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004667 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004668 "registerRemoteAnimationForNextActivityStart");
Jorim Jaggi589c5ba2019-07-30 16:50:13 +02004669 adapter.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid());
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004670 synchronized (mGlobalLock) {
4671 final long origId = Binder.clearCallingIdentity();
4672 try {
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07004673 getActivityStartController().registerRemoteAnimationForNextActivityStart(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004674 packageName, adapter);
4675 } finally {
4676 Binder.restoreCallingIdentity(origId);
4677 }
4678 }
4679 }
4680
Evan Rosky966759f2019-01-15 10:33:58 -08004681 @Override
4682 public void registerRemoteAnimationsForDisplay(int displayId,
4683 RemoteAnimationDefinition definition) {
4684 mAmInternal.enforceCallingPermission(CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS,
4685 "registerRemoteAnimations");
Jorim Jaggi589c5ba2019-07-30 16:50:13 +02004686 definition.setCallingPidUid(Binder.getCallingPid(), Binder.getCallingUid());
Evan Rosky966759f2019-01-15 10:33:58 -08004687 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08004688 final DisplayContent display = mRootWindowContainer.getDisplayContent(displayId);
Evan Rosky966759f2019-01-15 10:33:58 -08004689 if (display == null) {
4690 Slog.e(TAG, "Couldn't find display with id: " + displayId);
4691 return;
4692 }
4693 final long origId = Binder.clearCallingIdentity();
4694 try {
4695 display.mDisplayContent.registerRemoteAnimations(definition);
4696 } finally {
4697 Binder.restoreCallingIdentity(origId);
4698 }
4699 }
4700 }
4701
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004702 /** @see android.app.ActivityManager#alwaysShowUnsupportedCompileSdkWarning */
4703 @Override
4704 public void alwaysShowUnsupportedCompileSdkWarning(ComponentName activity) {
4705 synchronized (mGlobalLock) {
4706 final long origId = Binder.clearCallingIdentity();
4707 try {
Wale Ogunwale008163e2018-07-23 23:11:08 -07004708 mAppWarnings.alwaysShowUnsupportedCompileSdkWarning(activity);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07004709 } finally {
4710 Binder.restoreCallingIdentity(origId);
4711 }
4712 }
4713 }
Wale Ogunwale6767eae2018-05-03 15:52:51 -07004714
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004715 @Override
4716 public void setVrThread(int tid) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004717 enforceSystemHasVrFeature();
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004718 synchronized (mGlobalLock) {
Wale Ogunwale342fbe92018-10-09 08:44:10 -07004719 final int pid = Binder.getCallingPid();
Michal Karpinski2e0aad22019-04-12 16:22:55 +01004720 final WindowProcessController wpc = mProcessMap.getProcess(pid);
Wale Ogunwale342fbe92018-10-09 08:44:10 -07004721 mVrController.setVrThreadLocked(tid, pid, wpc);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004722 }
4723 }
4724
4725 @Override
4726 public void setPersistentVrThread(int tid) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004727 if (checkCallingPermission(Manifest.permission.RESTRICTED_VR_ACCESS)
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004728 != PERMISSION_GRANTED) {
4729 final String msg = "Permission Denial: setPersistentVrThread() from pid="
4730 + Binder.getCallingPid()
4731 + ", uid=" + Binder.getCallingUid()
4732 + " requires " + Manifest.permission.RESTRICTED_VR_ACCESS;
4733 Slog.w(TAG, msg);
4734 throw new SecurityException(msg);
4735 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004736 enforceSystemHasVrFeature();
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004737 synchronized (mGlobalLock) {
Wale Ogunwale342fbe92018-10-09 08:44:10 -07004738 final int pid = Binder.getCallingPid();
Michal Karpinski2e0aad22019-04-12 16:22:55 +01004739 final WindowProcessController proc = mProcessMap.getProcess(pid);
Wale Ogunwale342fbe92018-10-09 08:44:10 -07004740 mVrController.setPersistentVrThreadLocked(tid, pid, proc);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004741 }
4742 }
4743
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004744 @Override
4745 public void stopAppSwitches() {
4746 enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "stopAppSwitches");
4747 synchronized (mGlobalLock) {
4748 mAppSwitchesAllowedTime = SystemClock.uptimeMillis() + APP_SWITCH_DELAY_TIME;
Ricky Wai906af482019-06-03 17:25:28 +01004749 mLastStopAppSwitchesTime = SystemClock.uptimeMillis();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004750 mDidAppSwitch = false;
4751 getActivityStartController().schedulePendingActivityLaunches(APP_SWITCH_DELAY_TIME);
4752 }
4753 }
4754
4755 @Override
4756 public void resumeAppSwitches() {
4757 enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "resumeAppSwitches");
4758 synchronized (mGlobalLock) {
4759 // Note that we don't execute any pending app switches... we will
4760 // let those wait until either the timeout, or the next start
4761 // activity request.
4762 mAppSwitchesAllowedTime = 0;
4763 }
4764 }
4765
Ricky Wai906af482019-06-03 17:25:28 +01004766 long getLastStopAppSwitchesTime() {
4767 return mLastStopAppSwitchesTime;
4768 }
4769
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004770 void onStartActivitySetDidAppSwitch() {
4771 if (mDidAppSwitch) {
4772 // This is the second allowed switch since we stopped switches, so now just generally
4773 // allow switches. Use case:
4774 // - user presses home (switches disabled, switch to home, mDidAppSwitch now true);
4775 // - user taps a home icon (coming from home so allowed, we hit here and now allow
4776 // anyone to switch again).
4777 mAppSwitchesAllowedTime = 0;
4778 } else {
4779 mDidAppSwitch = true;
4780 }
4781 }
4782
4783 /** @return whether the system should disable UI modes incompatible with VR mode. */
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004784 boolean shouldDisableNonVrUiLocked() {
4785 return mVrController.shouldDisableNonVrUiLocked();
4786 }
4787
Wale Ogunwale53783742018-09-16 10:21:51 -07004788 private void applyUpdateVrModeLocked(ActivityRecord r) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004789 // VR apps are expected to run in a main display. If an app is turning on VR for
Wale Ogunwaleb8e6b632019-06-28 15:19:25 +00004790 // itself, but isn't on the main display, then move it there before enabling VR Mode.
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004791 if (r.requestedVrComponent != null && r.getDisplayId() != DEFAULT_DISPLAY) {
Wale Ogunwaleb8e6b632019-06-28 15:19:25 +00004792 Slog.i(TAG, "Moving " + r.shortComponentName + " from display " + r.getDisplayId()
4793 + " to main display for VR");
Louis Chang149d5c82019-12-30 09:47:39 +08004794 mRootWindowContainer.moveStackToDisplay(
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08004795 r.getRootTaskId(), DEFAULT_DISPLAY, true /* toTop */);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004796 }
4797 mH.post(() -> {
4798 if (!mVrController.onVrModeChanged(r)) {
4799 return;
4800 }
4801 synchronized (mGlobalLock) {
4802 final boolean disableNonVrUi = mVrController.shouldDisableNonVrUiLocked();
4803 mWindowManager.disableNonVrUi(disableNonVrUi);
4804 if (disableNonVrUi) {
4805 // If we are in a VR mode where Picture-in-Picture mode is unsupported,
4806 // then remove the pinned stack.
Louis Chang149d5c82019-12-30 09:47:39 +08004807 mRootWindowContainer.removeStacksInWindowingModes(WINDOWING_MODE_PINNED);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004808 }
4809 }
4810 });
4811 }
4812
Wale Ogunwale53783742018-09-16 10:21:51 -07004813 @Override
4814 public int getPackageScreenCompatMode(String packageName) {
4815 enforceNotIsolatedCaller("getPackageScreenCompatMode");
4816 synchronized (mGlobalLock) {
4817 return mCompatModePackages.getPackageScreenCompatModeLocked(packageName);
4818 }
4819 }
4820
4821 @Override
4822 public void setPackageScreenCompatMode(String packageName, int mode) {
4823 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY,
4824 "setPackageScreenCompatMode");
4825 synchronized (mGlobalLock) {
4826 mCompatModePackages.setPackageScreenCompatModeLocked(packageName, mode);
4827 }
4828 }
4829
4830 @Override
4831 public boolean getPackageAskScreenCompat(String packageName) {
4832 enforceNotIsolatedCaller("getPackageAskScreenCompat");
4833 synchronized (mGlobalLock) {
4834 return mCompatModePackages.getPackageAskCompatModeLocked(packageName);
4835 }
4836 }
4837
4838 @Override
4839 public void setPackageAskScreenCompat(String packageName, boolean ask) {
4840 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY,
4841 "setPackageAskScreenCompat");
4842 synchronized (mGlobalLock) {
4843 mCompatModePackages.setPackageAskCompatModeLocked(packageName, ask);
4844 }
4845 }
4846
Wale Ogunwale64258362018-10-16 15:13:37 -07004847 public static String relaunchReasonToString(int relaunchReason) {
4848 switch (relaunchReason) {
4849 case RELAUNCH_REASON_WINDOWING_MODE_RESIZE:
4850 return "window_resize";
4851 case RELAUNCH_REASON_FREE_RESIZE:
4852 return "free_resize";
4853 default:
4854 return null;
4855 }
4856 }
4857
Andrii Kulian5f750bc2018-07-17 08:57:23 -07004858 ActivityStack getTopDisplayFocusedStack() {
Louis Chang149d5c82019-12-30 09:47:39 +08004859 return mRootWindowContainer.getTopDisplayFocusedStack();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07004860 }
4861
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004862 /** Pokes the task persister. */
Louis Changcdec0802019-11-11 11:45:07 +08004863 void notifyTaskPersisterLocked(Task task, boolean flush) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004864 mRecentTasks.notifyTaskPersisterLocked(task, flush);
4865 }
4866
Wale Ogunwaled0412b32018-05-08 09:25:50 -07004867 boolean isKeyguardLocked() {
4868 return mKeyguardController.isKeyguardLocked();
4869 }
4870
Garfield Tan01548632018-11-27 10:15:48 -08004871 /**
4872 * Clears launch params for the given package.
4873 * @param packageNames the names of the packages of which the launch params are to be cleared
4874 */
4875 @Override
4876 public void clearLaunchParamsForPackages(List<String> packageNames) {
4877 mAmInternal.enforceCallingPermission(Manifest.permission.MANAGE_ACTIVITY_STACKS,
4878 "clearLaunchParamsForPackages");
4879 synchronized (mGlobalLock) {
4880 for (int i = 0; i < packageNames.size(); ++i) {
4881 mStackSupervisor.mLaunchParamsPersister.removeRecordForPackage(packageNames.get(i));
4882 }
4883 }
4884 }
4885
Wale Ogunwale9e737db2018-12-17 15:42:37 -08004886 /**
4887 * Makes the display with the given id a single task instance display. I.e the display can only
4888 * contain one task.
4889 */
4890 @Override
4891 public void setDisplayToSingleTaskInstance(int displayId) {
4892 mAmInternal.enforceCallingPermission(Manifest.permission.MANAGE_ACTIVITY_STACKS,
4893 "setDisplayToSingleTaskInstance");
4894 final long origId = Binder.clearCallingIdentity();
4895 try {
Louis Chang677921f2019-12-06 16:44:24 +08004896 final DisplayContent display =
Louis Chang149d5c82019-12-30 09:47:39 +08004897 mRootWindowContainer.getDisplayContentOrCreate(displayId);
Wale Ogunwale9e737db2018-12-17 15:42:37 -08004898 if (display != null) {
4899 display.setDisplayToSingleTaskInstance();
4900 }
4901 } finally {
4902 Binder.restoreCallingIdentity(origId);
4903 }
4904 }
4905
jorgegil@google.com06bc3232019-10-31 14:51:22 -07004906 /**
4907 * Requests that an activity should enter picture-in-picture mode if possible.
4908 */
4909 @Override
4910 public void requestPictureInPictureMode(IBinder token) throws RemoteException {
4911 mAmInternal.enforceCallingPermission(Manifest.permission.MANAGE_ACTIVITY_STACKS,
4912 "requestPictureInPictureMode");
4913 final long origId = Binder.clearCallingIdentity();
4914 try {
4915 synchronized (mGlobalLock) {
4916 final ActivityRecord activity = ActivityRecord.forTokenLocked(token);
4917 if (activity == null) {
4918 return;
4919 }
4920
4921 final boolean canEnterPictureInPicture = activity.checkEnterPictureInPictureState(
4922 "requestPictureInPictureMode", /* beforeStopping */ false);
4923 if (!canEnterPictureInPicture) {
4924 throw new IllegalStateException(
4925 "Requested PIP on an activity that doesn't support it");
4926 }
4927
4928 try {
4929 final ClientTransaction transaction = ClientTransaction.obtain(
4930 activity.app.getThread(),
4931 activity.token);
4932 transaction.addCallback(EnterPipRequestedItem.obtain());
4933 getLifecycleManager().scheduleTransaction(transaction);
4934 } catch (Exception e) {
4935 Slog.w(TAG, "Failed to send enter pip requested item: "
4936 + activity.intent.getComponent(), e);
4937 }
4938 }
4939 } finally {
4940 Binder.restoreCallingIdentity(origId);
4941 }
4942 }
4943
Wale Ogunwale31913b52018-10-13 08:29:31 -07004944 void dumpLastANRLocked(PrintWriter pw) {
4945 pw.println("ACTIVITY MANAGER LAST ANR (dumpsys activity lastanr)");
4946 if (mLastANRState == null) {
4947 pw.println(" <no ANR has occurred since boot>");
4948 } else {
4949 pw.println(mLastANRState);
4950 }
4951 }
4952
4953 void dumpLastANRTracesLocked(PrintWriter pw) {
4954 pw.println("ACTIVITY MANAGER LAST ANR TRACES (dumpsys activity lastanr-traces)");
4955
4956 final File[] files = new File(ANR_TRACE_DIR).listFiles();
4957 if (ArrayUtils.isEmpty(files)) {
4958 pw.println(" <no ANR has occurred since boot>");
4959 return;
4960 }
4961 // Find the latest file.
4962 File latest = null;
4963 for (File f : files) {
4964 if ((latest == null) || (latest.lastModified() < f.lastModified())) {
4965 latest = f;
Wale Ogunwalef6733932018-06-27 05:14:34 -07004966 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07004967 }
4968 pw.print("File: ");
4969 pw.print(latest.getName());
4970 pw.println();
4971 try (BufferedReader in = new BufferedReader(new FileReader(latest))) {
4972 String line;
4973 while ((line = in.readLine()) != null) {
4974 pw.println(line);
4975 }
4976 } catch (IOException e) {
4977 pw.print("Unable to read: ");
4978 pw.print(e);
4979 pw.println();
4980 }
4981 }
4982
4983 void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
4984 int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) {
4985 dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage,
4986 "ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)");
4987 }
4988
4989 void dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
4990 int opti, boolean dumpAll, boolean dumpClient, String dumpPackage, String header) {
4991 pw.println(header);
4992
Louis Chang149d5c82019-12-30 09:47:39 +08004993 boolean printedAnything = mRootWindowContainer.dumpActivities(fd, pw, dumpAll, dumpClient,
Wale Ogunwale31913b52018-10-13 08:29:31 -07004994 dumpPackage);
4995 boolean needSep = printedAnything;
4996
4997 boolean printed = ActivityStackSupervisor.printThisActivity(pw,
Louis Chang149d5c82019-12-30 09:47:39 +08004998 mRootWindowContainer.getTopResumedActivity(), dumpPackage, needSep,
Wale Ogunwale31913b52018-10-13 08:29:31 -07004999 " ResumedActivity: ");
5000 if (printed) {
5001 printedAnything = true;
5002 needSep = false;
5003 }
5004
5005 if (dumpPackage == null) {
5006 if (needSep) {
5007 pw.println();
5008 }
5009 printedAnything = true;
5010 mStackSupervisor.dump(pw, " ");
5011 }
5012
5013 if (!printedAnything) {
5014 pw.println(" (nothing)");
5015 }
5016 }
5017
5018 void dumpActivityContainersLocked(PrintWriter pw) {
Jeff Changde322732019-07-12 12:16:23 +08005019 pw.println("ACTIVITY MANAGER CONTAINERS (dumpsys activity containers)");
Louis Chang149d5c82019-12-30 09:47:39 +08005020 mRootWindowContainer.dumpChildrenNames(pw, " ");
Wale Ogunwale31913b52018-10-13 08:29:31 -07005021 pw.println(" ");
5022 }
5023
5024 void dumpActivityStarterLocked(PrintWriter pw, String dumpPackage) {
5025 pw.println("ACTIVITY MANAGER STARTER (dumpsys activity starter)");
5026 getActivityStartController().dump(pw, "", dumpPackage);
5027 }
5028
5029 /**
5030 * There are three things that cmd can be:
5031 * - a flattened component name that matches an existing activity
5032 * - the cmd arg isn't the flattened component name of an existing activity:
5033 * dump all activity whose component contains the cmd as a substring
5034 * - A hex number of the ActivityRecord object instance.
Riddle Hsud7cd8ed2019-07-16 18:19:01 +08005035 * <p>
5036 * The caller should not hold lock when calling this method because it will wait for the
5037 * activities to complete the dump.
Wale Ogunwale31913b52018-10-13 08:29:31 -07005038 *
5039 * @param dumpVisibleStacksOnly dump activity with {@param name} only if in a visible stack
5040 * @param dumpFocusedStackOnly dump activity with {@param name} only if in the focused stack
5041 */
5042 protected boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args,
5043 int opti, boolean dumpAll, boolean dumpVisibleStacksOnly, boolean dumpFocusedStackOnly) {
5044 ArrayList<ActivityRecord> activities;
5045
5046 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08005047 activities = mRootWindowContainer.getDumpActivities(name, dumpVisibleStacksOnly,
Wale Ogunwale31913b52018-10-13 08:29:31 -07005048 dumpFocusedStackOnly);
5049 }
5050
5051 if (activities.size() <= 0) {
5052 return false;
5053 }
5054
5055 String[] newArgs = new String[args.length - opti];
5056 System.arraycopy(args, opti, newArgs, 0, args.length - opti);
5057
Louis Changcdec0802019-11-11 11:45:07 +08005058 Task lastTask = null;
Wale Ogunwale31913b52018-10-13 08:29:31 -07005059 boolean needSep = false;
5060 for (int i = activities.size() - 1; i >= 0; i--) {
5061 ActivityRecord r = activities.get(i);
5062 if (needSep) {
5063 pw.println();
5064 }
5065 needSep = true;
5066 synchronized (mGlobalLock) {
Louis Changcdec0802019-11-11 11:45:07 +08005067 final Task task = r.getTask();
Wale Ogunwale31913b52018-10-13 08:29:31 -07005068 if (lastTask != task) {
5069 lastTask = task;
5070 pw.print("TASK "); pw.print(lastTask.affinity);
Wale Ogunwale4e79a1c2019-10-05 20:52:40 -07005071 pw.print(" id="); pw.print(lastTask.mTaskId);
5072 pw.print(" userId="); pw.println(lastTask.mUserId);
Wale Ogunwale31913b52018-10-13 08:29:31 -07005073 if (dumpAll) {
5074 lastTask.dump(pw, " ");
5075 }
5076 }
5077 }
5078 dumpActivity(" ", fd, pw, activities.get(i), newArgs, dumpAll);
5079 }
5080 return true;
5081 }
5082
5083 /**
5084 * Invokes IApplicationThread.dumpActivity() on the thread of the specified activity if
5085 * there is a thread associated with the activity.
5086 */
5087 private void dumpActivity(String prefix, FileDescriptor fd, PrintWriter pw,
5088 final ActivityRecord r, String[] args, boolean dumpAll) {
5089 String innerPrefix = prefix + " ";
Riddle Hsud7cd8ed2019-07-16 18:19:01 +08005090 IApplicationThread appThread = null;
Wale Ogunwale31913b52018-10-13 08:29:31 -07005091 synchronized (mGlobalLock) {
5092 pw.print(prefix); pw.print("ACTIVITY "); pw.print(r.shortComponentName);
5093 pw.print(" "); pw.print(Integer.toHexString(System.identityHashCode(r)));
5094 pw.print(" pid=");
Riddle Hsud7cd8ed2019-07-16 18:19:01 +08005095 if (r.hasProcess()) {
5096 pw.println(r.app.getPid());
5097 appThread = r.app.getThread();
5098 } else {
5099 pw.println("(not running)");
5100 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07005101 if (dumpAll) {
Garfield Tane8d84ab2019-10-11 09:49:40 -07005102 r.dump(pw, innerPrefix, true /* dumpAll */);
Wale Ogunwale31913b52018-10-13 08:29:31 -07005103 }
5104 }
Riddle Hsud7cd8ed2019-07-16 18:19:01 +08005105 if (appThread != null) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07005106 // flush anything that is already in the PrintWriter since the thread is going
5107 // to write to the file descriptor directly
5108 pw.flush();
Riddle Hsud7cd8ed2019-07-16 18:19:01 +08005109 try (TransferPipe tp = new TransferPipe()) {
5110 appThread.dumpActivity(tp.getWriteFd(), r.appToken, innerPrefix, args);
5111 tp.go(fd);
Wale Ogunwale31913b52018-10-13 08:29:31 -07005112 } catch (IOException e) {
5113 pw.println(innerPrefix + "Failure while dumping the activity: " + e);
5114 } catch (RemoteException e) {
5115 pw.println(innerPrefix + "Got a RemoteException while dumping the activity");
5116 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07005117 }
Wale Ogunwaled0412b32018-05-08 09:25:50 -07005118 }
5119
sanryhuang498e77e2018-12-06 14:57:01 +08005120 private void writeSleepStateToProto(ProtoOutputStream proto, int wakeFullness,
5121 boolean testPssMode) {
5122 final long sleepToken = proto.start(ActivityManagerServiceDumpProcessesProto.SLEEP_STATUS);
5123 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.WAKEFULNESS,
5124 PowerManagerInternal.wakefulnessToProtoEnum(wakeFullness));
Louis Chang149d5c82019-12-30 09:47:39 +08005125 for (ActivityTaskManagerInternal.SleepToken st : mRootWindowContainer.mSleepTokens) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07005126 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEP_TOKENS,
5127 st.toString());
5128 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07005129 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SLEEPING, mSleeping);
5130 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.SHUTTING_DOWN,
5131 mShuttingDown);
sanryhuang498e77e2018-12-06 14:57:01 +08005132 proto.write(ActivityManagerServiceDumpProcessesProto.SleepStatus.TEST_PSS_MODE,
5133 testPssMode);
5134 proto.end(sleepToken);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07005135 }
5136
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005137 int getCurrentUserId() {
5138 return mAmInternal.getCurrentUserId();
5139 }
5140
5141 private void enforceNotIsolatedCaller(String caller) {
5142 if (UserHandle.isIsolated(Binder.getCallingUid())) {
5143 throw new SecurityException("Isolated process not allowed to call " + caller);
5144 }
5145 }
5146
Wale Ogunwalef6733932018-06-27 05:14:34 -07005147 public Configuration getConfiguration() {
5148 Configuration ci;
5149 synchronized(mGlobalLock) {
Yunfan Chen75157d72018-07-27 14:47:21 +09005150 ci = new Configuration(getGlobalConfigurationForCallingPid());
Wale Ogunwalef6733932018-06-27 05:14:34 -07005151 ci.userSetLocale = false;
5152 }
5153 return ci;
5154 }
5155
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005156 /**
5157 * Current global configuration information. Contains general settings for the entire system,
5158 * also corresponds to the merged configuration of the default display.
5159 */
5160 Configuration getGlobalConfiguration() {
Louis Chang149d5c82019-12-30 09:47:39 +08005161 // Return default configuration before mRootWindowContainer initialized, which happens
Louis Chang3ff72a82019-12-17 12:12:59 +08005162 // while initializing process record for system, see {@link
5163 // ActivityManagerService#setSystemProcess}.
Louis Chang149d5c82019-12-30 09:47:39 +08005164 return mRootWindowContainer != null ? mRootWindowContainer.getConfiguration()
Louis Chang3ff72a82019-12-17 12:12:59 +08005165 : new Configuration();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005166 }
5167
5168 boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
5169 boolean initLocale) {
5170 return updateConfigurationLocked(values, starting, initLocale, false /* deferResume */);
5171 }
5172
5173 boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
5174 boolean initLocale, boolean deferResume) {
5175 // pass UserHandle.USER_NULL as userId because we don't persist configuration for any user
5176 return updateConfigurationLocked(values, starting, initLocale, false /* persistent */,
5177 UserHandle.USER_NULL, deferResume);
5178 }
5179
Wale Ogunwale59507092018-10-29 09:00:30 -07005180 public void updatePersistentConfiguration(Configuration values, @UserIdInt int userId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005181 final long origId = Binder.clearCallingIdentity();
5182 try {
5183 synchronized (mGlobalLock) {
5184 updateConfigurationLocked(values, null, false, true, userId,
5185 false /* deferResume */);
5186 }
5187 } finally {
5188 Binder.restoreCallingIdentity(origId);
5189 }
5190 }
5191
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005192 private boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
5193 boolean initLocale, boolean persistent, int userId, boolean deferResume) {
5194 return updateConfigurationLocked(values, starting, initLocale, persistent, userId,
5195 deferResume, null /* result */);
5196 }
5197
5198 /**
5199 * Do either or both things: (1) change the current configuration, and (2)
5200 * make sure the given activity is running with the (now) current
5201 * configuration. Returns true if the activity has been left running, or
5202 * false if <var>starting</var> is being destroyed to match the new
5203 * configuration.
5204 *
5205 * @param userId is only used when persistent parameter is set to true to persist configuration
5206 * for that particular user
5207 */
5208 boolean updateConfigurationLocked(Configuration values, ActivityRecord starting,
5209 boolean initLocale, boolean persistent, int userId, boolean deferResume,
5210 ActivityTaskManagerService.UpdateConfigurationResult result) {
5211 int changes = 0;
5212 boolean kept = true;
5213
Riddle Hsua0022cd2019-09-09 21:12:41 +08005214 deferWindowLayout();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005215 try {
5216 if (values != null) {
5217 changes = updateGlobalConfigurationLocked(values, initLocale, persistent, userId,
5218 deferResume);
5219 }
5220
5221 kept = ensureConfigAndVisibilityAfterUpdate(starting, changes);
5222 } finally {
Riddle Hsua0022cd2019-09-09 21:12:41 +08005223 continueWindowLayout();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005224 }
5225
5226 if (result != null) {
5227 result.changes = changes;
5228 result.activityRelaunched = !kept;
5229 }
5230 return kept;
5231 }
5232
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005233 /** Update default (global) configuration and notify listeners about changes. */
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005234 int updateGlobalConfigurationLocked(@NonNull Configuration values, boolean initLocale,
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005235 boolean persistent, int userId, boolean deferResume) {
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005236
Louis Chang677921f2019-12-06 16:44:24 +08005237 final DisplayContent defaultDisplay =
Louis Chang149d5c82019-12-30 09:47:39 +08005238 mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY);
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005239
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005240 mTempConfig.setTo(getGlobalConfiguration());
5241 final int changes = mTempConfig.updateFrom(values);
5242 if (changes == 0) {
5243 // Since calling to Activity.setRequestedOrientation leads to freezing the window with
5244 // setting WindowManagerService.mWaitingForConfig to true, it is important that we call
5245 // performDisplayOverrideConfigUpdate in order to send the new display configuration
5246 // (even if there are no actual changes) to unfreeze the window.
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005247 defaultDisplay.performDisplayOverrideConfigUpdate(values, deferResume);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005248 return 0;
5249 }
5250
5251 if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.i(TAG_CONFIGURATION,
5252 "Updating global configuration to: " + values);
Jeff Changd136e772019-11-05 20:33:52 +08005253 writeConfigurationChanged(changes);
Muhammad Qureshi759f92f2020-01-28 10:41:55 -08005254 FrameworkStatsLog.write(FrameworkStatsLog.RESOURCE_CONFIGURATION_CHANGED,
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005255 values.colorMode,
5256 values.densityDpi,
5257 values.fontScale,
5258 values.hardKeyboardHidden,
5259 values.keyboard,
5260 values.keyboardHidden,
5261 values.mcc,
5262 values.mnc,
5263 values.navigation,
5264 values.navigationHidden,
5265 values.orientation,
5266 values.screenHeightDp,
5267 values.screenLayout,
5268 values.screenWidthDp,
5269 values.smallestScreenWidthDp,
5270 values.touchscreen,
5271 values.uiMode);
5272
5273
5274 if (!initLocale && !values.getLocales().isEmpty() && values.userSetLocale) {
5275 final LocaleList locales = values.getLocales();
5276 int bestLocaleIndex = 0;
5277 if (locales.size() > 1) {
5278 if (mSupportedSystemLocales == null) {
5279 mSupportedSystemLocales = Resources.getSystem().getAssets().getLocales();
5280 }
5281 bestLocaleIndex = Math.max(0, locales.getFirstMatchIndex(mSupportedSystemLocales));
5282 }
5283 SystemProperties.set("persist.sys.locale",
5284 locales.get(bestLocaleIndex).toLanguageTag());
5285 LocaleList.setDefault(locales, bestLocaleIndex);
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005286
5287 final Message m = PooledLambda.obtainMessage(
5288 ActivityTaskManagerService::sendLocaleToMountDaemonMsg, this,
5289 locales.get(bestLocaleIndex));
5290 mH.sendMessage(m);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005291 }
5292
Yunfan Chen75157d72018-07-27 14:47:21 +09005293 mTempConfig.seq = increaseConfigurationSeqLocked();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005294
5295 // Update stored global config and notify everyone about the change.
Louis Chang149d5c82019-12-30 09:47:39 +08005296 mRootWindowContainer.onConfigurationChanged(mTempConfig);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005297
5298 Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + mTempConfig);
5299 // TODO(multi-display): Update UsageEvents#Event to include displayId.
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005300 mUsageStatsInternal.reportConfigurationChange(mTempConfig, mAmInternal.getCurrentUserId());
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005301
5302 // TODO: If our config changes, should we auto dismiss any currently showing dialogs?
Wale Ogunwalef6733932018-06-27 05:14:34 -07005303 updateShouldShowDialogsLocked(mTempConfig);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005304
5305 AttributeCache ac = AttributeCache.instance();
5306 if (ac != null) {
5307 ac.updateConfiguration(mTempConfig);
5308 }
5309
5310 // Make sure all resources in our process are updated right now, so that anyone who is going
5311 // to retrieve resource values after we return will be sure to get the new ones. This is
5312 // especially important during boot, where the first config change needs to guarantee all
5313 // resources have that config before following boot code is executed.
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005314 mSystemThread.applyConfigurationToResources(mTempConfig);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005315
5316 // We need another copy of global config because we're scheduling some calls instead of
5317 // running them in place. We need to be sure that object we send will be handled unchanged.
5318 final Configuration configCopy = new Configuration(mTempConfig);
5319 if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) {
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005320 final Message msg = PooledLambda.obtainMessage(
5321 ActivityTaskManagerService::sendPutConfigurationForUserMsg,
5322 this, userId, configCopy);
5323 mH.sendMessage(msg);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005324 }
5325
Michal Karpinski2e0aad22019-04-12 16:22:55 +01005326 SparseArray<WindowProcessController> pidMap = mProcessMap.getPidMap();
5327 for (int i = pidMap.size() - 1; i >= 0; i--) {
5328 final int pid = pidMap.keyAt(i);
5329 final WindowProcessController app = pidMap.get(pid);
Yunfan Chen34fcc7a2018-10-11 16:26:09 -07005330 if (DEBUG_CONFIGURATION) {
5331 Slog.v(TAG_CONFIGURATION, "Update process config of "
5332 + app.mName + " to new config " + configCopy);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005333 }
Yunfan Chen34fcc7a2018-10-11 16:26:09 -07005334 app.onConfigurationChanged(configCopy);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005335 }
5336
Wale Ogunwale2ea36d42018-10-18 10:27:31 -07005337 final Message msg = PooledLambda.obtainMessage(
5338 ActivityManagerInternal::broadcastGlobalConfigurationChanged,
5339 mAmInternal, changes, initLocale);
5340 mH.sendMessage(msg);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005341
5342 // Override configuration of the default display duplicates global config, so we need to
5343 // update it also. This will also notify WindowManager about changes.
Louis Chang149d5c82019-12-30 09:47:39 +08005344 defaultDisplay.performDisplayOverrideConfigUpdate(mRootWindowContainer.getConfiguration(),
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005345 deferResume);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005346
5347 return changes;
5348 }
5349
Riddle Hsua0022cd2019-09-09 21:12:41 +08005350 /** @see WindowSurfacePlacer#deferLayout */
5351 void deferWindowLayout() {
5352 if (!mWindowManager.mWindowPlacerLocked.isLayoutDeferred()) {
5353 // Reset the reasons at the first entrance because we only care about the changes in the
5354 // deferred scope.
5355 mLayoutReasons = 0;
5356 }
5357
5358 mWindowManager.mWindowPlacerLocked.deferLayout();
5359 }
5360
5361 /** @see WindowSurfacePlacer#continueLayout */
5362 void continueWindowLayout() {
5363 mWindowManager.mWindowPlacerLocked.continueLayout(mLayoutReasons != 0);
5364 if (DEBUG_ALL && !mWindowManager.mWindowPlacerLocked.isLayoutDeferred()) {
5365 Slog.i(TAG, "continueWindowLayout reason=" + mLayoutReasons);
5366 }
5367 }
5368
5369 /**
5370 * If a reason is added between {@link #deferWindowLayout} and {@link #continueWindowLayout},
5371 * it will make sure {@link WindowSurfacePlacer#performSurfacePlacement} is called when the last
5372 * defer count is gone.
5373 */
5374 void addWindowLayoutReasons(@LayoutReason int reasons) {
5375 mLayoutReasons |= reasons;
5376 }
5377
Wale Ogunwalef6733932018-06-27 05:14:34 -07005378 private void updateEventDispatchingLocked(boolean booted) {
5379 mWindowManager.setEventDispatching(booted && !mShuttingDown);
5380 }
5381
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005382 private void sendPutConfigurationForUserMsg(int userId, Configuration config) {
5383 final ContentResolver resolver = mContext.getContentResolver();
5384 Settings.System.putConfigurationForUser(resolver, config, userId);
5385 }
5386
5387 private void sendLocaleToMountDaemonMsg(Locale l) {
5388 try {
5389 IBinder service = ServiceManager.getService("mount");
5390 IStorageManager storageManager = IStorageManager.Stub.asInterface(service);
5391 Log.d(TAG, "Storing locale " + l.toLanguageTag() + " for decryption UI");
5392 storageManager.setField(StorageManager.SYSTEM_LOCALE_KEY, l.toLanguageTag());
5393 } catch (RemoteException e) {
5394 Log.e(TAG, "Error storing locale for decryption UI", e);
5395 }
5396 }
5397
Alison Cichowlas3e340502018-08-07 17:15:01 -04005398 private void expireStartAsCallerTokenMsg(IBinder permissionToken) {
5399 mStartActivitySources.remove(permissionToken);
5400 mExpiredStartAsCallerTokens.add(permissionToken);
5401 }
5402
5403 private void forgetStartAsCallerTokenMsg(IBinder permissionToken) {
5404 mExpiredStartAsCallerTokens.remove(permissionToken);
5405 }
5406
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005407 boolean isActivityStartsLoggingEnabled() {
5408 return mAmInternal.isActivityStartsLoggingEnabled();
5409 }
5410
Michal Karpinski8596ded2018-11-14 14:43:48 +00005411 boolean isBackgroundActivityStartsEnabled() {
5412 return mAmInternal.isBackgroundActivityStartsEnabled();
5413 }
5414
Wale Ogunwalef6733932018-06-27 05:14:34 -07005415 void enableScreenAfterBoot(boolean booted) {
Jeff Changd136e772019-11-05 20:33:52 +08005416 writeBootProgressEnableScreen(SystemClock.uptimeMillis());
Wale Ogunwalef6733932018-06-27 05:14:34 -07005417 mWindowManager.enableScreenAfterBoot();
5418
5419 synchronized (mGlobalLock) {
5420 updateEventDispatchingLocked(booted);
5421 }
5422 }
5423
Wale Ogunwale906f9c62018-07-23 11:23:44 -07005424 static long getInputDispatchingTimeoutLocked(ActivityRecord r) {
5425 if (r == null || !r.hasProcess()) {
5426 return KEY_DISPATCHING_TIMEOUT_MS;
5427 }
5428 return getInputDispatchingTimeoutLocked(r.app);
5429 }
5430
5431 private static long getInputDispatchingTimeoutLocked(WindowProcessController r) {
Wale Ogunwale51cc98a2018-10-15 10:41:05 -07005432 return r != null ? r.getInputDispatchingTimeout() : KEY_DISPATCHING_TIMEOUT_MS;
Wale Ogunwale906f9c62018-07-23 11:23:44 -07005433 }
5434
Wale Ogunwalef6733932018-06-27 05:14:34 -07005435 /**
5436 * Decide based on the configuration whether we should show the ANR,
5437 * crash, etc dialogs. The idea is that if there is no affordance to
5438 * press the on-screen buttons, or the user experience would be more
5439 * greatly impacted than the crash itself, we shouldn't show the dialog.
5440 *
5441 * A thought: SystemUI might also want to get told about this, the Power
5442 * dialog / global actions also might want different behaviors.
5443 */
5444 private void updateShouldShowDialogsLocked(Configuration config) {
5445 final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS
5446 && config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH
5447 && config.navigation == Configuration.NAVIGATION_NONAV);
5448 int modeType = config.uiMode & Configuration.UI_MODE_TYPE_MASK;
5449 final boolean uiModeSupportsDialogs = (modeType != Configuration.UI_MODE_TYPE_CAR
5450 && !(modeType == Configuration.UI_MODE_TYPE_WATCH && Build.IS_USER)
5451 && modeType != Configuration.UI_MODE_TYPE_TELEVISION
5452 && modeType != Configuration.UI_MODE_TYPE_VR_HEADSET);
5453 final boolean hideDialogsSet = Settings.Global.getInt(mContext.getContentResolver(),
5454 HIDE_ERROR_DIALOGS, 0) != 0;
5455 mShowDialogs = inputMethodExists && uiModeSupportsDialogs && !hideDialogsSet;
5456 }
5457
5458 private void updateFontScaleIfNeeded(@UserIdInt int userId) {
5459 final float scaleFactor = Settings.System.getFloatForUser(mContext.getContentResolver(),
5460 FONT_SCALE, 1.0f, userId);
5461
Riddle Hsu8419e4b2019-09-18 23:28:01 +08005462 synchronized (mGlobalLock) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07005463 if (getGlobalConfiguration().fontScale == scaleFactor) {
5464 return;
5465 }
5466
5467 final Configuration configuration
5468 = mWindowManager.computeNewConfiguration(DEFAULT_DISPLAY);
5469 configuration.fontScale = scaleFactor;
5470 updatePersistentConfiguration(configuration, userId);
5471 }
5472 }
5473
5474 // Actually is sleeping or shutting down or whatever else in the future
5475 // is an inactive state.
5476 boolean isSleepingOrShuttingDownLocked() {
5477 return isSleepingLocked() || mShuttingDown;
5478 }
5479
5480 boolean isSleepingLocked() {
5481 return mSleeping;
5482 }
5483
Riddle Hsu16567132018-08-16 21:37:47 +08005484 /** Update AMS states when an activity is resumed. */
Wale Ogunwalef6733932018-06-27 05:14:34 -07005485 void setResumedActivityUncheckLocked(ActivityRecord r, String reason) {
Louis Changcdec0802019-11-11 11:45:07 +08005486 final Task task = r.getTask();
Wale Ogunwalef6733932018-06-27 05:14:34 -07005487 if (task.isActivityTypeStandard()) {
5488 if (mCurAppTimeTracker != r.appTimeTracker) {
5489 // We are switching app tracking. Complete the current one.
5490 if (mCurAppTimeTracker != null) {
5491 mCurAppTimeTracker.stop();
5492 mH.obtainMessage(
5493 REPORT_TIME_TRACKER_MSG, mCurAppTimeTracker).sendToTarget();
Louis Chang149d5c82019-12-30 09:47:39 +08005494 mRootWindowContainer.clearOtherAppTimeTrackers(r.appTimeTracker);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005495 mCurAppTimeTracker = null;
5496 }
5497 if (r.appTimeTracker != null) {
5498 mCurAppTimeTracker = r.appTimeTracker;
5499 startTimeTrackingFocusedActivityLocked();
5500 }
5501 } else {
5502 startTimeTrackingFocusedActivityLocked();
5503 }
5504 } else {
5505 r.appTimeTracker = null;
5506 }
5507 // TODO: VI Maybe r.task.voiceInteractor || r.voiceInteractor != null
5508 // TODO: Probably not, because we don't want to resume voice on switching
5509 // back to this activity
5510 if (task.voiceInteractor != null) {
5511 startRunningVoiceLocked(task.voiceSession, r.info.applicationInfo.uid);
5512 } else {
5513 finishRunningVoiceLocked();
5514
5515 if (mLastResumedActivity != null) {
5516 final IVoiceInteractionSession session;
5517
Louis Changcdec0802019-11-11 11:45:07 +08005518 final Task lastResumedActivityTask = mLastResumedActivity.getTask();
Wale Ogunwalef6733932018-06-27 05:14:34 -07005519 if (lastResumedActivityTask != null
5520 && lastResumedActivityTask.voiceSession != null) {
5521 session = lastResumedActivityTask.voiceSession;
5522 } else {
5523 session = mLastResumedActivity.voiceSession;
5524 }
5525
5526 if (session != null) {
5527 // We had been in a voice interaction session, but now focused has
5528 // move to something different. Just finish the session, we can't
5529 // return to it and retain the proper state and synchronization with
5530 // the voice interaction service.
5531 finishVoiceTask(session);
5532 }
5533 }
5534 }
5535
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005536 if (mLastResumedActivity != null && r.mUserId != mLastResumedActivity.mUserId) {
5537 mAmInternal.sendForegroundProfileChanged(r.mUserId);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005538 }
Bogyun Sonbfb64dc2019-12-09 17:50:24 +09005539 final Task prevTask = mLastResumedActivity != null ? mLastResumedActivity.getTask() : null;
5540
Wale Ogunwalef6733932018-06-27 05:14:34 -07005541 updateResumedAppTrace(r);
5542 mLastResumedActivity = r;
5543
Tiger Huang1e5b10a2018-07-30 20:19:51 +08005544 r.getDisplay().setFocusedApp(r, true);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005545
Bogyun Sonbfb64dc2019-12-09 17:50:24 +09005546 if (prevTask == null || task != prevTask) {
5547 if (prevTask != null) {
5548 mTaskChangeNotificationController.notifyTaskFocusChanged(prevTask.mTaskId, false);
5549 }
5550 mTaskChangeNotificationController.notifyTaskFocusChanged(task.mTaskId, true);
5551 }
5552
Wale Ogunwalef6733932018-06-27 05:14:34 -07005553 applyUpdateLockStateLocked(r);
5554 applyUpdateVrModeLocked(r);
5555
Jeff Changd136e772019-11-05 20:33:52 +08005556 EventLogTags.writeWmSetResumedActivity(
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005557 r == null ? -1 : r.mUserId,
Wale Ogunwalef6733932018-06-27 05:14:34 -07005558 r == null ? "NULL" : r.shortComponentName,
5559 reason);
5560 }
5561
5562 ActivityTaskManagerInternal.SleepToken acquireSleepToken(String tag, int displayId) {
5563 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08005564 final ActivityTaskManagerInternal.SleepToken token =
Louis Chang149d5c82019-12-30 09:47:39 +08005565 mRootWindowContainer.createSleepToken(tag, displayId);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005566 updateSleepIfNeededLocked();
5567 return token;
5568 }
5569 }
5570
5571 void updateSleepIfNeededLocked() {
Louis Chang149d5c82019-12-30 09:47:39 +08005572 final boolean shouldSleep = !mRootWindowContainer.hasAwakeDisplay();
Wale Ogunwalef6733932018-06-27 05:14:34 -07005573 final boolean wasSleeping = mSleeping;
5574 boolean updateOomAdj = false;
5575
5576 if (!shouldSleep) {
5577 // If wasSleeping is true, we need to wake up activity manager state from when
5578 // we started sleeping. In either case, we need to apply the sleep tokens, which
5579 // will wake up stacks or put them to sleep as appropriate.
5580 if (wasSleeping) {
5581 mSleeping = false;
Muhammad Qureshi759f92f2020-01-28 10:41:55 -08005582 FrameworkStatsLog.write(FrameworkStatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED,
5583 FrameworkStatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED__STATE__AWAKE);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005584 startTimeTrackingFocusedActivityLocked();
5585 mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
Varun Shah98694fb2019-04-11 09:28:27 -07005586 Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP");
Wale Ogunwalef6733932018-06-27 05:14:34 -07005587 mStackSupervisor.comeOutOfSleepIfNeededLocked();
5588 }
Louis Chang149d5c82019-12-30 09:47:39 +08005589 mRootWindowContainer.applySleepTokens(true /* applyToStacks */);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005590 if (wasSleeping) {
5591 updateOomAdj = true;
5592 }
5593 } else if (!mSleeping && shouldSleep) {
5594 mSleeping = true;
Muhammad Qureshi759f92f2020-01-28 10:41:55 -08005595 FrameworkStatsLog.write(FrameworkStatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED,
5596 FrameworkStatsLog.ACTIVITY_MANAGER_SLEEP_STATE_CHANGED__STATE__ASLEEP);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005597 if (mCurAppTimeTracker != null) {
5598 mCurAppTimeTracker.stop();
5599 }
5600 mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING;
Varun Shah98694fb2019-04-11 09:28:27 -07005601 Slog.d(TAG, "Top Process State changed to PROCESS_STATE_TOP_SLEEPING");
Wale Ogunwalef6733932018-06-27 05:14:34 -07005602 mStackSupervisor.goingToSleepLocked();
5603 updateResumedAppTrace(null /* resumed */);
5604 updateOomAdj = true;
5605 }
5606 if (updateOomAdj) {
wilsonshih8d096d22019-08-01 17:46:14 +08005607 updateOomAdj();
Wale Ogunwalef6733932018-06-27 05:14:34 -07005608 }
5609 }
5610
5611 void updateOomAdj() {
Wale Ogunwalea38654f2019-11-17 20:37:15 -08005612 mH.removeCallbacks(mUpdateOomAdjRunnable);
5613 mH.post(mUpdateOomAdjRunnable);
Wale Ogunwalef6733932018-06-27 05:14:34 -07005614 }
5615
Wale Ogunwale53783742018-09-16 10:21:51 -07005616 void updateCpuStats() {
5617 mH.post(mAmInternal::updateCpuStats);
5618 }
5619
Hui Yu03d12402018-12-06 18:00:37 -08005620 void updateBatteryStats(ActivityRecord component, boolean resumed) {
5621 final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::updateBatteryStats,
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005622 mAmInternal, component.mActivityComponent, component.app.mUid, component.mUserId,
5623 resumed);
Wale Ogunwale53783742018-09-16 10:21:51 -07005624 mH.sendMessage(m);
5625 }
5626
Hui Yu03d12402018-12-06 18:00:37 -08005627 void updateActivityUsageStats(ActivityRecord activity, int event) {
Michael Wachenschwanz0b4ab1f2019-01-07 13:59:10 -08005628 ComponentName taskRoot = null;
Louis Changcdec0802019-11-11 11:45:07 +08005629 final Task task = activity.getTask();
Michael Wachenschwanz0b4ab1f2019-01-07 13:59:10 -08005630 if (task != null) {
5631 final ActivityRecord rootActivity = task.getRootActivity();
5632 if (rootActivity != null) {
5633 taskRoot = rootActivity.mActivityComponent;
5634 }
5635 }
5636
Hui Yu03d12402018-12-06 18:00:37 -08005637 final Message m = PooledLambda.obtainMessage(
5638 ActivityManagerInternal::updateActivityUsageStats, mAmInternal,
Michael Wachenschwanz0b4ab1f2019-01-07 13:59:10 -08005639 activity.mActivityComponent, activity.mUserId, event, activity.appToken, taskRoot);
Hui Yu03d12402018-12-06 18:00:37 -08005640 mH.sendMessage(m);
5641 }
5642
Riddle Hsu32dbdca2019-05-17 23:10:16 -06005643 void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop,
5644 String hostingType) {
5645 try {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08005646 if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
5647 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "dispatchingStartProcess:"
Riddle Hsu32dbdca2019-05-17 23:10:16 -06005648 + activity.processName);
5649 }
5650 // Post message to start process to avoid possible deadlock of calling into AMS with the
5651 // ATMS lock held.
5652 final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,
5653 mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead,
5654 isTop, hostingType, activity.intent.getComponent());
5655 mH.sendMessage(m);
5656 } finally {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08005657 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Riddle Hsu32dbdca2019-05-17 23:10:16 -06005658 }
5659 }
5660
Wale Ogunwale53783742018-09-16 10:21:51 -07005661 void setBooting(boolean booting) {
5662 mAmInternal.setBooting(booting);
5663 }
5664
5665 boolean isBooting() {
5666 return mAmInternal.isBooting();
5667 }
5668
5669 void setBooted(boolean booted) {
5670 mAmInternal.setBooted(booted);
5671 }
5672
5673 boolean isBooted() {
5674 return mAmInternal.isBooted();
5675 }
5676
5677 void postFinishBooting(boolean finishBooting, boolean enableScreen) {
5678 mH.post(() -> {
5679 if (finishBooting) {
5680 mAmInternal.finishBooting();
5681 }
5682 if (enableScreen) {
5683 mInternal.enableScreenAfterBoot(isBooted());
5684 }
5685 });
5686 }
5687
5688 void setHeavyWeightProcess(ActivityRecord root) {
5689 mHeavyWeightProcess = root.app;
5690 final Message m = PooledLambda.obtainMessage(
5691 ActivityTaskManagerService::postHeavyWeightProcessNotification, this,
Wale Ogunwale8b19de92018-11-29 19:58:26 -08005692 root.app, root.intent, root.mUserId);
Wale Ogunwale53783742018-09-16 10:21:51 -07005693 mH.sendMessage(m);
5694 }
5695
5696 void clearHeavyWeightProcessIfEquals(WindowProcessController proc) {
5697 if (mHeavyWeightProcess == null || mHeavyWeightProcess != proc) {
5698 return;
5699 }
5700
5701 mHeavyWeightProcess = null;
5702 final Message m = PooledLambda.obtainMessage(
5703 ActivityTaskManagerService::cancelHeavyWeightProcessNotification, this,
5704 proc.mUserId);
5705 mH.sendMessage(m);
5706 }
5707
5708 private void cancelHeavyWeightProcessNotification(int userId) {
5709 final INotificationManager inm = NotificationManager.getService();
5710 if (inm == null) {
5711 return;
5712 }
5713 try {
Julia Reynoldse4a47dd2019-06-07 13:40:59 -04005714 inm.cancelNotificationWithTag("android", "android", null,
Wale Ogunwale53783742018-09-16 10:21:51 -07005715 SystemMessage.NOTE_HEAVY_WEIGHT_NOTIFICATION, userId);
5716 } catch (RuntimeException e) {
5717 Slog.w(TAG, "Error canceling notification for service", e);
5718 } catch (RemoteException e) {
5719 }
5720
5721 }
5722
5723 private void postHeavyWeightProcessNotification(
5724 WindowProcessController proc, Intent intent, int userId) {
5725 if (proc == null) {
5726 return;
5727 }
5728
5729 final INotificationManager inm = NotificationManager.getService();
5730 if (inm == null) {
5731 return;
5732 }
5733
5734 try {
5735 Context context = mContext.createPackageContext(proc.mInfo.packageName, 0);
5736 String text = mContext.getString(R.string.heavy_weight_notification,
5737 context.getApplicationInfo().loadLabel(context.getPackageManager()));
5738 Notification notification =
5739 new Notification.Builder(context,
5740 SystemNotificationChannels.HEAVY_WEIGHT_APP)
5741 .setSmallIcon(com.android.internal.R.drawable.stat_sys_adb)
5742 .setWhen(0)
5743 .setOngoing(true)
5744 .setTicker(text)
5745 .setColor(mContext.getColor(
5746 com.android.internal.R.color.system_notification_accent_color))
5747 .setContentTitle(text)
5748 .setContentText(
5749 mContext.getText(R.string.heavy_weight_notification_detail))
5750 .setContentIntent(PendingIntent.getActivityAsUser(mContext, 0,
5751 intent, PendingIntent.FLAG_CANCEL_CURRENT, null,
5752 new UserHandle(userId)))
5753 .build();
5754 try {
5755 inm.enqueueNotificationWithTag("android", "android", null,
5756 SystemMessage.NOTE_HEAVY_WEIGHT_NOTIFICATION, notification, userId);
5757 } catch (RuntimeException e) {
5758 Slog.w(TAG, "Error showing notification for heavy-weight app", e);
5759 } catch (RemoteException e) {
5760 }
5761 } catch (PackageManager.NameNotFoundException e) {
5762 Slog.w(TAG, "Unable to create context for heavy notification", e);
5763 }
5764
5765 }
5766
Philip P. Moltmannee295092020-02-10 08:46:26 -08005767 IIntentSender getIntentSenderLocked(int type, String packageName, String featureId,
5768 int callingUid, int userId, IBinder token, String resultWho, int requestCode,
5769 Intent[] intents, String[] resolvedTypes, int flags, Bundle bOptions) {
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07005770
5771 ActivityRecord activity = null;
5772 if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) {
5773 activity = ActivityRecord.isInStackLocked(token);
5774 if (activity == null) {
5775 Slog.w(TAG, "Failed createPendingResult: activity " + token + " not in any stack");
5776 return null;
5777 }
5778 if (activity.finishing) {
5779 Slog.w(TAG, "Failed createPendingResult: activity " + activity + " is finishing");
5780 return null;
5781 }
5782 }
5783
5784 final PendingIntentRecord rec = mPendingIntentController.getIntentSender(type, packageName,
Philip P. Moltmannee295092020-02-10 08:46:26 -08005785 featureId, callingUid, userId, token, resultWho, requestCode, intents,
5786 resolvedTypes, flags, bOptions);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07005787 final boolean noCreate = (flags & PendingIntent.FLAG_NO_CREATE) != 0;
5788 if (noCreate) {
5789 return rec;
5790 }
5791 if (type == ActivityManager.INTENT_SENDER_ACTIVITY_RESULT) {
5792 if (activity.pendingResults == null) {
5793 activity.pendingResults = new HashSet<>();
5794 }
5795 activity.pendingResults.add(rec.ref);
5796 }
5797 return rec;
5798 }
5799
Andrii Kulian52d255c2018-07-13 11:32:19 -07005800 // TODO(b/111541062): Update app time tracking to make it aware of multiple resumed activities
Wale Ogunwalef6733932018-06-27 05:14:34 -07005801 private void startTimeTrackingFocusedActivityLocked() {
Louis Chang149d5c82019-12-30 09:47:39 +08005802 final ActivityRecord resumedActivity = mRootWindowContainer.getTopResumedActivity();
Wale Ogunwalef6733932018-06-27 05:14:34 -07005803 if (!mSleeping && mCurAppTimeTracker != null && resumedActivity != null) {
5804 mCurAppTimeTracker.start(resumedActivity.packageName);
5805 }
5806 }
5807
5808 private void updateResumedAppTrace(@Nullable ActivityRecord resumed) {
5809 if (mTracedResumedActivity != null) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08005810 Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER,
Wale Ogunwalef6733932018-06-27 05:14:34 -07005811 constructResumedTraceName(mTracedResumedActivity.packageName), 0);
5812 }
5813 if (resumed != null) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08005814 Trace.asyncTraceBegin(TRACE_TAG_WINDOW_MANAGER,
Wale Ogunwalef6733932018-06-27 05:14:34 -07005815 constructResumedTraceName(resumed.packageName), 0);
5816 }
5817 mTracedResumedActivity = resumed;
5818 }
5819
5820 private String constructResumedTraceName(String packageName) {
5821 return "focused app: " + packageName;
5822 }
5823
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005824 /** Applies latest configuration and/or visibility updates if needed. */
Shivam Agrawal1d3db652019-07-01 15:26:11 -07005825 boolean ensureConfigAndVisibilityAfterUpdate(ActivityRecord starting, int changes) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005826 boolean kept = true;
Louis Chang149d5c82019-12-30 09:47:39 +08005827 final ActivityStack mainStack = mRootWindowContainer.getTopDisplayFocusedStack();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005828 // mainStack is null during startup.
5829 if (mainStack != null) {
5830 if (changes != 0 && starting == null) {
5831 // If the configuration changed, and the caller is not already
5832 // in the process of starting an activity, then find the top
5833 // activity to check if its configuration needs to change.
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09005834 starting = mainStack.topRunningActivity();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005835 }
5836
5837 if (starting != null) {
5838 kept = starting.ensureActivityConfiguration(changes,
5839 false /* preserveWindow */);
5840 // And we need to make sure at this point that all other activities
5841 // are made visible with the correct configuration.
Louis Chang149d5c82019-12-30 09:47:39 +08005842 mRootWindowContainer.ensureActivitiesVisible(starting, changes,
Wale Ogunwalea6191b42018-05-09 07:41:32 -07005843 !PRESERVE_WINDOWS);
5844 }
5845 }
5846
5847 return kept;
5848 }
5849
Wale Ogunwale906f9c62018-07-23 11:23:44 -07005850 void scheduleAppGcsLocked() {
5851 mH.post(() -> mAmInternal.scheduleAppGcs());
5852 }
5853
Wale Ogunwale53783742018-09-16 10:21:51 -07005854 CompatibilityInfo compatibilityInfoForPackageLocked(ApplicationInfo ai) {
5855 return mCompatModePackages.compatibilityInfoForPackageLocked(ai);
5856 }
5857
Wale Ogunwale906f9c62018-07-23 11:23:44 -07005858 /**
5859 * Returns the PackageManager. Used by classes hosted by {@link ActivityTaskManagerService}. The
5860 * PackageManager could be unavailable at construction time and therefore needs to be accessed
5861 * on demand.
5862 */
5863 IPackageManager getPackageManager() {
5864 return AppGlobals.getPackageManager();
5865 }
5866
5867 PackageManagerInternal getPackageManagerInternalLocked() {
5868 if (mPmInternal == null) {
5869 mPmInternal = LocalServices.getService(PackageManagerInternal.class);
5870 }
5871 return mPmInternal;
5872 }
5873
Darryl L Johnsona0982222020-02-18 18:21:51 -08005874 ComponentName getSysUiServiceComponentLocked() {
5875 if (mSysUiServiceComponent == null) {
5876 final PackageManagerInternal pm = getPackageManagerInternalLocked();
5877 mSysUiServiceComponent = pm.getSystemUiServiceComponent();
5878 }
5879 return mSysUiServiceComponent;
5880 }
5881
Hai Zhangf4da9be2019-05-01 13:46:06 +08005882 PermissionPolicyInternal getPermissionPolicyInternal() {
5883 if (mPermissionPolicyInternal == null) {
5884 mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class);
5885 }
5886 return mPermissionPolicyInternal;
5887 }
5888
Wale Ogunwale008163e2018-07-23 23:11:08 -07005889 AppWarnings getAppWarningsLocked() {
5890 return mAppWarnings;
5891 }
5892
Wale Ogunwale214f3482018-10-04 11:00:47 -07005893 Intent getHomeIntent() {
5894 Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
5895 intent.setComponent(mTopComponent);
5896 intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
5897 if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
5898 intent.addCategory(Intent.CATEGORY_HOME);
5899 }
5900 return intent;
5901 }
5902
Chilun2ef71f72018-11-16 17:57:15 +08005903 /**
5904 * Return the intent set with {@link Intent#CATEGORY_SECONDARY_HOME} to resolve secondary home
5905 * activities.
5906 *
Chilun939b05c2020-02-19 14:50:59 +08005907 * @param preferredPackage Specify a preferred package name, otherwise use the package name
5908 * defined in config_secondaryHomePackage.
Chilun2ef71f72018-11-16 17:57:15 +08005909 * @return the intent set with {@link Intent#CATEGORY_SECONDARY_HOME}
5910 */
5911 Intent getSecondaryHomeIntent(String preferredPackage) {
5912 final Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
Keun young Park340546a2019-05-06 16:27:44 -07005913 final boolean useSystemProvidedLauncher = mContext.getResources().getBoolean(
5914 com.android.internal.R.bool.config_useSystemProvidedLauncherForSecondary);
5915 if (preferredPackage == null || useSystemProvidedLauncher) {
Chilun939b05c2020-02-19 14:50:59 +08005916 // Using the package name stored in config if no preferred package name or forced.
5917 final String secondaryHomePackage = mContext.getResources().getString(
5918 com.android.internal.R.string.config_secondaryHomePackage);
5919 intent.setPackage(secondaryHomePackage);
Chilun2ef71f72018-11-16 17:57:15 +08005920 } else {
5921 intent.setPackage(preferredPackage);
5922 }
5923 intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
5924 if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
5925 intent.addCategory(Intent.CATEGORY_SECONDARY_HOME);
5926 }
5927 return intent;
5928 }
5929
Wale Ogunwale214f3482018-10-04 11:00:47 -07005930 ApplicationInfo getAppInfoForUser(ApplicationInfo info, int userId) {
5931 if (info == null) return null;
5932 ApplicationInfo newInfo = new ApplicationInfo(info);
5933 newInfo.initForUser(userId);
5934 return newInfo;
5935 }
5936
Wale Ogunwale9c103022018-10-18 07:44:54 -07005937 WindowProcessController getProcessController(String processName, int uid) {
Wale Ogunwale214f3482018-10-04 11:00:47 -07005938 if (uid == SYSTEM_UID) {
5939 // The system gets to run in any process. If there are multiple processes with the same
5940 // uid, just pick the first (this should never happen).
5941 final SparseArray<WindowProcessController> procs =
5942 mProcessNames.getMap().get(processName);
5943 if (procs == null) return null;
5944 final int procCount = procs.size();
5945 for (int i = 0; i < procCount; i++) {
5946 final int procUid = procs.keyAt(i);
5947 if (UserHandle.isApp(procUid) || !UserHandle.isSameUser(procUid, uid)) {
5948 // Don't use an app process or different user process for system component.
5949 continue;
5950 }
5951 return procs.valueAt(i);
5952 }
5953 }
5954
5955 return mProcessNames.get(processName, uid);
5956 }
5957
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005958 WindowProcessController getProcessController(IApplicationThread thread) {
5959 if (thread == null) {
5960 return null;
5961 }
5962
5963 final IBinder threadBinder = thread.asBinder();
5964 final ArrayMap<String, SparseArray<WindowProcessController>> pmap = mProcessNames.getMap();
5965 for (int i = pmap.size()-1; i >= 0; i--) {
5966 final SparseArray<WindowProcessController> procs = pmap.valueAt(i);
5967 for (int j = procs.size() - 1; j >= 0; j--) {
5968 final WindowProcessController proc = procs.valueAt(j);
5969 if (proc.hasThread() && proc.getThread().asBinder() == threadBinder) {
5970 return proc;
5971 }
5972 }
5973 }
5974
5975 return null;
5976 }
5977
Michal Karpinski9cbb20b2019-02-05 17:31:50 +00005978 WindowProcessController getProcessController(int pid, int uid) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01005979 final WindowProcessController proc = mProcessMap.getProcess(pid);
Yunfan Chen8546b212019-04-01 15:34:44 +09005980 if (proc == null) return null;
5981 if (UserHandle.isApp(uid) && proc.mUid == uid) {
5982 return proc;
Michal Karpinski9cbb20b2019-02-05 17:31:50 +00005983 }
5984 return null;
5985 }
5986
Riddle Hsua0536432019-02-16 00:38:59 +08005987 int getUidState(int uid) {
5988 return mActiveUids.getUidState(uid);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07005989 }
5990
Michal Karpinskicc88d7e2019-01-24 15:32:12 +00005991 boolean isUidForeground(int uid) {
Alan Stokeseea8d3e2019-04-10 17:37:25 +01005992 // A uid is considered to be foreground if it has a visible non-toast window.
5993 return mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(uid);
Michal Karpinskicc88d7e2019-01-24 15:32:12 +00005994 }
5995
Ricky Wai96f5c352019-04-10 18:40:17 +01005996 boolean isDeviceOwner(int uid) {
5997 return uid >= 0 && mDeviceOwnerUid == uid;
Michal Karpinski4026cae2019-02-12 11:51:47 +00005998 }
5999
Ricky Wai96f5c352019-04-10 18:40:17 +01006000 void setDeviceOwnerUid(int uid) {
6001 mDeviceOwnerUid = uid;
Michal Karpinski4026cae2019-02-12 11:51:47 +00006002 }
6003
Wale Ogunwale9de19442018-10-18 19:05:03 -07006004 /**
6005 * @return whitelist tag for a uid from mPendingTempWhitelist, null if not currently on
6006 * the whitelist
6007 */
6008 String getPendingTempWhitelistTagForUidLocked(int uid) {
6009 return mPendingTempWhitelist.get(uid);
6010 }
6011
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006012 void logAppTooSlow(WindowProcessController app, long startTime, String msg) {
6013 if (true || Build.IS_USER) {
6014 return;
6015 }
6016
6017 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
6018 StrictMode.allowThreadDiskWrites();
6019 try {
6020 File tracesDir = new File("/data/anr");
6021 File tracesFile = null;
6022 try {
6023 tracesFile = File.createTempFile("app_slow", null, tracesDir);
6024
6025 StringBuilder sb = new StringBuilder();
Neil Fuller97746812019-08-19 14:20:50 +01006026 String timeString =
6027 TimeMigrationUtils.formatMillisWithFixedFormat(System.currentTimeMillis());
6028 sb.append(timeString);
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006029 sb.append(": ");
6030 TimeUtils.formatDuration(SystemClock.uptimeMillis()-startTime, sb);
6031 sb.append(" since ");
6032 sb.append(msg);
6033 FileOutputStream fos = new FileOutputStream(tracesFile);
6034 fos.write(sb.toString().getBytes());
6035 if (app == null) {
6036 fos.write("\n*** No application process!".getBytes());
6037 }
6038 fos.close();
6039 FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
6040 } catch (IOException e) {
6041 Slog.w(TAG, "Unable to prepare slow app traces file: " + tracesFile, e);
6042 return;
6043 }
6044
6045 if (app != null && app.getPid() > 0) {
6046 ArrayList<Integer> firstPids = new ArrayList<Integer>();
6047 firstPids.add(app.getPid());
6048 dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, null, null);
6049 }
6050
6051 File lastTracesFile = null;
6052 File curTracesFile = null;
6053 for (int i=9; i>=0; i--) {
6054 String name = String.format(Locale.US, "slow%02d.txt", i);
6055 curTracesFile = new File(tracesDir, name);
6056 if (curTracesFile.exists()) {
6057 if (lastTracesFile != null) {
6058 curTracesFile.renameTo(lastTracesFile);
6059 } else {
6060 curTracesFile.delete();
6061 }
6062 }
6063 lastTracesFile = curTracesFile;
6064 }
6065 tracesFile.renameTo(curTracesFile);
6066 } finally {
6067 StrictMode.setThreadPolicy(oldPolicy);
6068 }
6069 }
6070
Michal Karpinskida34cd42019-04-02 19:46:52 +01006071 boolean isAssociatedCompanionApp(int userId, int uid) {
6072 final Set<Integer> allUids = mCompanionAppUidsMap.get(userId);
6073 if (allUids == null) {
Ricky Wai2452e2d2019-03-18 19:19:08 +00006074 return false;
6075 }
Michal Karpinskida34cd42019-04-02 19:46:52 +01006076 return allUids.contains(uid);
Ricky Wai2452e2d2019-03-18 19:19:08 +00006077 }
6078
Issei Suzuki734bc942019-06-05 13:59:52 +02006079 void notifySingleTaskDisplayEmpty(int displayId) {
6080 mTaskChangeNotificationController.notifySingleTaskDisplayEmpty(displayId);
6081 }
6082
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006083 final class H extends Handler {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006084 static final int REPORT_TIME_TRACKER_MSG = 1;
Alison Cichowlas3e340502018-08-07 17:15:01 -04006085
6086
Wale Ogunwale98875612018-10-12 07:53:02 -07006087 static final int FIRST_ACTIVITY_STACK_MSG = 100;
6088 static final int FIRST_SUPERVISOR_STACK_MSG = 200;
Wale Ogunwalef6733932018-06-27 05:14:34 -07006089
Riddle Hsud93a6c42018-11-29 21:50:06 +08006090 H(Looper looper) {
6091 super(looper);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006092 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07006093
6094 @Override
6095 public void handleMessage(Message msg) {
6096 switch (msg.what) {
6097 case REPORT_TIME_TRACKER_MSG: {
6098 AppTimeTracker tracker = (AppTimeTracker) msg.obj;
6099 tracker.deliverResult(mContext);
6100 } break;
6101 }
6102 }
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006103 }
6104
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006105 final class UiHandler extends Handler {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006106 static final int DISMISS_DIALOG_UI_MSG = 1;
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006107
6108 public UiHandler() {
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -08006109 super(UiThread.get().getLooper(), null, true);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006110 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07006111
6112 @Override
6113 public void handleMessage(Message msg) {
6114 switch (msg.what) {
6115 case DISMISS_DIALOG_UI_MSG: {
6116 final Dialog d = (Dialog) msg.obj;
6117 d.dismiss();
6118 break;
6119 }
6120 }
6121 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006122 }
6123
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006124 final class LocalService extends ActivityTaskManagerInternal {
6125 @Override
6126 public SleepToken acquireSleepToken(String tag, int displayId) {
Daulet Zhanguzinc6c641f2020-01-02 17:18:30 +00006127 Objects.requireNonNull(tag);
Wale Ogunwalef6733932018-06-27 05:14:34 -07006128 return ActivityTaskManagerService.this.acquireSleepToken(tag, displayId);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006129 }
6130
6131 @Override
6132 public ComponentName getHomeActivityForUser(int userId) {
6133 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006134 final ActivityRecord homeActivity =
Louis Chang149d5c82019-12-30 09:47:39 +08006135 mRootWindowContainer.getDefaultDisplayHomeActivityForUser(userId);
Wale Ogunwale8b19de92018-11-29 19:58:26 -08006136 return homeActivity == null ? null : homeActivity.mActivityComponent;
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006137 }
6138 }
6139
6140 @Override
6141 public void onLocalVoiceInteractionStarted(IBinder activity,
6142 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
6143 synchronized (mGlobalLock) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006144 onLocalVoiceInteractionStartedLocked(activity, voiceSession, voiceInteractor);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006145 }
6146 }
6147
6148 @Override
Issei Suzukicac2a502019-04-16 16:52:50 +02006149 public void notifySingleTaskDisplayDrawn(int displayId) {
6150 mTaskChangeNotificationController.notifySingleTaskDisplayDrawn(displayId);
6151 }
6152
6153 @Override
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006154 public void notifyAppTransitionFinished() {
6155 synchronized (mGlobalLock) {
6156 mStackSupervisor.notifyAppTransitionDone();
6157 }
6158 }
6159
6160 @Override
6161 public void notifyAppTransitionCancelled() {
6162 synchronized (mGlobalLock) {
6163 mStackSupervisor.notifyAppTransitionDone();
6164 }
6165 }
6166
6167 @Override
6168 public List<IBinder> getTopVisibleActivities() {
6169 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006170 return mRootWindowContainer.getTopVisibleActivities();
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006171 }
6172 }
6173
6174 @Override
Philip P. Moltmannee295092020-02-10 08:46:26 -08006175 public int startActivitiesAsPackage(String packageName, @Nullable String featureId,
6176 int userId, Intent[] intents, Bundle bOptions) {
Daulet Zhanguzinc6c641f2020-01-02 17:18:30 +00006177 Objects.requireNonNull(intents, "intents");
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006178 final String[] resolvedTypes = new String[intents.length];
6179
6180 // UID of the package on user userId.
6181 // "= 0" is needed because otherwise catch(RemoteException) would make it look like
6182 // packageUid may not be initialized.
6183 int packageUid = 0;
6184 final long ident = Binder.clearCallingIdentity();
6185
6186 try {
6187 for (int i = 0; i < intents.length; i++) {
6188 resolvedTypes[i] =
6189 intents[i].resolveTypeIfNeeded(mContext.getContentResolver());
6190 }
6191
6192 packageUid = AppGlobals.getPackageManager().getPackageUid(
6193 packageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId);
6194 } catch (RemoteException e) {
6195 // Shouldn't happen.
6196 } finally {
6197 Binder.restoreCallingIdentity(ident);
6198 }
6199
Riddle Hsu591bf612019-02-14 17:55:31 +08006200 return getActivityStartController().startActivitiesInPackage(
Philip P. Moltmannee295092020-02-10 08:46:26 -08006201 packageUid, packageName, featureId,
Riddle Hsu591bf612019-02-14 17:55:31 +08006202 intents, resolvedTypes, null /* resultTo */,
6203 SafeActivityOptions.fromBundle(bOptions), userId,
6204 false /* validateIncomingUser */, null /* originatingPendingIntent */,
6205 false /* allowBackgroundActivityStart */);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006206 }
6207
6208 @Override
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00006209 public int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006210 String callingPackage, @Nullable String callingFeatureId, Intent[] intents,
6211 String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId,
6212 boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent,
Michal Karpinskiac116df2018-12-10 17:51:42 +00006213 boolean allowBackgroundActivityStart) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07006214 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006215 synchronized (mGlobalLock) {
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00006216 return getActivityStartController().startActivitiesInPackage(uid, realCallingPid,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006217 realCallingUid, callingPackage, callingFeatureId, intents, resolvedTypes,
6218 resultTo, options, userId, validateIncomingUser, originatingPendingIntent,
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00006219 allowBackgroundActivityStart);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006220 }
6221 }
6222
6223 @Override
6224 public int startActivityInPackage(int uid, int realCallingPid, int realCallingUid,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006225 String callingPackage, @Nullable String callingFeatureId, Intent intent,
6226 String resolvedType, IBinder resultTo, String resultWho, int requestCode,
6227 int startFlags, SafeActivityOptions options, int userId, Task inTask, String reason,
6228 boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent,
Michal Karpinskiac116df2018-12-10 17:51:42 +00006229 boolean allowBackgroundActivityStart) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07006230 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006231 synchronized (mGlobalLock) {
6232 return getActivityStartController().startActivityInPackage(uid, realCallingPid,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006233 realCallingUid, callingPackage, callingFeatureId, intent, resolvedType,
6234 resultTo, resultWho, requestCode, startFlags, options, userId, inTask,
6235 reason, validateIncomingUser, originatingPendingIntent,
Michal Karpinskiac116df2018-12-10 17:51:42 +00006236 allowBackgroundActivityStart);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006237 }
6238 }
6239
6240 @Override
Philip P. Moltmannee295092020-02-10 08:46:26 -08006241 public int startActivityAsUser(IApplicationThread caller, String callerPackage,
Alex Kershaw16406c32020-02-17 12:28:53 +00006242 @Nullable String callerFeatureId, Intent intent, @Nullable IBinder resultTo,
6243 int startFlags, Bundle options, int userId) {
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006244 return ActivityTaskManagerService.this.startActivityAsUser(
Philip P. Moltmannee295092020-02-10 08:46:26 -08006245 caller, callerPackage, callerFeatureId, intent,
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006246 intent.resolveTypeIfNeeded(mContext.getContentResolver()),
Alex Kershaw16406c32020-02-17 12:28:53 +00006247 resultTo, null, 0, startFlags, null, options, userId,
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006248 false /*validateIncomingUser*/);
6249 }
6250
6251 @Override
lumark588a3e82018-07-20 18:53:54 +08006252 public void notifyKeyguardFlagsChanged(@Nullable Runnable callback, int displayId) {
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006253 synchronized (mGlobalLock) {
6254
6255 // We might change the visibilities here, so prepare an empty app transition which
6256 // might be overridden later if we actually change visibilities.
Louis Chang677921f2019-12-06 16:44:24 +08006257 final DisplayContent displayContent =
Louis Chang149d5c82019-12-30 09:47:39 +08006258 mRootWindowContainer.getDisplayContent(displayId);
Louis Chang677921f2019-12-06 16:44:24 +08006259 if (displayContent == null) {
lumark52ea28e2018-11-09 17:30:47 +08006260 return;
6261 }
Louis Chang677921f2019-12-06 16:44:24 +08006262 final DisplayContent dc = displayContent.mDisplayContent;
Wale Ogunwale3a256e62018-12-06 14:41:18 -08006263 final boolean wasTransitionSet =
6264 dc.mAppTransition.getAppTransition() != TRANSIT_NONE;
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006265 if (!wasTransitionSet) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08006266 dc.prepareAppTransition(TRANSIT_NONE, false /* alwaysKeepCurrent */);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006267 }
Louis Chang149d5c82019-12-30 09:47:39 +08006268 mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006269
6270 // If there was a transition set already we don't want to interfere with it as we
6271 // might be starting it too early.
6272 if (!wasTransitionSet) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08006273 dc.executeAppTransition();
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006274 }
6275 }
6276 if (callback != null) {
6277 callback.run();
6278 }
6279 }
6280
6281 @Override
6282 public void notifyKeyguardTrustedChanged() {
6283 synchronized (mGlobalLock) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006284 if (mKeyguardController.isKeyguardShowing(DEFAULT_DISPLAY)) {
Louis Chang149d5c82019-12-30 09:47:39 +08006285 mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006286 }
6287 }
6288 }
6289
6290 /**
6291 * Called after virtual display Id is updated by
6292 * {@link com.android.server.vr.Vr2dDisplay} with a specific
6293 * {@param vrVr2dDisplayId}.
6294 */
6295 @Override
6296 public void setVr2dDisplayId(int vr2dDisplayId) {
6297 if (DEBUG_STACK) Slog.d(TAG, "setVr2dDisplayId called for: " + vr2dDisplayId);
6298 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006299 mVr2dDisplayId = vr2dDisplayId;
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006300 }
6301 }
6302
6303 @Override
6304 public void setFocusedActivity(IBinder token) {
6305 synchronized (mGlobalLock) {
6306 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
6307 if (r == null) {
6308 throw new IllegalArgumentException(
6309 "setFocusedActivity: No activity record matching token=" + token);
6310 }
Louis Chang19443452018-10-09 12:10:21 +08006311 if (r.moveFocusableActivityToTop("setFocusedActivity")) {
Louis Chang149d5c82019-12-30 09:47:39 +08006312 mRootWindowContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006313 }
6314 }
6315 }
6316
6317 @Override
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006318 public void registerScreenObserver(ScreenObserver observer) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006319 mScreenObservers.add(observer);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006320 }
6321
6322 @Override
6323 public boolean isCallerRecents(int callingUid) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07006324 return getRecentTasks().isCallerRecents(callingUid);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006325 }
6326
6327 @Override
6328 public boolean isRecentsComponentHomeActivity(int userId) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07006329 return getRecentTasks().isRecentsComponentHomeActivity(userId);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006330 }
6331
6332 @Override
6333 public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
6334 ActivityTaskManagerService.this.cancelRecentsAnimation(restoreHomeStackPosition);
6335 }
6336
6337 @Override
6338 public void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006339 ActivityTaskManagerService.this.enforceCallerIsRecentsOrHasPermission(permission, func);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006340 }
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006341
6342 @Override
6343 public void notifyActiveVoiceInteractionServiceChanged(ComponentName component) {
6344 synchronized (mGlobalLock) {
6345 mActiveVoiceInteractionServiceComponent = component;
6346 }
6347 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006348
6349 @Override
6350 public void setAllowAppSwitches(@NonNull String type, int uid, int userId) {
6351 if (!mAmInternal.isUserRunning(userId, ActivityManager.FLAG_OR_STOPPED)) {
6352 return;
6353 }
6354 synchronized (mGlobalLock) {
6355 ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(userId);
6356 if (types == null) {
6357 if (uid < 0) {
6358 return;
6359 }
6360 types = new ArrayMap<>();
6361 mAllowAppSwitchUids.put(userId, types);
6362 }
6363 if (uid < 0) {
6364 types.remove(type);
6365 } else {
6366 types.put(type, uid);
6367 }
6368 }
6369 }
6370
6371 @Override
6372 public void onUserStopped(int userId) {
6373 synchronized (mGlobalLock) {
6374 getRecentTasks().unloadUserDataFromMemoryLocked(userId);
6375 mAllowAppSwitchUids.remove(userId);
6376 }
6377 }
6378
6379 @Override
6380 public boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
6381 synchronized (mGlobalLock) {
6382 return ActivityTaskManagerService.this.isGetTasksAllowed(
6383 caller, callingPid, callingUid);
6384 }
6385 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006386
Riddle Hsua0536432019-02-16 00:38:59 +08006387 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006388 @Override
6389 public void onProcessAdded(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006390 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006391 mProcessNames.put(proc.mName, proc.mUid, proc);
6392 }
6393 }
6394
Riddle Hsua0536432019-02-16 00:38:59 +08006395 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006396 @Override
6397 public void onProcessRemoved(String name, int uid) {
Riddle Hsua0536432019-02-16 00:38:59 +08006398 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006399 mProcessNames.remove(name, uid);
6400 }
6401 }
6402
Riddle Hsua0536432019-02-16 00:38:59 +08006403 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006404 @Override
6405 public void onCleanUpApplicationRecord(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006406 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006407 if (proc == mHomeProcess) {
6408 mHomeProcess = null;
6409 }
6410 if (proc == mPreviousProcess) {
6411 mPreviousProcess = null;
6412 }
6413 }
6414 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07006415
Riddle Hsua0536432019-02-16 00:38:59 +08006416 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalef6733932018-06-27 05:14:34 -07006417 @Override
6418 public int getTopProcessState() {
Riddle Hsua0536432019-02-16 00:38:59 +08006419 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006420 return mTopProcessState;
6421 }
6422 }
6423
Riddle Hsua0536432019-02-16 00:38:59 +08006424 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalef6733932018-06-27 05:14:34 -07006425 @Override
Wale Ogunwale53783742018-09-16 10:21:51 -07006426 public boolean isHeavyWeightProcess(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006427 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale53783742018-09-16 10:21:51 -07006428 return proc == mHeavyWeightProcess;
6429 }
6430 }
6431
Riddle Hsua0536432019-02-16 00:38:59 +08006432 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale53783742018-09-16 10:21:51 -07006433 @Override
6434 public void clearHeavyWeightProcessIfEquals(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006435 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale53783742018-09-16 10:21:51 -07006436 ActivityTaskManagerService.this.clearHeavyWeightProcessIfEquals(proc);
6437 }
6438 }
6439
6440 @Override
6441 public void finishHeavyWeightApp() {
6442 synchronized (mGlobalLock) {
Sudheer Shankaee1da272018-10-20 20:11:44 -07006443 if (mHeavyWeightProcess != null) {
6444 mHeavyWeightProcess.finishActivities();
6445 }
Wale Ogunwale53783742018-09-16 10:21:51 -07006446 ActivityTaskManagerService.this.clearHeavyWeightProcessIfEquals(
6447 mHeavyWeightProcess);
6448 }
6449 }
6450
Riddle Hsua0536432019-02-16 00:38:59 +08006451 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwale53783742018-09-16 10:21:51 -07006452 @Override
Wale Ogunwalef6733932018-06-27 05:14:34 -07006453 public boolean isSleeping() {
Riddle Hsua0536432019-02-16 00:38:59 +08006454 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006455 return isSleepingLocked();
6456 }
6457 }
6458
6459 @Override
6460 public boolean isShuttingDown() {
6461 synchronized (mGlobalLock) {
6462 return mShuttingDown;
6463 }
6464 }
6465
6466 @Override
6467 public boolean shuttingDown(boolean booted, int timeout) {
6468 synchronized (mGlobalLock) {
6469 mShuttingDown = true;
Louis Chang149d5c82019-12-30 09:47:39 +08006470 mRootWindowContainer.prepareForShutdown();
Wale Ogunwalef6733932018-06-27 05:14:34 -07006471 updateEventDispatchingLocked(booted);
Wale Ogunwaled4d67d02018-10-25 18:09:39 -07006472 notifyTaskPersisterLocked(null, true);
Wale Ogunwalef6733932018-06-27 05:14:34 -07006473 return mStackSupervisor.shutdownLocked(timeout);
6474 }
6475 }
6476
6477 @Override
6478 public void enableScreenAfterBoot(boolean booted) {
6479 synchronized (mGlobalLock) {
Jeff Changd136e772019-11-05 20:33:52 +08006480 writeBootProgressEnableScreen(SystemClock.uptimeMillis());
Wale Ogunwalef6733932018-06-27 05:14:34 -07006481 mWindowManager.enableScreenAfterBoot();
6482 updateEventDispatchingLocked(booted);
6483 }
6484 }
6485
6486 @Override
6487 public boolean showStrictModeViolationDialog() {
6488 synchronized (mGlobalLock) {
6489 return mShowDialogs && !mSleeping && !mShuttingDown;
6490 }
6491 }
6492
6493 @Override
6494 public void showSystemReadyErrorDialogsIfNeeded() {
6495 synchronized (mGlobalLock) {
6496 try {
6497 if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
6498 Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your"
6499 + " data partition or your device will be unstable.");
6500 mUiHandler.post(() -> {
6501 if (mShowDialogs) {
6502 AlertDialog d = new BaseErrorDialog(mUiContext);
6503 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
6504 d.setCancelable(false);
6505 d.setTitle(mUiContext.getText(R.string.android_system_label));
6506 d.setMessage(mUiContext.getText(R.string.system_error_wipe_data));
6507 d.setButton(DialogInterface.BUTTON_POSITIVE,
6508 mUiContext.getText(R.string.ok),
6509 mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
6510 d.show();
6511 }
6512 });
6513 }
6514 } catch (RemoteException e) {
6515 }
6516
6517 if (!Build.isBuildConsistent()) {
6518 Slog.e(TAG, "Build fingerprint is not consistent, warning user");
6519 mUiHandler.post(() -> {
6520 if (mShowDialogs) {
6521 AlertDialog d = new BaseErrorDialog(mUiContext);
6522 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
6523 d.setCancelable(false);
6524 d.setTitle(mUiContext.getText(R.string.android_system_label));
6525 d.setMessage(mUiContext.getText(R.string.system_error_manufacturer));
6526 d.setButton(DialogInterface.BUTTON_POSITIVE,
6527 mUiContext.getText(R.string.ok),
6528 mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
6529 d.show();
6530 }
6531 });
6532 }
6533 }
6534 }
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006535
6536 @Override
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006537 public void onProcessMapped(int pid, WindowProcessController proc) {
6538 synchronized (mGlobalLock) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006539 mProcessMap.put(pid, proc);
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006540 }
6541 }
6542
6543 @Override
6544 public void onProcessUnMapped(int pid) {
6545 synchronized (mGlobalLock) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006546 mProcessMap.remove(pid);
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006547 }
6548 }
Wale Ogunwale008163e2018-07-23 23:11:08 -07006549
6550 @Override
6551 public void onPackageDataCleared(String name) {
6552 synchronized (mGlobalLock) {
Wale Ogunwale53783742018-09-16 10:21:51 -07006553 mCompatModePackages.handlePackageDataClearedLocked(name);
Wale Ogunwale008163e2018-07-23 23:11:08 -07006554 mAppWarnings.onPackageDataCleared(name);
6555 }
6556 }
6557
6558 @Override
6559 public void onPackageUninstalled(String name) {
6560 synchronized (mGlobalLock) {
6561 mAppWarnings.onPackageUninstalled(name);
Wale Ogunwale53783742018-09-16 10:21:51 -07006562 mCompatModePackages.handlePackageUninstalledLocked(name);
Wale Ogunwale008163e2018-07-23 23:11:08 -07006563 }
6564 }
Wale Ogunwale53783742018-09-16 10:21:51 -07006565
6566 @Override
6567 public void onPackageAdded(String name, boolean replacing) {
6568 synchronized (mGlobalLock) {
6569 mCompatModePackages.handlePackageAddedLocked(name, replacing);
6570 }
6571 }
6572
6573 @Override
Wale Ogunwale31913b52018-10-13 08:29:31 -07006574 public void onPackageReplaced(ApplicationInfo aInfo) {
6575 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006576 mRootWindowContainer.updateActivityApplicationInfo(aInfo);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006577 }
6578 }
6579
6580 @Override
Wale Ogunwale53783742018-09-16 10:21:51 -07006581 public CompatibilityInfo compatibilityInfoForPackage(ApplicationInfo ai) {
6582 synchronized (mGlobalLock) {
6583 return compatibilityInfoForPackageLocked(ai);
6584 }
6585 }
6586
Yunfan Chen75157d72018-07-27 14:47:21 +09006587 /**
6588 * Set the corresponding display information for the process global configuration. To be
6589 * called when we need to show IME on a different display.
6590 *
6591 * @param pid The process id associated with the IME window.
6592 * @param displayId The ID of the display showing the IME.
6593 */
6594 @Override
Yunfan Chen79b96062018-10-17 12:45:23 -07006595 public void onImeWindowSetOnDisplay(final int pid, final int displayId) {
lumark48973532019-04-12 20:18:15 +08006596 // Don't update process-level configuration for Multi-Client IME process since other
6597 // IMEs on other displays will also receive this configuration change due to IME
6598 // services use the same application config/context.
6599 if (InputMethodSystemProperty.MULTI_CLIENT_IME_ENABLED) return;
lumark5df49512019-04-02 14:56:46 +08006600
Yunfan Chen75157d72018-07-27 14:47:21 +09006601 if (pid == MY_PID || pid < 0) {
6602 if (DEBUG_CONFIGURATION) {
6603 Slog.w(TAG,
6604 "Trying to update display configuration for system/invalid process.");
6605 }
6606 return;
6607 }
Yunfan Chencafc7062019-01-22 17:21:32 +09006608 synchronized (mGlobalLock) {
Louis Chang677921f2019-12-06 16:44:24 +08006609 final DisplayContent displayContent =
Louis Chang149d5c82019-12-30 09:47:39 +08006610 mRootWindowContainer.getDisplayContent(displayId);
Louis Chang677921f2019-12-06 16:44:24 +08006611 if (displayContent == null) {
Yunfan Chencafc7062019-01-22 17:21:32 +09006612 // Call might come when display is not yet added or has been removed.
6613 if (DEBUG_CONFIGURATION) {
6614 Slog.w(TAG, "Trying to update display configuration for non-existing "
6615 + "displayId=" + displayId);
Yunfan Chen75157d72018-07-27 14:47:21 +09006616 }
Yunfan Chencafc7062019-01-22 17:21:32 +09006617 return;
Yunfan Chen75157d72018-07-27 14:47:21 +09006618 }
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006619 final WindowProcessController process = mProcessMap.getProcess(pid);
Yunfan Chencafc7062019-01-22 17:21:32 +09006620 if (process == null) {
6621 if (DEBUG_CONFIGURATION) {
6622 Slog.w(TAG, "Trying to update display configuration for invalid "
6623 + "process, pid=" + pid);
6624 }
6625 return;
6626 }
lumarkddc77fb2019-06-27 22:22:23 +08006627 process.mIsImeProcess = true;
Andrii Kulianfa23a9e2019-10-10 15:15:36 -07006628 process.registerDisplayConfigurationListener(displayContent);
Yunfan Chencafc7062019-01-22 17:21:32 +09006629 }
Yunfan Chen75157d72018-07-27 14:47:21 +09006630 }
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006631
6632 @Override
6633 public void sendActivityResult(int callingUid, IBinder activityToken, String resultWho,
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00006634 int requestCode, int resultCode, Intent data) {
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006635 synchronized (mGlobalLock) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00006636 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08006637 if (r != null && r.getRootTask() != null) {
Andrii Kulian79d67982019-08-19 11:56:16 -07006638 r.sendResult(callingUid, resultWho, requestCode, resultCode, data);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006639 }
6640 }
6641 }
6642
6643 @Override
6644 public void clearPendingResultForActivity(IBinder activityToken,
6645 WeakReference<PendingIntentRecord> pir) {
6646 synchronized (mGlobalLock) {
6647 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
6648 if (r != null && r.pendingResults != null) {
6649 r.pendingResults.remove(pir);
6650 }
6651 }
6652 }
6653
6654 @Override
Sunny Goyald40c3452019-03-20 12:46:55 -07006655 public ActivityTokens getTopActivityForTask(int taskId) {
6656 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006657 final Task task = mRootWindowContainer.anyTaskForId(taskId);
Louis Changcdec0802019-11-11 11:45:07 +08006658 if (task == null) {
Sunny Goyald40c3452019-03-20 12:46:55 -07006659 Slog.w(TAG, "getApplicationThreadForTopActivity failed:"
6660 + " Requested task not found");
6661 return null;
6662 }
Wale Ogunwale21e06482019-11-18 05:14:15 -08006663 final ActivityRecord activity = task.getTopNonFinishingActivity();
Sunny Goyald40c3452019-03-20 12:46:55 -07006664 if (activity == null) {
6665 Slog.w(TAG, "getApplicationThreadForTopActivity failed:"
6666 + " Requested activity not found");
6667 return null;
6668 }
6669 if (!activity.attachedToProcess()) {
6670 Slog.w(TAG, "getApplicationThreadForTopActivity failed: No process for "
6671 + activity);
6672 return null;
6673 }
6674 return new ActivityTokens(activity.appToken, activity.assistToken,
6675 activity.app.getThread());
6676 }
6677 }
6678
6679 @Override
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006680 public IIntentSender getIntentSender(int type, String packageName,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006681 @Nullable String featureId, int callingUid, int userId, IBinder token,
6682 String resultWho, int requestCode, Intent[] intents, String[] resolvedTypes,
6683 int flags, Bundle bOptions) {
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006684 synchronized (mGlobalLock) {
Philip P. Moltmannee295092020-02-10 08:46:26 -08006685 return getIntentSenderLocked(type, packageName, featureId, callingUid, userId,
6686 token, resultWho, requestCode, intents, resolvedTypes, flags, bOptions);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006687 }
6688 }
Wale Ogunwalec4e63a42018-10-02 13:19:54 -07006689
6690 @Override
6691 public ActivityServiceConnectionsHolder getServiceConnectionsHolder(IBinder token) {
6692 synchronized (mGlobalLock) {
6693 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
6694 if (r == null) {
6695 return null;
6696 }
6697 if (r.mServiceConnectionsHolder == null) {
6698 r.mServiceConnectionsHolder = new ActivityServiceConnectionsHolder(
6699 ActivityTaskManagerService.this, r);
6700 }
6701
6702 return r.mServiceConnectionsHolder;
6703 }
6704 }
Wale Ogunwale214f3482018-10-04 11:00:47 -07006705
6706 @Override
6707 public Intent getHomeIntent() {
6708 synchronized (mGlobalLock) {
6709 return ActivityTaskManagerService.this.getHomeIntent();
6710 }
6711 }
6712
6713 @Override
6714 public boolean startHomeActivity(int userId, String reason) {
6715 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006716 return mRootWindowContainer.startHomeOnDisplay(userId, reason, DEFAULT_DISPLAY);
Louis Chang89f43fc2018-10-05 10:59:14 +08006717 }
6718 }
6719
6720 @Override
Chilun8b1f1be2019-03-13 17:14:36 +08006721 public boolean startHomeOnDisplay(int userId, String reason, int displayId,
Chilun39232092019-03-22 14:41:30 +08006722 boolean allowInstrumenting, boolean fromHomeKey) {
Chilun5fd56542019-03-21 19:51:37 +08006723 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006724 return mRootWindowContainer.startHomeOnDisplay(userId, reason, displayId,
Chilun39232092019-03-22 14:41:30 +08006725 allowInstrumenting, fromHomeKey);
Chilun5fd56542019-03-21 19:51:37 +08006726 }
Chilun8b1f1be2019-03-13 17:14:36 +08006727 }
6728
6729 @Override
Louis Chang89f43fc2018-10-05 10:59:14 +08006730 public boolean startHomeOnAllDisplays(int userId, String reason) {
6731 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006732 return mRootWindowContainer.startHomeOnAllDisplays(userId, reason);
Wale Ogunwale214f3482018-10-04 11:00:47 -07006733 }
6734 }
6735
Riddle Hsua0536432019-02-16 00:38:59 +08006736 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale214f3482018-10-04 11:00:47 -07006737 @Override
6738 public boolean isFactoryTestProcess(WindowProcessController wpc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006739 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale214f3482018-10-04 11:00:47 -07006740 if (mFactoryTest == FACTORY_TEST_OFF) {
6741 return false;
6742 }
6743 if (mFactoryTest == FACTORY_TEST_LOW_LEVEL && mTopComponent != null
6744 && wpc.mName.equals(mTopComponent.getPackageName())) {
6745 return true;
6746 }
6747 return mFactoryTest == FACTORY_TEST_HIGH_LEVEL
6748 && (wpc.mInfo.flags & FLAG_FACTORY_TEST) != 0;
6749 }
6750 }
6751
6752 @Override
6753 public void updateTopComponentForFactoryTest() {
6754 synchronized (mGlobalLock) {
6755 if (mFactoryTest != FACTORY_TEST_LOW_LEVEL) {
6756 return;
6757 }
6758 final ResolveInfo ri = mContext.getPackageManager()
6759 .resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST), STOCK_PM_FLAGS);
6760 final CharSequence errorMsg;
6761 if (ri != null) {
6762 final ActivityInfo ai = ri.activityInfo;
6763 final ApplicationInfo app = ai.applicationInfo;
6764 if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
6765 mTopAction = Intent.ACTION_FACTORY_TEST;
6766 mTopData = null;
6767 mTopComponent = new ComponentName(app.packageName, ai.name);
6768 errorMsg = null;
6769 } else {
6770 errorMsg = mContext.getResources().getText(
6771 com.android.internal.R.string.factorytest_not_system);
6772 }
6773 } else {
6774 errorMsg = mContext.getResources().getText(
6775 com.android.internal.R.string.factorytest_no_action);
6776 }
6777 if (errorMsg == null) {
6778 return;
6779 }
6780
6781 mTopAction = null;
6782 mTopData = null;
6783 mTopComponent = null;
6784 mUiHandler.post(() -> {
6785 Dialog d = new FactoryErrorDialog(mUiContext, errorMsg);
6786 d.show();
Wale Ogunwale342fbe92018-10-09 08:44:10 -07006787 mAmInternal.ensureBootCompleted();
Wale Ogunwale214f3482018-10-04 11:00:47 -07006788 });
6789 }
6790 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006791
Riddle Hsua0536432019-02-16 00:38:59 +08006792 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale31913b52018-10-13 08:29:31 -07006793 @Override
6794 public void handleAppDied(WindowProcessController wpc, boolean restarting,
6795 Runnable finishInstrumentationCallback) {
Riddle Hsua0536432019-02-16 00:38:59 +08006796 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07006797 // Remove this application's activities from active lists.
Louis Chang149d5c82019-12-30 09:47:39 +08006798 boolean hasVisibleActivities = mRootWindowContainer.handleAppDied(wpc);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006799
6800 wpc.clearRecentTasks();
6801 wpc.clearActivities();
6802
6803 if (wpc.isInstrumenting()) {
6804 finishInstrumentationCallback.run();
6805 }
6806
Jorim Jaggid0752812018-10-16 16:07:20 +02006807 if (!restarting && hasVisibleActivities) {
Riddle Hsua0022cd2019-09-09 21:12:41 +08006808 deferWindowLayout();
Jorim Jaggid0752812018-10-16 16:07:20 +02006809 try {
Louis Chang149d5c82019-12-30 09:47:39 +08006810 if (!mRootWindowContainer.resumeFocusedStacksTopActivities()) {
Jorim Jaggid0752812018-10-16 16:07:20 +02006811 // If there was nothing to resume, and we are not already restarting
6812 // this process, but there is a visible activity that is hosted by the
6813 // process...then make sure all visible activities are running, taking
6814 // care of restarting this process.
Louis Chang149d5c82019-12-30 09:47:39 +08006815 mRootWindowContainer.ensureActivitiesVisible(null, 0,
Jorim Jaggid0752812018-10-16 16:07:20 +02006816 !PRESERVE_WINDOWS);
6817 }
6818 } finally {
Riddle Hsua0022cd2019-09-09 21:12:41 +08006819 continueWindowLayout();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006820 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006821 }
6822 }
6823 }
6824
6825 @Override
6826 public void closeSystemDialogs(String reason) {
6827 enforceNotIsolatedCaller("closeSystemDialogs");
6828
6829 final int pid = Binder.getCallingPid();
6830 final int uid = Binder.getCallingUid();
6831 final long origId = Binder.clearCallingIdentity();
6832 try {
6833 synchronized (mGlobalLock) {
6834 // Only allow this from foreground processes, so that background
6835 // applications can't abuse it to prevent system UI from being shown.
6836 if (uid >= FIRST_APPLICATION_UID) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006837 final WindowProcessController proc = mProcessMap.getProcess(pid);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006838 if (!proc.isPerceptible()) {
6839 Slog.w(TAG, "Ignoring closeSystemDialogs " + reason
6840 + " from background process " + proc);
6841 return;
6842 }
6843 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006844 mWindowManager.closeSystemDialogs(reason);
6845
Louis Chang149d5c82019-12-30 09:47:39 +08006846 mRootWindowContainer.closeSystemDialogs();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006847 }
Wale Ogunwale2ea36d42018-10-18 10:27:31 -07006848 // Call into AM outside the synchronized block.
6849 mAmInternal.broadcastCloseSystemDialogs(reason);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006850 } finally {
6851 Binder.restoreCallingIdentity(origId);
6852 }
6853 }
6854
6855 @Override
6856 public void cleanupDisabledPackageComponents(
6857 String packageName, Set<String> disabledClasses, int userId, boolean booted) {
6858 synchronized (mGlobalLock) {
6859 // Clean-up disabled activities.
Louis Chang149d5c82019-12-30 09:47:39 +08006860 if (mRootWindowContainer.finishDisabledPackageActivities(
Wale Ogunwale31913b52018-10-13 08:29:31 -07006861 packageName, disabledClasses, true, false, userId) && booted) {
Louis Chang149d5c82019-12-30 09:47:39 +08006862 mRootWindowContainer.resumeFocusedStacksTopActivities();
Riddle Hsufc8ab262019-12-31 15:31:24 +08006863 mStackSupervisor.scheduleIdle();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006864 }
6865
6866 // Clean-up disabled tasks
6867 getRecentTasks().cleanupDisabledPackageTasksLocked(
6868 packageName, disabledClasses, userId);
6869 }
6870 }
6871
6872 @Override
6873 public boolean onForceStopPackage(String packageName, boolean doit, boolean evenPersistent,
6874 int userId) {
6875 synchronized (mGlobalLock) {
6876
6877 boolean didSomething =
6878 getActivityStartController().clearPendingActivityLaunches(packageName);
Louis Chang149d5c82019-12-30 09:47:39 +08006879 didSomething |= mRootWindowContainer.finishDisabledPackageActivities(packageName,
Wale Ogunwale31913b52018-10-13 08:29:31 -07006880 null, doit, evenPersistent, userId);
6881 return didSomething;
6882 }
6883 }
6884
6885 @Override
6886 public void resumeTopActivities(boolean scheduleIdle) {
6887 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006888 mRootWindowContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006889 if (scheduleIdle) {
Riddle Hsufc8ab262019-12-31 15:31:24 +08006890 mStackSupervisor.scheduleIdle();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006891 }
6892 }
6893 }
6894
Riddle Hsua0536432019-02-16 00:38:59 +08006895 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale31913b52018-10-13 08:29:31 -07006896 @Override
6897 public void preBindApplication(WindowProcessController wpc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006898 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07006899 mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(wpc.mInfo);
6900 }
6901 }
6902
Riddle Hsua0536432019-02-16 00:38:59 +08006903 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale31913b52018-10-13 08:29:31 -07006904 @Override
6905 public boolean attachApplication(WindowProcessController wpc) throws RemoteException {
Riddle Hsua0536432019-02-16 00:38:59 +08006906 synchronized (mGlobalLockWithoutBoost) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08006907 if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
6908 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "attachApplication:" + wpc.mName);
6909 }
6910 try {
Louis Chang149d5c82019-12-30 09:47:39 +08006911 return mRootWindowContainer.attachApplication(wpc);
Riddle Hsu2ca561b2019-10-08 21:58:58 +08006912 } finally {
6913 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
6914 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006915 }
6916 }
6917
6918 @Override
6919 public void notifyLockedProfile(@UserIdInt int userId, int currentUserId) {
6920 try {
6921 if (!AppGlobals.getPackageManager().isUidPrivileged(Binder.getCallingUid())) {
6922 throw new SecurityException("Only privileged app can call notifyLockedProfile");
6923 }
6924 } catch (RemoteException ex) {
6925 throw new SecurityException("Fail to check is caller a privileged app", ex);
6926 }
6927
6928 synchronized (mGlobalLock) {
6929 final long ident = Binder.clearCallingIdentity();
6930 try {
6931 if (mAmInternal.shouldConfirmCredentials(userId)) {
6932 if (mKeyguardController.isKeyguardLocked()) {
6933 // Showing launcher to avoid user entering credential twice.
6934 startHomeActivity(currentUserId, "notifyLockedProfile");
6935 }
Louis Chang149d5c82019-12-30 09:47:39 +08006936 mRootWindowContainer.lockAllProfileTasks(userId);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006937 }
6938 } finally {
6939 Binder.restoreCallingIdentity(ident);
6940 }
6941 }
6942 }
6943
6944 @Override
6945 public void startConfirmDeviceCredentialIntent(Intent intent, Bundle options) {
6946 mAmInternal.enforceCallingPermission(
6947 MANAGE_ACTIVITY_STACKS, "startConfirmDeviceCredentialIntent");
6948
6949 synchronized (mGlobalLock) {
6950 final long ident = Binder.clearCallingIdentity();
6951 try {
Pavel Grafovc0fe0a02019-05-13 18:19:33 +01006952 intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
6953 final ActivityOptions activityOptions = options != null
Wale Ogunwale31913b52018-10-13 08:29:31 -07006954 ? new ActivityOptions(options) : ActivityOptions.makeBasic();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006955 mContext.startActivityAsUser(intent, activityOptions.toBundle(),
6956 UserHandle.CURRENT);
6957 } finally {
6958 Binder.restoreCallingIdentity(ident);
6959 }
6960 }
6961 }
6962
6963 @Override
6964 public void writeActivitiesToProto(ProtoOutputStream proto) {
6965 synchronized (mGlobalLock) {
6966 // The output proto of "activity --proto activities"
Wale Ogunwalef342f062020-01-27 07:34:13 -08006967 mRootWindowContainer.dumpDebug(
6968 proto, ROOT_WINDOW_CONTAINER, WindowTraceLogLevel.ALL);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006969 }
6970 }
6971
6972 @Override
6973 public void saveANRState(String reason) {
6974 synchronized (mGlobalLock) {
6975 final StringWriter sw = new StringWriter();
6976 final PrintWriter pw = new FastPrintWriter(sw, false, 1024);
6977 pw.println(" ANR time: " + DateFormat.getDateTimeInstance().format(new Date()));
6978 if (reason != null) {
6979 pw.println(" Reason: " + reason);
6980 }
6981 pw.println();
6982 getActivityStartController().dump(pw, " ", null);
6983 pw.println();
6984 pw.println("-------------------------------------------------------------------------------");
6985 dumpActivitiesLocked(null /* fd */, pw, null /* args */, 0 /* opti */,
6986 true /* dumpAll */, false /* dumpClient */, null /* dumpPackage */,
6987 "" /* header */);
6988 pw.println();
6989 pw.close();
6990
6991 mLastANRState = sw.toString();
6992 }
6993 }
6994
6995 @Override
6996 public void clearSavedANRState() {
6997 synchronized (mGlobalLock) {
6998 mLastANRState = null;
6999 }
7000 }
7001
7002 @Override
7003 public void dump(String cmd, FileDescriptor fd, PrintWriter pw, String[] args, int opti,
7004 boolean dumpAll, boolean dumpClient, String dumpPackage) {
7005 synchronized (mGlobalLock) {
7006 if (DUMP_ACTIVITIES_CMD.equals(cmd) || DUMP_ACTIVITIES_SHORT_CMD.equals(cmd)) {
7007 dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
7008 } else if (DUMP_LASTANR_CMD.equals(cmd)) {
7009 dumpLastANRLocked(pw);
7010 } else if (DUMP_LASTANR_TRACES_CMD.equals(cmd)) {
7011 dumpLastANRTracesLocked(pw);
7012 } else if (DUMP_STARTER_CMD.equals(cmd)) {
7013 dumpActivityStarterLocked(pw, dumpPackage);
7014 } else if (DUMP_CONTAINERS_CMD.equals(cmd)) {
7015 dumpActivityContainersLocked(pw);
7016 } else if (DUMP_RECENTS_CMD.equals(cmd) || DUMP_RECENTS_SHORT_CMD.equals(cmd)) {
7017 if (getRecentTasks() != null) {
7018 getRecentTasks().dump(pw, dumpAll, dumpPackage);
7019 }
7020 }
7021 }
7022 }
7023
7024 @Override
7025 public boolean dumpForProcesses(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
7026 String dumpPackage, int dumpAppId, boolean needSep, boolean testPssMode,
7027 int wakefulness) {
7028 synchronized (mGlobalLock) {
7029 if (mHomeProcess != null && (dumpPackage == null
7030 || mHomeProcess.mPkgList.contains(dumpPackage))) {
7031 if (needSep) {
7032 pw.println();
7033 needSep = false;
7034 }
7035 pw.println(" mHomeProcess: " + mHomeProcess);
7036 }
7037 if (mPreviousProcess != null && (dumpPackage == null
7038 || mPreviousProcess.mPkgList.contains(dumpPackage))) {
7039 if (needSep) {
7040 pw.println();
7041 needSep = false;
7042 }
7043 pw.println(" mPreviousProcess: " + mPreviousProcess);
7044 }
7045 if (dumpAll && (mPreviousProcess == null || dumpPackage == null
7046 || mPreviousProcess.mPkgList.contains(dumpPackage))) {
7047 StringBuilder sb = new StringBuilder(128);
7048 sb.append(" mPreviousProcessVisibleTime: ");
7049 TimeUtils.formatDuration(mPreviousProcessVisibleTime, sb);
7050 pw.println(sb);
7051 }
7052 if (mHeavyWeightProcess != null && (dumpPackage == null
7053 || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
7054 if (needSep) {
7055 pw.println();
7056 needSep = false;
7057 }
7058 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
7059 }
7060 if (dumpPackage == null) {
7061 pw.println(" mGlobalConfiguration: " + getGlobalConfiguration());
Louis Chang149d5c82019-12-30 09:47:39 +08007062 mRootWindowContainer.dumpDisplayConfigs(pw, " ");
Wale Ogunwale31913b52018-10-13 08:29:31 -07007063 }
7064 if (dumpAll) {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08007065 final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
7066 if (dumpPackage == null && topFocusedStack != null) {
7067 pw.println(" mConfigWillChange: " + topFocusedStack.mConfigWillChange);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007068 }
7069 if (mCompatModePackages.getPackages().size() > 0) {
7070 boolean printed = false;
7071 for (Map.Entry<String, Integer> entry
7072 : mCompatModePackages.getPackages().entrySet()) {
7073 String pkg = entry.getKey();
7074 int mode = entry.getValue();
7075 if (dumpPackage != null && !dumpPackage.equals(pkg)) {
7076 continue;
7077 }
7078 if (!printed) {
7079 pw.println(" mScreenCompatPackages:");
7080 printed = true;
7081 }
7082 pw.println(" " + pkg + ": " + mode);
7083 }
7084 }
7085 }
7086
7087 if (dumpPackage == null) {
7088 pw.println(" mWakefulness="
7089 + PowerManagerInternal.wakefulnessToString(wakefulness));
Louis Chang149d5c82019-12-30 09:47:39 +08007090 pw.println(" mSleepTokens=" + mRootWindowContainer.mSleepTokens);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007091 if (mRunningVoice != null) {
7092 pw.println(" mRunningVoice=" + mRunningVoice);
7093 pw.println(" mVoiceWakeLock" + mVoiceWakeLock);
7094 }
7095 pw.println(" mSleeping=" + mSleeping);
7096 pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + testPssMode);
7097 pw.println(" mVrController=" + mVrController);
7098 }
7099 if (mCurAppTimeTracker != null) {
7100 mCurAppTimeTracker.dumpWithHeader(pw, " ", true);
7101 }
7102 if (mAllowAppSwitchUids.size() > 0) {
7103 boolean printed = false;
7104 for (int i = 0; i < mAllowAppSwitchUids.size(); i++) {
7105 ArrayMap<String, Integer> types = mAllowAppSwitchUids.valueAt(i);
7106 for (int j = 0; j < types.size(); j++) {
7107 if (dumpPackage == null ||
7108 UserHandle.getAppId(types.valueAt(j).intValue()) == dumpAppId) {
7109 if (needSep) {
7110 pw.println();
7111 needSep = false;
7112 }
7113 if (!printed) {
7114 pw.println(" mAllowAppSwitchUids:");
7115 printed = true;
7116 }
7117 pw.print(" User ");
7118 pw.print(mAllowAppSwitchUids.keyAt(i));
7119 pw.print(": Type ");
7120 pw.print(types.keyAt(j));
7121 pw.print(" = ");
7122 UserHandle.formatUid(pw, types.valueAt(j).intValue());
7123 pw.println();
7124 }
7125 }
7126 }
7127 }
7128 if (dumpPackage == null) {
7129 if (mController != null) {
7130 pw.println(" mController=" + mController
7131 + " mControllerIsAMonkey=" + mControllerIsAMonkey);
7132 }
Andrii Kulianc598b2d2019-02-07 17:16:38 -08007133 pw.println(" mGoingToSleepWakeLock=" + mStackSupervisor.mGoingToSleepWakeLock);
7134 pw.println(" mLaunchingActivityWakeLock="
7135 + mStackSupervisor.mLaunchingActivityWakeLock);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007136 }
7137
7138 return needSep;
7139 }
7140 }
7141
7142 @Override
sanryhuang498e77e2018-12-06 14:57:01 +08007143 public void writeProcessesToProto(ProtoOutputStream proto, String dumpPackage,
7144 int wakeFullness, boolean testPssMode) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07007145 synchronized (mGlobalLock) {
7146 if (dumpPackage == null) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007147 getGlobalConfiguration().dumpDebug(proto, GLOBAL_CONFIGURATION);
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08007148 final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
7149 if (topFocusedStack != null) {
7150 proto.write(CONFIG_WILL_CHANGE, topFocusedStack.mConfigWillChange);
7151 }
sanryhuang498e77e2018-12-06 14:57:01 +08007152 writeSleepStateToProto(proto, wakeFullness, testPssMode);
7153 if (mRunningVoice != null) {
7154 final long vrToken = proto.start(
7155 ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE);
7156 proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION,
7157 mRunningVoice.toString());
Jeffrey Huangcb782852019-12-05 11:28:11 -08007158 mVoiceWakeLock.dumpDebug(
sanryhuang498e77e2018-12-06 14:57:01 +08007159 proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK);
7160 proto.end(vrToken);
7161 }
Jeffrey Huangcb782852019-12-05 11:28:11 -08007162 mVrController.dumpDebug(proto,
sanryhuang498e77e2018-12-06 14:57:01 +08007163 ActivityManagerServiceDumpProcessesProto.VR_CONTROLLER);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007164 if (mController != null) {
7165 final long token = proto.start(CONTROLLER);
Wally Yau0eb29f62020-01-08 10:16:43 -08007166 proto.write(ActivityManagerServiceDumpProcessesProto.Controller.CONTROLLER,
7167 mController.toString());
Wale Ogunwale31913b52018-10-13 08:29:31 -07007168 proto.write(IS_A_MONKEY, mControllerIsAMonkey);
7169 proto.end(token);
7170 }
Jeffrey Huangcb782852019-12-05 11:28:11 -08007171 mStackSupervisor.mGoingToSleepWakeLock.dumpDebug(proto, GOING_TO_SLEEP);
7172 mStackSupervisor.mLaunchingActivityWakeLock.dumpDebug(proto,
Andrii Kulianc598b2d2019-02-07 17:16:38 -08007173 LAUNCHING_ACTIVITY);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007174 }
7175
7176 if (mHomeProcess != null && (dumpPackage == null
7177 || mHomeProcess.mPkgList.contains(dumpPackage))) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007178 mHomeProcess.dumpDebug(proto, HOME_PROC);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007179 }
7180
7181 if (mPreviousProcess != null && (dumpPackage == null
7182 || mPreviousProcess.mPkgList.contains(dumpPackage))) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007183 mPreviousProcess.dumpDebug(proto, PREVIOUS_PROC);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007184 proto.write(PREVIOUS_PROC_VISIBLE_TIME_MS, mPreviousProcessVisibleTime);
7185 }
7186
7187 if (mHeavyWeightProcess != null && (dumpPackage == null
7188 || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007189 mHeavyWeightProcess.dumpDebug(proto, HEAVY_WEIGHT_PROC);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007190 }
7191
7192 for (Map.Entry<String, Integer> entry
7193 : mCompatModePackages.getPackages().entrySet()) {
7194 String pkg = entry.getKey();
7195 int mode = entry.getValue();
7196 if (dumpPackage == null || dumpPackage.equals(pkg)) {
7197 long compatToken = proto.start(SCREEN_COMPAT_PACKAGES);
7198 proto.write(PACKAGE, pkg);
7199 proto.write(MODE, mode);
7200 proto.end(compatToken);
7201 }
7202 }
7203
7204 if (mCurAppTimeTracker != null) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007205 mCurAppTimeTracker.dumpDebug(proto, CURRENT_TRACKER, true);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007206 }
7207
7208 }
7209 }
7210
7211 @Override
7212 public boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name,
7213 String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly,
7214 boolean dumpFocusedStackOnly) {
Riddle Hsud7cd8ed2019-07-16 18:19:01 +08007215 return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti, dumpAll,
7216 dumpVisibleStacksOnly, dumpFocusedStackOnly);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007217 }
7218
7219 @Override
Wale Ogunwaled4d67d02018-10-25 18:09:39 -07007220 public void dumpForOom(PrintWriter pw) {
7221 synchronized (mGlobalLock) {
7222 pw.println(" mHomeProcess: " + mHomeProcess);
7223 pw.println(" mPreviousProcess: " + mPreviousProcess);
7224 if (mHeavyWeightProcess != null) {
7225 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
7226 }
7227 }
7228 }
7229
7230 @Override
Wale Ogunwale31913b52018-10-13 08:29:31 -07007231 public boolean canGcNow() {
7232 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007233 return isSleeping() || mRootWindowContainer.allResumedActivitiesIdle();
Wale Ogunwale31913b52018-10-13 08:29:31 -07007234 }
7235 }
7236
Riddle Hsua0536432019-02-16 00:38:59 +08007237 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwale31913b52018-10-13 08:29:31 -07007238 @Override
7239 public WindowProcessController getTopApp() {
Riddle Hsud7088f82019-01-30 13:04:50 +08007240 synchronized (mGlobalLockWithoutBoost) {
Louis Chang149d5c82019-12-30 09:47:39 +08007241 if (mRootWindowContainer == null) {
7242 // Return null if mRootWindowContainer not yet initialize, while update
Louis Chang3ff72a82019-12-17 12:12:59 +08007243 // oomadj after AMS created.
7244 return null;
7245 }
Louis Chang149d5c82019-12-30 09:47:39 +08007246 final ActivityRecord top = mRootWindowContainer.getTopResumedActivity();
Wale Ogunwale31913b52018-10-13 08:29:31 -07007247 return top != null ? top.app : null;
7248 }
7249 }
7250
Riddle Hsua0536432019-02-16 00:38:59 +08007251 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwale31913b52018-10-13 08:29:31 -07007252 @Override
7253 public void rankTaskLayersIfNeeded() {
Riddle Hsud7088f82019-01-30 13:04:50 +08007254 synchronized (mGlobalLockWithoutBoost) {
Louis Chang149d5c82019-12-30 09:47:39 +08007255 if (mRootWindowContainer != null) {
7256 mRootWindowContainer.rankTaskLayersIfNeeded();
Wale Ogunwale31913b52018-10-13 08:29:31 -07007257 }
7258 }
7259 }
7260
7261 @Override
7262 public void scheduleDestroyAllActivities(String reason) {
7263 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007264 mRootWindowContainer.scheduleDestroyAllActivities(reason);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007265 }
7266 }
7267
7268 @Override
7269 public void removeUser(int userId) {
7270 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007271 mRootWindowContainer.removeUser(userId);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007272 }
7273 }
7274
7275 @Override
7276 public boolean switchUser(int userId, UserState userState) {
7277 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007278 return mRootWindowContainer.switchUser(userId, userState);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007279 }
7280 }
7281
7282 @Override
7283 public void onHandleAppCrash(WindowProcessController wpc) {
7284 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007285 mRootWindowContainer.handleAppCrash(wpc);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007286 }
7287 }
Wale Ogunwale64258362018-10-16 15:13:37 -07007288
7289 @Override
7290 public int finishTopCrashedActivities(WindowProcessController crashedApp, String reason) {
7291 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007292 return mRootWindowContainer.finishTopCrashedActivities(crashedApp, reason);
Wale Ogunwale64258362018-10-16 15:13:37 -07007293 }
7294 }
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007295
Riddle Hsua0536432019-02-16 00:38:59 +08007296 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007297 @Override
7298 public void onUidActive(int uid, int procState) {
Riddle Hsua0536432019-02-16 00:38:59 +08007299 mActiveUids.onUidActive(uid, procState);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007300 }
7301
Riddle Hsua0536432019-02-16 00:38:59 +08007302 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007303 @Override
7304 public void onUidInactive(int uid) {
Riddle Hsua0536432019-02-16 00:38:59 +08007305 mActiveUids.onUidInactive(uid);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007306 }
7307
Riddle Hsua0536432019-02-16 00:38:59 +08007308 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007309 @Override
7310 public void onActiveUidsCleared() {
Riddle Hsua0536432019-02-16 00:38:59 +08007311 mActiveUids.onActiveUidsCleared();
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007312 }
7313
Riddle Hsua0536432019-02-16 00:38:59 +08007314 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007315 @Override
7316 public void onUidProcStateChanged(int uid, int procState) {
Riddle Hsua0536432019-02-16 00:38:59 +08007317 mActiveUids.onUidProcStateChanged(uid, procState);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007318 }
Wale Ogunwale9de19442018-10-18 19:05:03 -07007319
7320 @Override
7321 public void onUidAddedToPendingTempWhitelist(int uid, String tag) {
Riddle Hsud7088f82019-01-30 13:04:50 +08007322 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9de19442018-10-18 19:05:03 -07007323 mPendingTempWhitelist.put(uid, tag);
7324 }
7325 }
7326
7327 @Override
7328 public void onUidRemovedFromPendingTempWhitelist(int uid) {
Riddle Hsud7088f82019-01-30 13:04:50 +08007329 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9de19442018-10-18 19:05:03 -07007330 mPendingTempWhitelist.remove(uid);
7331 }
7332 }
Wale Ogunwalee2172292018-10-25 10:11:10 -07007333
7334 @Override
7335 public boolean handleAppCrashInActivityController(String processName, int pid,
7336 String shortMsg, String longMsg, long timeMillis, String stackTrace,
7337 Runnable killCrashingAppCallback) {
7338 synchronized (mGlobalLock) {
7339 if (mController == null) {
7340 return false;
7341 }
7342
7343 try {
7344 if (!mController.appCrashed(processName, pid, shortMsg, longMsg, timeMillis,
7345 stackTrace)) {
7346 killCrashingAppCallback.run();
7347 return true;
7348 }
7349 } catch (RemoteException e) {
7350 mController = null;
7351 Watchdog.getInstance().setActivityController(null);
7352 }
7353 return false;
7354 }
7355 }
Wale Ogunwaled7889f52018-10-25 11:03:20 -07007356
7357 @Override
7358 public void removeRecentTasksByPackageName(String packageName, int userId) {
7359 synchronized (mGlobalLock) {
7360 mRecentTasks.removeTasksByPackageName(packageName, userId);
7361 }
7362 }
7363
7364 @Override
7365 public void cleanupRecentTasksForUser(int userId) {
7366 synchronized (mGlobalLock) {
7367 mRecentTasks.cleanupLocked(userId);
7368 }
7369 }
7370
7371 @Override
7372 public void loadRecentTasksForUser(int userId) {
7373 synchronized (mGlobalLock) {
7374 mRecentTasks.loadUserRecentsLocked(userId);
7375 }
7376 }
7377
7378 @Override
7379 public void onPackagesSuspendedChanged(String[] packages, boolean suspended, int userId) {
7380 synchronized (mGlobalLock) {
7381 mRecentTasks.onPackagesSuspendedChanged(packages, suspended, userId);
7382 }
7383 }
7384
7385 @Override
7386 public void flushRecentTasks() {
7387 mRecentTasks.flush();
7388 }
Wale Ogunwaled4d67d02018-10-25 18:09:39 -07007389
7390 @Override
7391 public WindowProcessController getHomeProcess() {
7392 synchronized (mGlobalLock) {
7393 return mHomeProcess;
7394 }
7395 }
7396
7397 @Override
7398 public WindowProcessController getPreviousProcess() {
7399 synchronized (mGlobalLock) {
7400 return mPreviousProcess;
7401 }
7402 }
Wale Ogunwale27c48ae2018-10-25 19:01:01 -07007403
7404 @Override
7405 public void clearLockedTasks(String reason) {
7406 synchronized (mGlobalLock) {
7407 getLockTaskController().clearLockedTasks(reason);
7408 }
7409 }
7410
7411 @Override
7412 public void updateUserConfiguration() {
7413 synchronized (mGlobalLock) {
7414 final Configuration configuration = new Configuration(getGlobalConfiguration());
7415 final int currentUserId = mAmInternal.getCurrentUserId();
7416 Settings.System.adjustConfigurationForUser(mContext.getContentResolver(),
7417 configuration, currentUserId, Settings.System.canWrite(mContext));
7418 updateConfigurationLocked(configuration, null /* starting */,
7419 false /* initLocale */, false /* persistent */, currentUserId,
7420 false /* deferResume */);
7421 }
7422 }
Wale Ogunwale387b34c2018-10-25 19:59:40 -07007423
7424 @Override
7425 public boolean canShowErrorDialogs() {
7426 synchronized (mGlobalLock) {
7427 return mShowDialogs && !mSleeping && !mShuttingDown
7428 && !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY)
7429 && !hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,
7430 mAmInternal.getCurrentUserId())
7431 && !(UserManager.isDeviceInDemoMode(mContext)
7432 && mAmInternal.getCurrentUser().isDemo());
7433 }
7434 }
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -08007435
7436 @Override
7437 public void setProfileApp(String profileApp) {
7438 synchronized (mGlobalLock) {
7439 mProfileApp = profileApp;
7440 }
7441 }
7442
7443 @Override
7444 public void setProfileProc(WindowProcessController wpc) {
7445 synchronized (mGlobalLock) {
7446 mProfileProc = wpc;
7447 }
7448 }
7449
7450 @Override
7451 public void setProfilerInfo(ProfilerInfo profilerInfo) {
7452 synchronized (mGlobalLock) {
7453 mProfilerInfo = profilerInfo;
7454 }
7455 }
Igor Murashkinc0b47e42018-11-07 15:54:18 -08007456
7457 @Override
7458 public ActivityMetricsLaunchObserverRegistry getLaunchObserverRegistry() {
7459 synchronized (mGlobalLock) {
7460 return mStackSupervisor.getActivityMetricsLogger().getLaunchObserverRegistry();
7461 }
7462 }
Winson Chung3fb0f252019-01-08 17:41:55 -08007463
7464 @Override
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02007465 public ActivityManager.TaskSnapshot getTaskSnapshotNoRestore(int taskId,
Peter Kalauskas4dc04602020-02-12 18:49:03 -08007466 boolean isLowResolution) {
7467 return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution,
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02007468 false /* restoreFromDisk */);
Winson Chung3fb0f252019-01-08 17:41:55 -08007469 }
Michal Karpinskicc88d7e2019-01-24 15:32:12 +00007470
7471 @Override
7472 public boolean isUidForeground(int uid) {
7473 synchronized (mGlobalLock) {
7474 return ActivityTaskManagerService.this.isUidForeground(uid);
7475 }
7476 }
Michal Karpinski4026cae2019-02-12 11:51:47 +00007477
7478 @Override
Ricky Wai96f5c352019-04-10 18:40:17 +01007479 public void setDeviceOwnerUid(int uid) {
Michal Karpinski4026cae2019-02-12 11:51:47 +00007480 synchronized (mGlobalLock) {
Ricky Wai96f5c352019-04-10 18:40:17 +01007481 ActivityTaskManagerService.this.setDeviceOwnerUid(uid);
Michal Karpinski4026cae2019-02-12 11:51:47 +00007482 }
7483 }
Ricky Wai2452e2d2019-03-18 19:19:08 +00007484
7485 @Override
7486 public void setCompanionAppPackages(int userId, Set<String> companionAppPackages) {
Michal Karpinskida34cd42019-04-02 19:46:52 +01007487 // Translate package names into UIDs
7488 final Set<Integer> result = new HashSet<>();
Ricky Wai2452e2d2019-03-18 19:19:08 +00007489 for (String pkg : companionAppPackages) {
Michal Karpinskida34cd42019-04-02 19:46:52 +01007490 final int uid = getPackageManagerInternalLocked().getPackageUid(pkg, 0, userId);
7491 if (uid >= 0) {
7492 result.add(uid);
7493 }
Ricky Wai2452e2d2019-03-18 19:19:08 +00007494 }
7495 synchronized (mGlobalLock) {
Michal Karpinskida34cd42019-04-02 19:46:52 +01007496 mCompanionAppUidsMap.put(userId, result);
Ricky Wai2452e2d2019-03-18 19:19:08 +00007497 }
7498 }
Wale Ogunwale6767eae2018-05-03 15:52:51 -07007499 }
Wale Ogunwaleb73f3962018-11-20 07:58:22 -08007500}