blob: 468818745586636309bbce0040e0fa578c16646a [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;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700291import java.util.Date;
Alison Cichowlas3e340502018-08-07 17:15:01 -0400292import java.util.HashMap;
Wale Ogunwaleee6eca12018-09-19 20:37:53 -0700293import java.util.HashSet;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700294import java.util.List;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700295import java.util.Locale;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700296import java.util.Map;
Daulet Zhanguzinc6c641f2020-01-02 17:18:30 +0000297import java.util.Objects;
Wale Ogunwale31913b52018-10-13 08:29:31 -0700298import java.util.Set;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700299
300/**
301 * System service for managing activities and their containers (task, stacks, displays,... ).
302 *
303 * {@hide}
304 */
305public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
Wale Ogunwale98875612018-10-12 07:53:02 -0700306 private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskManagerService" : TAG_ATM;
Wale Ogunwale8f93b642019-12-26 12:10:52 -0800307 static final String TAG_STACK = TAG + POSTFIX_STACK;
Wale Ogunwale196db712019-12-27 15:35:39 +0000308 static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700309 private static final String TAG_IMMERSIVE = TAG + POSTFIX_IMMERSIVE;
310 private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
311 private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;
312 private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700313 private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700314
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700315 // How long we wait until we timeout on key dispatching.
Wale Ogunwale51cc98a2018-10-15 10:41:05 -0700316 public static final int KEY_DISPATCHING_TIMEOUT_MS = 5 * 1000;
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700317 // How long we wait until we timeout on key dispatching during instrumentation.
Wale Ogunwale51cc98a2018-10-15 10:41:05 -0700318 static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT_MS = 60 * 1000;
Michal Karpinskifc6872e2019-05-21 15:18:44 +0100319 // How long we permit background activity starts after an activity in the process
320 // started or finished.
321 static final long ACTIVITY_BG_START_GRACE_PERIOD_MS = 10 * 1000;
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700322
Wale Ogunwale98875612018-10-12 07:53:02 -0700323 /** Used to indicate that an app transition should be animated. */
324 static final boolean ANIMATE = true;
325
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700326 /** Hardware-reported OpenGLES version. */
327 final int GL_ES_VERSION;
328
Wale Ogunwale31913b52018-10-13 08:29:31 -0700329 public static final String DUMP_ACTIVITIES_CMD = "activities" ;
330 public static final String DUMP_ACTIVITIES_SHORT_CMD = "a" ;
331 public static final String DUMP_LASTANR_CMD = "lastanr" ;
332 public static final String DUMP_LASTANR_TRACES_CMD = "lastanr-traces" ;
333 public static final String DUMP_STARTER_CMD = "starter" ;
334 public static final String DUMP_CONTAINERS_CMD = "containers" ;
335 public static final String DUMP_RECENTS_CMD = "recents" ;
336 public static final String DUMP_RECENTS_SHORT_CMD = "r" ;
337
Wale Ogunwale64258362018-10-16 15:13:37 -0700338 /** This activity is not being relaunched, or being relaunched for a non-resize reason. */
339 public static final int RELAUNCH_REASON_NONE = 0;
340 /** This activity is being relaunched due to windowing mode change. */
341 public static final int RELAUNCH_REASON_WINDOWING_MODE_RESIZE = 1;
342 /** This activity is being relaunched due to a free-resize operation. */
343 public static final int RELAUNCH_REASON_FREE_RESIZE = 2;
344
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700345 Context mContext;
Wale Ogunwale64258362018-10-16 15:13:37 -0700346
Wale Ogunwalef6733932018-06-27 05:14:34 -0700347 /**
348 * This Context is themable and meant for UI display (AlertDialogs, etc.). The theme can
349 * change at runtime. Use mContext for non-UI purposes.
350 */
351 final Context mUiContext;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700352 final ActivityThread mSystemThread;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700353 H mH;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700354 UiHandler mUiHandler;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700355 ActivityManagerInternal mAmInternal;
Wale Ogunwale6d50dcc2018-07-21 23:00:40 -0700356 UriGrantsManagerInternal mUgmInternal;
Wale Ogunwale906f9c62018-07-23 11:23:44 -0700357 private PackageManagerInternal mPmInternal;
Hai Zhangf4da9be2019-05-01 13:46:06 +0800358 private PermissionPolicyInternal mPermissionPolicyInternal;
Wale Ogunwaleb73f3962018-11-20 07:58:22 -0800359 @VisibleForTesting
360 final ActivityTaskManagerInternal mInternal;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700361 PowerManagerInternal mPowerManagerInternal;
362 private UsageStatsManagerInternal mUsageStatsInternal;
363
Wale Ogunwaleee6eca12018-09-19 20:37:53 -0700364 PendingIntentController mPendingIntentController;
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700365 IntentFirewall mIntentFirewall;
366
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700367 /* Global service lock used by the package the owns this service. */
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800368 final WindowManagerGlobalLock mGlobalLock = new WindowManagerGlobalLock();
Riddle Hsud7088f82019-01-30 13:04:50 +0800369 /**
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700370 * It is the same instance as {@link #mGlobalLock}, just declared as a type that the
Riddle Hsud7088f82019-01-30 13:04:50 +0800371 * locked-region-code-injection does't recognize it. It is used to skip wrapping priority
372 * booster for places that are already in the scope of another booster (e.g. computing oom-adj).
373 *
374 * @see WindowManagerThreadPriorityBooster
375 */
376 final Object mGlobalLockWithoutBoost = mGlobalLock;
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700377 ActivityStackSupervisor mStackSupervisor;
Louis Chang149d5c82019-12-30 09:47:39 +0800378 RootWindowContainer mRootWindowContainer;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700379 WindowManagerService mWindowManager;
Wale Ogunwalef6733932018-06-27 05:14:34 -0700380 private UserManagerService mUserManager;
Philip P. Moltmannee295092020-02-10 08:46:26 -0800381 private AppOpsManager mAppOpsManager;
Wale Ogunwalebff2df42018-10-18 17:09:19 -0700382 /** All active uids in the system. */
Riddle Hsua0536432019-02-16 00:38:59 +0800383 private final MirrorActiveUids mActiveUids = new MirrorActiveUids();
Wale Ogunwale9de19442018-10-18 19:05:03 -0700384 private final SparseArray<String> mPendingTempWhitelist = new SparseArray<>();
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700385 /** All processes currently running that might have a window organized by name. */
386 final ProcessMap<WindowProcessController> mProcessNames = new ProcessMap<>();
Michal Karpinski2e0aad22019-04-12 16:22:55 +0100387 /** All processes we currently have running mapped by pid and uid */
388 final WindowProcessControllerMap mProcessMap = new WindowProcessControllerMap();
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700389 /** This is the process holding what we currently consider to be the "home" activity. */
390 WindowProcessController mHomeProcess;
Wale Ogunwale53783742018-09-16 10:21:51 -0700391 /** The currently running heavy-weight process, if any. */
392 WindowProcessController mHeavyWeightProcess = null;
Wale Ogunwale214f3482018-10-04 11:00:47 -0700393 boolean mHasHeavyWeightFeature;
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700394 /**
395 * This is the process holding the activity the user last visited that is in a different process
396 * from the one they are currently in.
397 */
398 WindowProcessController mPreviousProcess;
399 /** The time at which the previous process was last visible. */
400 long mPreviousProcessVisibleTime;
401
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700402 /** List of intents that were used to start the most recent tasks. */
403 private RecentTasks mRecentTasks;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700404 /** State of external calls telling us if the device is awake or asleep. */
405 private boolean mKeyguardShown = false;
406
407 // Wrapper around VoiceInteractionServiceManager
408 private AssistUtils mAssistUtils;
409
410 // VoiceInteraction session ID that changes for each new request except when
411 // being called for multi-window assist in a single session.
412 private int mViSessionId = 1000;
413
414 // How long to wait in getAssistContextExtras for the activity and foreground services
415 // to respond with the result.
416 private static final int PENDING_ASSIST_EXTRAS_TIMEOUT = 500;
417
418 // How long top wait when going through the modern assist (which doesn't need to block
419 // on getting this result before starting to launch its UI).
420 private static final int PENDING_ASSIST_EXTRAS_LONG_TIMEOUT = 2000;
421
422 // How long to wait in getAutofillAssistStructure() for the activity to respond with the result.
423 private static final int PENDING_AUTOFILL_ASSIST_STRUCTURE_TIMEOUT = 2000;
424
Alison Cichowlas3e340502018-08-07 17:15:01 -0400425 // Permission tokens are used to temporarily granted a trusted app the ability to call
426 // #startActivityAsCaller. A client is expected to dump its token after this time has elapsed,
427 // showing any appropriate error messages to the user.
428 private static final long START_AS_CALLER_TOKEN_TIMEOUT =
429 10 * MINUTE_IN_MILLIS;
430
431 // How long before the service actually expires a token. This is slightly longer than
432 // START_AS_CALLER_TOKEN_TIMEOUT, to provide a buffer so clients will rarely encounter the
433 // expiration exception.
434 private static final long START_AS_CALLER_TOKEN_TIMEOUT_IMPL =
435 START_AS_CALLER_TOKEN_TIMEOUT + 2 * 1000;
436
437 // How long the service will remember expired tokens, for the purpose of providing error
438 // messaging when a client uses an expired token.
439 private static final long START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT =
440 START_AS_CALLER_TOKEN_TIMEOUT_IMPL + 20 * MINUTE_IN_MILLIS;
441
442 // Activity tokens of system activities that are delegating their call to
443 // #startActivityByCaller, keyed by the permissionToken granted to the delegate.
444 final HashMap<IBinder, IBinder> mStartActivitySources = new HashMap<>();
445
446 // Permission tokens that have expired, but we remember for error reporting.
447 final ArrayList<IBinder> mExpiredStartAsCallerTokens = new ArrayList<>();
448
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700449 private final ArrayList<PendingAssistExtras> mPendingAssistExtras = new ArrayList<>();
450
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700451 // Keeps track of the active voice interaction service component, notified from
452 // VoiceInteractionManagerService
453 ComponentName mActiveVoiceInteractionServiceComponent;
454
Michal Karpinskida34cd42019-04-02 19:46:52 +0100455 // A map userId and all its companion app uids
456 private final Map<Integer, Set<Integer>> mCompanionAppUidsMap = new ArrayMap<>();
Ricky Wai2452e2d2019-03-18 19:19:08 +0000457
Wale Ogunwalee2172292018-10-25 10:11:10 -0700458 VrController mVrController;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700459 KeyguardController mKeyguardController;
460 private final ClientLifecycleManager mLifecycleManager;
461 private TaskChangeNotificationController mTaskChangeNotificationController;
Wale Ogunwaled95c06b2018-05-08 10:35:38 -0700462 /** The controller for all operations related to locktask. */
463 private LockTaskController mLockTaskController;
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -0700464 private ActivityStartController mActivityStartController;
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700465
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700466 boolean mSuppressResizeConfigChanges;
467
Shivam Agrawal1d3db652019-07-01 15:26:11 -0700468 final UpdateConfigurationResult mTmpUpdateConfigurationResult =
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700469 new UpdateConfigurationResult();
470
471 static final class UpdateConfigurationResult {
472 // Configuration changes that were updated.
473 int changes;
474 // If the activity was relaunched to match the new configuration.
475 boolean activityRelaunched;
476
477 void reset() {
478 changes = 0;
479 activityRelaunched = false;
480 }
481 }
482
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700483 /** Current sequencing integer of the configuration, for skipping old configurations. */
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700484 private int mConfigurationSeq;
485 // To cache the list of supported system locales
486 private String[] mSupportedSystemLocales = null;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700487
488 /**
489 * Temp object used when global and/or display override configuration is updated. It is also
490 * sent to outer world instead of {@link #getGlobalConfiguration} because we don't trust
491 * anyone...
492 */
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700493 private Configuration mTempConfig = new Configuration();
494
Wale Ogunwalef6733932018-06-27 05:14:34 -0700495 /** Temporary to avoid allocations. */
496 final StringBuilder mStringBuilder = new StringBuilder(256);
497
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700498 // Amount of time after a call to stopAppSwitches() during which we will
499 // prevent further untrusted switches from happening.
500 private static final long APP_SWITCH_DELAY_TIME = 5 * 1000;
501
502 /**
503 * The time at which we will allow normal application switches again,
504 * after a call to {@link #stopAppSwitches()}.
505 */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700506 private long mAppSwitchesAllowedTime;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700507 /**
508 * This is set to true after the first switch after mAppSwitchesAllowedTime
509 * is set; any switches after that will clear the time.
510 */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700511 private boolean mDidAppSwitch;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700512
Ricky Wai906af482019-06-03 17:25:28 +0100513 /**
514 * Last stop app switches time, apps finished before this time cannot start background activity
515 * even if they are in grace period.
516 */
517 private long mLastStopAppSwitchesTime;
518
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700519 IActivityController mController = null;
520 boolean mControllerIsAMonkey = false;
521
Wale Ogunwale214f3482018-10-04 11:00:47 -0700522 final int mFactoryTest;
523
524 /** Used to control how we initialize the service. */
525 ComponentName mTopComponent;
526 String mTopAction = Intent.ACTION_MAIN;
527 String mTopData;
528
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800529 /** Profiling app information. */
530 String mProfileApp = null;
531 WindowProcessController mProfileProc = null;
532 ProfilerInfo mProfilerInfo = null;
533
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700534 /**
Wale Ogunwale31913b52018-10-13 08:29:31 -0700535 * Dump of the activity state at the time of the last ANR. Cleared after
536 * {@link WindowManagerService#LAST_ANR_LIFETIME_DURATION_MSECS}
537 */
538 String mLastANRState;
539
540 /**
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700541 * Used to retain an update lock when the foreground activity is in
542 * immersive mode.
543 */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700544 private final UpdateLock mUpdateLock = new UpdateLock("immersive");
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700545
546 /**
547 * Packages that are being allowed to perform unrestricted app switches. Mapping is
548 * User -> Type -> uid.
549 */
550 final SparseArray<ArrayMap<String, Integer>> mAllowAppSwitchUids = new SparseArray<>();
551
552 /** The dimensions of the thumbnails in the Recents UI. */
Wale Ogunwalef6733932018-06-27 05:14:34 -0700553 private int mThumbnailWidth;
554 private int mThumbnailHeight;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700555
556 /**
557 * Flag that indicates if multi-window is enabled.
558 *
559 * For any particular form of multi-window to be enabled, generic multi-window must be enabled
560 * in {@link com.android.internal.R.bool#config_supportsMultiWindow} config or
561 * {@link Settings.Global#DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES} development option set.
562 * At least one of the forms of multi-window must be enabled in order for this flag to be
563 * initialized to 'true'.
564 *
565 * @see #mSupportsSplitScreenMultiWindow
566 * @see #mSupportsFreeformWindowManagement
567 * @see #mSupportsPictureInPicture
568 * @see #mSupportsMultiDisplay
569 */
570 boolean mSupportsMultiWindow;
571 boolean mSupportsSplitScreenMultiWindow;
572 boolean mSupportsFreeformWindowManagement;
573 boolean mSupportsPictureInPicture;
574 boolean mSupportsMultiDisplay;
575 boolean mForceResizableActivities;
Shivam Agrawal780b5bb2019-07-17 10:17:11 -0700576 boolean mSizeCompatFreeform;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700577
578 final List<ActivityTaskManagerInternal.ScreenObserver> mScreenObservers = new ArrayList<>();
579
580 // VR Vr2d Display Id.
581 int mVr2dDisplayId = INVALID_DISPLAY;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700582
Wale Ogunwalef6733932018-06-27 05:14:34 -0700583 /**
584 * Set while we are wanting to sleep, to prevent any
585 * activities from being started/resumed.
586 *
587 * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping.
588 *
589 * Currently mSleeping is set to true when transitioning into the sleep state, and remains true
590 * while in the sleep state until there is a pending transition out of sleep, in which case
591 * mSleeping is set to false, and remains false while awake.
592 *
593 * Whether mSleeping can quickly toggled between true/false without the device actually
594 * display changing states is undefined.
595 */
596 private boolean mSleeping = false;
597
598 /**
599 * The process state used for processes that are running the top activities.
600 * This changes between TOP and TOP_SLEEPING to following mSleeping.
601 */
602 int mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
603
Riddle Hsua0022cd2019-09-09 21:12:41 +0800604 @Retention(RetentionPolicy.SOURCE)
605 @IntDef({
606 LAYOUT_REASON_CONFIG_CHANGED,
607 LAYOUT_REASON_VISIBILITY_CHANGED,
608 })
609 @interface LayoutReason {}
610 static final int LAYOUT_REASON_CONFIG_CHANGED = 0x1;
611 static final int LAYOUT_REASON_VISIBILITY_CHANGED = 0x2;
612
613 /** The reasons to perform surface placement. */
614 @LayoutReason
615 private int mLayoutReasons;
616
Wale Ogunwalef6733932018-06-27 05:14:34 -0700617 // Whether we should show our dialogs (ANR, crash, etc) or just perform their default action
618 // automatically. Important for devices without direct input devices.
619 private boolean mShowDialogs = true;
620
621 /** Set if we are shutting down the system, similar to sleeping. */
622 boolean mShuttingDown = false;
623
624 /**
625 * We want to hold a wake lock while running a voice interaction session, since
626 * this may happen with the screen off and we need to keep the CPU running to
627 * be able to continue to interact with the user.
628 */
629 PowerManager.WakeLock mVoiceWakeLock;
630
631 /**
632 * Set while we are running a voice interaction. This overrides sleeping while it is active.
633 */
634 IVoiceInteractionSession mRunningVoice;
635
636 /**
637 * The last resumed activity. This is identical to the current resumed activity most
638 * of the time but could be different when we're pausing one activity before we resume
639 * another activity.
640 */
641 ActivityRecord mLastResumedActivity;
642
643 /**
644 * The activity that is currently being traced as the active resumed activity.
645 *
646 * @see #updateResumedAppTrace
647 */
648 private @Nullable ActivityRecord mTracedResumedActivity;
649
650 /** If non-null, we are tracking the time the user spends in the currently focused app. */
651 AppTimeTracker mCurAppTimeTracker;
652
Shivam Agrawal1d3db652019-07-01 15:26:11 -0700653 AppWarnings mAppWarnings;
Wale Ogunwale008163e2018-07-23 23:11:08 -0700654
Wale Ogunwale53783742018-09-16 10:21:51 -0700655 /**
656 * Packages that the user has asked to have run in screen size
657 * compatibility mode instead of filling the screen.
658 */
659 CompatModePackages mCompatModePackages;
660
Wale Ogunwalef6733932018-06-27 05:14:34 -0700661 private FontScaleSettingObserver mFontScaleSettingObserver;
662
Robert Carr8a2f9132019-11-11 15:03:15 -0800663 /**
664 * Stores the registration and state of TaskOrganizers in use.
665 */
Evan Rosky0037e5f2019-11-05 10:26:24 -0800666 TaskOrganizerController mTaskOrganizerController = new TaskOrganizerController(this);
Robert Carr8a2f9132019-11-11 15:03:15 -0800667
Ricky Wai96f5c352019-04-10 18:40:17 +0100668 private int mDeviceOwnerUid = Process.INVALID_UID;
Michal Karpinski4026cae2019-02-12 11:51:47 +0000669
Wale Ogunwalef6733932018-06-27 05:14:34 -0700670 private final class FontScaleSettingObserver extends ContentObserver {
671 private final Uri mFontScaleUri = Settings.System.getUriFor(FONT_SCALE);
672 private final Uri mHideErrorDialogsUri = Settings.Global.getUriFor(HIDE_ERROR_DIALOGS);
673
674 public FontScaleSettingObserver() {
675 super(mH);
676 final ContentResolver resolver = mContext.getContentResolver();
677 resolver.registerContentObserver(mFontScaleUri, false, this, UserHandle.USER_ALL);
678 resolver.registerContentObserver(mHideErrorDialogsUri, false, this,
679 UserHandle.USER_ALL);
680 }
681
682 @Override
683 public void onChange(boolean selfChange, Uri uri, @UserIdInt int userId) {
684 if (mFontScaleUri.equals(uri)) {
685 updateFontScaleIfNeeded(userId);
686 } else if (mHideErrorDialogsUri.equals(uri)) {
687 synchronized (mGlobalLock) {
688 updateShouldShowDialogsLocked(getGlobalConfiguration());
689 }
690 }
691 }
692 }
693
Riddle Hsua0536432019-02-16 00:38:59 +0800694 /** Indicates that the method may be invoked frequently or is sensitive to performance. */
695 @Target(ElementType.METHOD)
696 @Retention(RetentionPolicy.SOURCE)
697 @interface HotPath {
698 int NONE = 0;
699 int OOM_ADJUSTMENT = 1;
700 int LRU_UPDATE = 2;
701 int PROCESS_CHANGE = 3;
702 int caller() default NONE;
703 }
704
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800705 private final Runnable mUpdateOomAdjRunnable = new Runnable() {
706 @Override
Wale Ogunwale85fb19a2019-12-05 10:41:05 +0900707 public void run() {
Wale Ogunwalea38654f2019-11-17 20:37:15 -0800708 mAmInternal.updateOomAdj();
709 }
710 };
711
Charles Chen8d98dd22018-12-26 17:36:54 +0800712 @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
713 public ActivityTaskManagerService(Context context) {
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700714 mContext = context;
Wale Ogunwale214f3482018-10-04 11:00:47 -0700715 mFactoryTest = FactoryTest.getMode();
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700716 mSystemThread = ActivityThread.currentActivityThread();
717 mUiContext = mSystemThread.getSystemUiContext();
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700718 mLifecycleManager = new ClientLifecycleManager();
Wale Ogunwaleb73f3962018-11-20 07:58:22 -0800719 mInternal = new LocalService();
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700720 GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", GL_ES_VERSION_UNDEFINED);
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700721 }
722
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700723 public void onSystemReady() {
724 synchronized (mGlobalLock) {
725 mHasHeavyWeightFeature = mContext.getPackageManager().hasSystemFeature(
726 PackageManager.FEATURE_CANT_SAVE_STATE);
727 mAssistUtils = new AssistUtils(mContext);
728 mVrController.onSystemReady();
729 mRecentTasks.onSystemReadyLocked();
Garfield Tan891146c2018-10-09 12:14:00 -0700730 mStackSupervisor.onSystemReady();
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700731 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -0700732 }
733
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700734 public void onInitPowerManagement() {
735 synchronized (mGlobalLock) {
736 mStackSupervisor.initPowerManagement();
737 final PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
738 mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
739 mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*");
740 mVoiceWakeLock.setReferenceCounted(false);
741 }
Wale Ogunwalef6733932018-06-27 05:14:34 -0700742 }
743
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700744 public void installSystemProviders() {
Wale Ogunwalef6733932018-06-27 05:14:34 -0700745 mFontScaleSettingObserver = new FontScaleSettingObserver();
746 }
747
Wale Ogunwale59507092018-10-29 09:00:30 -0700748 public void retrieveSettings(ContentResolver resolver) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700749 final boolean freeformWindowManagement =
750 mContext.getPackageManager().hasSystemFeature(FEATURE_FREEFORM_WINDOW_MANAGEMENT)
751 || Settings.Global.getInt(
752 resolver, DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
753
754 final boolean supportsMultiWindow = ActivityTaskManager.supportsMultiWindow(mContext);
755 final boolean supportsPictureInPicture = supportsMultiWindow &&
756 mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
757 final boolean supportsSplitScreenMultiWindow =
758 ActivityTaskManager.supportsSplitScreenMultiWindow(mContext);
759 final boolean supportsMultiDisplay = mContext.getPackageManager()
760 .hasSystemFeature(FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700761 final boolean forceRtl = Settings.Global.getInt(resolver, DEVELOPMENT_FORCE_RTL, 0) != 0;
762 final boolean forceResizable = Settings.Global.getInt(
763 resolver, DEVELOPMENT_FORCE_RESIZABLE_ACTIVITIES, 0) != 0;
Shivam Agrawal780b5bb2019-07-17 10:17:11 -0700764 final boolean sizeCompatFreeform = Settings.Global.getInt(
765 resolver, DEVELOPMENT_ENABLE_SIZECOMPAT_FREEFORM, 0) != 0;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700766
767 // Transfer any global setting for forcing RTL layout, into a System Property
Kiyoung Kim0fe161d2018-12-20 18:26:10 +0900768 DisplayProperties.debug_force_rtl(forceRtl);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700769
770 final Configuration configuration = new Configuration();
771 Settings.System.getConfiguration(resolver, configuration);
772 if (forceRtl) {
773 // This will take care of setting the correct layout direction flags
774 configuration.setLayoutDirection(configuration.locale);
775 }
776
777 synchronized (mGlobalLock) {
778 mForceResizableActivities = forceResizable;
Shivam Agrawal780b5bb2019-07-17 10:17:11 -0700779 mSizeCompatFreeform = sizeCompatFreeform;
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700780 final boolean multiWindowFormEnabled = freeformWindowManagement
781 || supportsSplitScreenMultiWindow
782 || supportsPictureInPicture
783 || supportsMultiDisplay;
784 if ((supportsMultiWindow || forceResizable) && multiWindowFormEnabled) {
785 mSupportsMultiWindow = true;
786 mSupportsFreeformWindowManagement = freeformWindowManagement;
787 mSupportsSplitScreenMultiWindow = supportsSplitScreenMultiWindow;
788 mSupportsPictureInPicture = supportsPictureInPicture;
789 mSupportsMultiDisplay = supportsMultiDisplay;
790 } else {
791 mSupportsMultiWindow = false;
792 mSupportsFreeformWindowManagement = false;
793 mSupportsSplitScreenMultiWindow = false;
794 mSupportsPictureInPicture = false;
795 mSupportsMultiDisplay = false;
796 }
Garfield Tanb5910b42019-03-14 14:50:59 -0700797 mWindowManager.mRoot.onSettingsRetrieved();
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700798 // This happens before any activities are started, so we can change global configuration
799 // in-place.
800 updateConfigurationLocked(configuration, null, true);
801 final Configuration globalConfig = getGlobalConfiguration();
802 if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Initial config: " + globalConfig);
803
804 // Load resources only after the current configuration has been set.
805 final Resources res = mContext.getResources();
806 mThumbnailWidth = res.getDimensionPixelSize(
807 com.android.internal.R.dimen.thumbnail_width);
808 mThumbnailHeight = res.getDimensionPixelSize(
809 com.android.internal.R.dimen.thumbnail_height);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700810 }
811 }
812
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -0800813 public WindowManagerGlobalLock getGlobalLock() {
814 return mGlobalLock;
815 }
816
Yunfan Chen585f2932019-01-29 16:04:45 +0900817 /** For test purpose only. */
818 @VisibleForTesting
819 public ActivityTaskManagerInternal getAtmInternal() {
820 return mInternal;
821 }
822
Riddle Hsud93a6c42018-11-29 21:50:06 +0800823 public void initialize(IntentFirewall intentFirewall, PendingIntentController intentController,
824 Looper looper) {
825 mH = new H(looper);
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700826 mUiHandler = new UiHandler();
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700827 mIntentFirewall = intentFirewall;
Wale Ogunwale53783742018-09-16 10:21:51 -0700828 final File systemDir = SystemServiceManager.ensureSystemDir();
Wale Ogunwaleda8b8272018-11-29 19:37:37 -0800829 mAppWarnings = createAppWarnings(mUiContext, mH, mUiHandler, systemDir);
Wale Ogunwale53783742018-09-16 10:21:51 -0700830 mCompatModePackages = new CompatModePackages(this, systemDir, mH);
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700831 mPendingIntentController = intentController;
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700832 mStackSupervisor = createStackSupervisor();
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700833
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700834 mTaskChangeNotificationController =
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700835 new TaskChangeNotificationController(mGlobalLock, mStackSupervisor, mH);
Wale Ogunwaled95c06b2018-05-08 10:35:38 -0700836 mLockTaskController = new LockTaskController(mContext, mStackSupervisor, mH);
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700837 mActivityStartController = new ActivityStartController(this);
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700838 setRecentTasks(new RecentTasks(this, mStackSupervisor));
Wale Ogunwalea6191b42018-05-09 07:41:32 -0700839 mVrController = new VrController(mGlobalLock);
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700840 mKeyguardController = mStackSupervisor.getKeyguardController();
841 }
842
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700843 public void onActivityManagerInternalAdded() {
844 synchronized (mGlobalLock) {
845 mAmInternal = LocalServices.getService(ActivityManagerInternal.class);
846 mUgmInternal = LocalServices.getService(UriGrantsManagerInternal.class);
847 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -0700848 }
849
Yunfan Chen75157d72018-07-27 14:47:21 +0900850 int increaseConfigurationSeqLocked() {
851 mConfigurationSeq = Math.max(++mConfigurationSeq, 1);
852 return mConfigurationSeq;
853 }
854
Wale Ogunwalec9e57de2018-05-08 14:28:07 -0700855 protected ActivityStackSupervisor createStackSupervisor() {
856 final ActivityStackSupervisor supervisor = new ActivityStackSupervisor(this, mH.getLooper());
857 supervisor.initialize();
858 return supervisor;
859 }
860
Wale Ogunwaleda8b8272018-11-29 19:37:37 -0800861 protected AppWarnings createAppWarnings(
862 Context uiContext, Handler handler, Handler uiHandler, File systemDir) {
863 return new AppWarnings(this, uiContext, handler, uiHandler, systemDir);
864 }
865
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700866 public void setWindowManager(WindowManagerService wm) {
867 synchronized (mGlobalLock) {
868 mWindowManager = wm;
Louis Chang149d5c82019-12-30 09:47:39 +0800869 mRootWindowContainer = wm.mRoot;
Louis Chang3ff72a82019-12-17 12:12:59 +0800870 mTempConfig.setToDefaults();
871 mTempConfig.setLocales(LocaleList.getDefault());
872 mConfigurationSeq = mTempConfig.seq = 1;
Louis Chang149d5c82019-12-30 09:47:39 +0800873 mRootWindowContainer.onConfigurationChanged(mTempConfig);
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700874 mLockTaskController.setWindowManager(wm);
875 mStackSupervisor.setWindowManager(wm);
Louis Chang149d5c82019-12-30 09:47:39 +0800876 mRootWindowContainer.setWindowManager(wm);
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700877 }
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700878 }
879
Wale Ogunwale387b34c2018-10-25 19:59:40 -0700880 public void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) {
881 synchronized (mGlobalLock) {
882 mUsageStatsInternal = usageStatsManager;
883 }
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700884 }
885
Wale Ogunwalef6733932018-06-27 05:14:34 -0700886 UserManagerService getUserManager() {
887 if (mUserManager == null) {
888 IBinder b = ServiceManager.getService(Context.USER_SERVICE);
889 mUserManager = (UserManagerService) IUserManager.Stub.asInterface(b);
890 }
891 return mUserManager;
892 }
893
Philip P. Moltmannee295092020-02-10 08:46:26 -0800894 AppOpsManager getAppOpsManager() {
895 if (mAppOpsManager == null) {
896 mAppOpsManager = mContext.getSystemService(AppOpsManager.class);
Wale Ogunwalef6733932018-06-27 05:14:34 -0700897 }
Philip P. Moltmannee295092020-02-10 08:46:26 -0800898 return mAppOpsManager;
Wale Ogunwalef6733932018-06-27 05:14:34 -0700899 }
900
901 boolean hasUserRestriction(String restriction, int userId) {
902 return getUserManager().hasUserRestriction(restriction, userId);
903 }
904
Michal Karpinski15486842019-04-25 17:33:42 +0100905 boolean hasSystemAlertWindowPermission(int callingUid, int callingPid, String callingPackage) {
Philip P. Moltmannee295092020-02-10 08:46:26 -0800906 final int mode = getAppOpsManager().noteOpNoThrow(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
907 callingUid, callingPackage, /* featureId */ null, "");
Michal Karpinski15486842019-04-25 17:33:42 +0100908 if (mode == AppOpsManager.MODE_DEFAULT) {
909 return checkPermission(Manifest.permission.SYSTEM_ALERT_WINDOW, callingPid, callingUid)
910 == PERMISSION_GRANTED;
911 }
912 return mode == AppOpsManager.MODE_ALLOWED;
913 }
914
Wale Ogunwale8a1860a2019-06-05 08:57:19 -0700915 @VisibleForTesting
916 protected void setRecentTasks(RecentTasks recentTasks) {
917 mRecentTasks = recentTasks;
918 mStackSupervisor.setRecentTasks(recentTasks);
Wale Ogunwale16e505a2018-05-07 15:00:49 -0700919 }
920
921 RecentTasks getRecentTasks() {
922 return mRecentTasks;
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700923 }
924
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700925 ClientLifecycleManager getLifecycleManager() {
926 return mLifecycleManager;
927 }
928
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -0700929 ActivityStartController getActivityStartController() {
930 return mActivityStartController;
931 }
932
Wale Ogunwaled0412b32018-05-08 09:25:50 -0700933 TaskChangeNotificationController getTaskChangeNotificationController() {
934 return mTaskChangeNotificationController;
935 }
936
Wale Ogunwaled95c06b2018-05-08 10:35:38 -0700937 LockTaskController getLockTaskController() {
938 return mLockTaskController;
939 }
940
Yunfan Chen75157d72018-07-27 14:47:21 +0900941 /**
942 * Return the global configuration used by the process corresponding to the input pid. This is
943 * usually the global configuration with some overrides specific to that process.
944 */
945 Configuration getGlobalConfigurationForCallingPid() {
946 final int pid = Binder.getCallingPid();
Yunfan Chenc2ff6cf2018-12-04 16:56:21 -0800947 return getGlobalConfigurationForPid(pid);
948 }
949
950 /**
951 * Return the global configuration used by the process corresponding to the given pid.
952 */
953 Configuration getGlobalConfigurationForPid(int pid) {
Yunfan Chen75157d72018-07-27 14:47:21 +0900954 if (pid == MY_PID || pid < 0) {
955 return getGlobalConfiguration();
956 }
957 synchronized (mGlobalLock) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +0100958 final WindowProcessController app = mProcessMap.getProcess(pid);
Yunfan Chen75157d72018-07-27 14:47:21 +0900959 return app != null ? app.getConfiguration() : getGlobalConfiguration();
960 }
961 }
962
963 /**
964 * Return the device configuration info used by the process corresponding to the input pid.
965 * The value is consistent with the global configuration for the process.
966 */
967 @Override
968 public ConfigurationInfo getDeviceConfigurationInfo() {
969 ConfigurationInfo config = new ConfigurationInfo();
970 synchronized (mGlobalLock) {
971 final Configuration globalConfig = getGlobalConfigurationForCallingPid();
972 config.reqTouchScreen = globalConfig.touchscreen;
973 config.reqKeyboardType = globalConfig.keyboard;
974 config.reqNavigation = globalConfig.navigation;
975 if (globalConfig.navigation == Configuration.NAVIGATION_DPAD
976 || globalConfig.navigation == Configuration.NAVIGATION_TRACKBALL) {
977 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV;
978 }
979 if (globalConfig.keyboard != Configuration.KEYBOARD_UNDEFINED
980 && globalConfig.keyboard != Configuration.KEYBOARD_NOKEYS) {
981 config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD;
982 }
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700983 config.reqGlEsVersion = GL_ES_VERSION;
Yunfan Chen75157d72018-07-27 14:47:21 +0900984 }
985 return config;
986 }
987
Wale Ogunwale6767eae2018-05-03 15:52:51 -0700988 private void start() {
Wale Ogunwale53783742018-09-16 10:21:51 -0700989 LocalServices.addService(ActivityTaskManagerInternal.class, mInternal);
Wale Ogunwale6767eae2018-05-03 15:52:51 -0700990 }
991
Wale Ogunwale65ebd952018-04-25 15:41:44 -0700992 public static final class Lifecycle extends SystemService {
993 private final ActivityTaskManagerService mService;
994
995 public Lifecycle(Context context) {
996 super(context);
997 mService = new ActivityTaskManagerService(context);
998 }
999
1000 @Override
1001 public void onStart() {
1002 publishBinderService(Context.ACTIVITY_TASK_SERVICE, mService);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07001003 mService.start();
Wale Ogunwale65ebd952018-04-25 15:41:44 -07001004 }
1005
Garfield Tan891146c2018-10-09 12:14:00 -07001006 @Override
1007 public void onUnlockUser(int userId) {
1008 synchronized (mService.getGlobalLock()) {
Garfield Tan0d407f42019-03-07 11:47:01 -08001009 mService.mStackSupervisor.onUserUnlocked(userId);
Garfield Tan891146c2018-10-09 12:14:00 -07001010 }
1011 }
1012
1013 @Override
1014 public void onCleanupUser(int userId) {
1015 synchronized (mService.getGlobalLock()) {
1016 mService.mStackSupervisor.mLaunchParamsPersister.onCleanupUser(userId);
1017 }
1018 }
1019
Wale Ogunwale65ebd952018-04-25 15:41:44 -07001020 public ActivityTaskManagerService getService() {
1021 return mService;
1022 }
1023 }
1024
1025 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001026 public final int startActivity(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001027 String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
1028 String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
1029 Bundle bOptions) {
1030 return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
1031 resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001032 UserHandle.getCallingUserId());
1033 }
1034
1035 @Override
1036 public final int startActivities(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001037 String callingFeatureId, Intent[] intents, String[] resolvedTypes, IBinder resultTo,
1038 Bundle bOptions, int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001039 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001040 final String reason = "startActivities";
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001041 enforceNotIsolatedCaller(reason);
1042 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId, reason);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001043 // TODO: Switch to user app stacks here.
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00001044 return getActivityStartController().startActivities(caller, -1, 0, -1, callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001045 callingFeatureId, intents, resolvedTypes, resultTo,
1046 SafeActivityOptions.fromBundle(bOptions), userId, reason,
1047 null /* originatingPendingIntent */, false /* allowBackgroundActivityStart */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001048 }
1049
1050 @Override
1051 public int startActivityAsUser(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001052 String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
1053 String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
1054 Bundle bOptions, int userId) {
1055 return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,
1056 resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001057 true /*validateIncomingUser*/);
1058 }
1059
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001060 private int startActivityAsUser(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001061 @Nullable String callingFeatureId, Intent intent, String resolvedType,
1062 IBinder resultTo, String resultWho, int requestCode, int startFlags,
1063 ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001064 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001065 enforceNotIsolatedCaller("startActivityAsUser");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001066
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001067 userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001068 Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");
1069
1070 // TODO: Switch to user app stacks here.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001071 return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001072 .setCaller(caller)
1073 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001074 .setCallingFeatureId(callingFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001075 .setResolvedType(resolvedType)
1076 .setResultTo(resultTo)
1077 .setResultWho(resultWho)
1078 .setRequestCode(requestCode)
1079 .setStartFlags(startFlags)
1080 .setProfilerInfo(profilerInfo)
1081 .setActivityOptions(bOptions)
Louis Chang54fbb052019-10-16 17:10:17 +08001082 .setUserId(userId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001083 .execute();
1084
1085 }
1086
1087 @Override
1088 public int startActivityIntentSender(IApplicationThread caller, IIntentSender target,
1089 IBinder whitelistToken, Intent fillInIntent, String resolvedType, IBinder resultTo,
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001090 String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle bOptions) {
1091 enforceNotIsolatedCaller("startActivityIntentSender");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001092 // Refuse possible leaked file descriptors
1093 if (fillInIntent != null && fillInIntent.hasFileDescriptors()) {
1094 throw new IllegalArgumentException("File descriptors passed in Intent");
1095 }
1096
1097 if (!(target instanceof PendingIntentRecord)) {
1098 throw new IllegalArgumentException("Bad PendingIntent object");
1099 }
1100
1101 PendingIntentRecord pir = (PendingIntentRecord)target;
1102
1103 synchronized (mGlobalLock) {
1104 // If this is coming from the currently resumed activity, it is
1105 // effectively saying that app switches are allowed at this point.
Andrii Kulian5f750bc2018-07-17 08:57:23 -07001106 final ActivityStack stack = getTopDisplayFocusedStack();
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08001107 if (stack != null && stack.mResumedActivity != null
1108 && stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001109 mAppSwitchesAllowedTime = 0;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001110 }
1111 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001112 return pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001113 resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001114 }
1115
1116 @Override
1117 public boolean startNextMatchingActivity(IBinder callingActivity, Intent intent,
1118 Bundle bOptions) {
1119 // Refuse possible leaked file descriptors
1120 if (intent != null && intent.hasFileDescriptors()) {
1121 throw new IllegalArgumentException("File descriptors passed in Intent");
1122 }
1123 SafeActivityOptions options = SafeActivityOptions.fromBundle(bOptions);
1124
1125 synchronized (mGlobalLock) {
1126 final ActivityRecord r = ActivityRecord.isInStackLocked(callingActivity);
1127 if (r == null) {
1128 SafeActivityOptions.abort(options);
1129 return false;
1130 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001131 if (!r.attachedToProcess()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001132 // The caller is not running... d'oh!
1133 SafeActivityOptions.abort(options);
1134 return false;
1135 }
1136 intent = new Intent(intent);
1137 // The caller is not allowed to change the data.
1138 intent.setDataAndType(r.intent.getData(), r.intent.getType());
1139 // And we are resetting to find the next component...
1140 intent.setComponent(null);
1141
1142 final boolean debug = ((intent.getFlags() & Intent.FLAG_DEBUG_LOG_RESOLUTION) != 0);
1143
1144 ActivityInfo aInfo = null;
1145 try {
1146 List<ResolveInfo> resolves =
1147 AppGlobals.getPackageManager().queryIntentActivities(
1148 intent, r.resolvedType,
1149 PackageManager.MATCH_DEFAULT_ONLY | STOCK_PM_FLAGS,
1150 UserHandle.getCallingUserId()).getList();
1151
1152 // Look for the original activity in the list...
1153 final int N = resolves != null ? resolves.size() : 0;
1154 for (int i=0; i<N; i++) {
1155 ResolveInfo rInfo = resolves.get(i);
1156 if (rInfo.activityInfo.packageName.equals(r.packageName)
1157 && rInfo.activityInfo.name.equals(r.info.name)) {
1158 // We found the current one... the next matching is
1159 // after it.
1160 i++;
1161 if (i<N) {
1162 aInfo = resolves.get(i).activityInfo;
1163 }
1164 if (debug) {
1165 Slog.v(TAG, "Next matching activity: found current " + r.packageName
1166 + "/" + r.info.name);
1167 Slog.v(TAG, "Next matching activity: next is " + ((aInfo == null)
1168 ? "null" : aInfo.packageName + "/" + aInfo.name));
1169 }
1170 break;
1171 }
1172 }
1173 } catch (RemoteException e) {
1174 }
1175
1176 if (aInfo == null) {
1177 // Nobody who is next!
1178 SafeActivityOptions.abort(options);
1179 if (debug) Slog.d(TAG, "Next matching activity: nothing found");
1180 return false;
1181 }
1182
1183 intent.setComponent(new ComponentName(
1184 aInfo.applicationInfo.packageName, aInfo.name));
1185 intent.setFlags(intent.getFlags()&~(
1186 Intent.FLAG_ACTIVITY_FORWARD_RESULT|
1187 Intent.FLAG_ACTIVITY_CLEAR_TOP|
1188 Intent.FLAG_ACTIVITY_MULTIPLE_TASK|
1189 FLAG_ACTIVITY_NEW_TASK));
1190
1191 // Okay now we need to start the new activity, replacing the currently running activity.
1192 // This is a little tricky because we want to start the new one as if the current one is
1193 // finished, but not finish the current one first so that there is no flicker.
1194 // And thus...
1195 final boolean wasFinishing = r.finishing;
1196 r.finishing = true;
1197
1198 // Propagate reply information over to the new activity.
1199 final ActivityRecord resultTo = r.resultTo;
1200 final String resultWho = r.resultWho;
1201 final int requestCode = r.requestCode;
1202 r.resultTo = null;
1203 if (resultTo != null) {
1204 resultTo.removeResultsLocked(r, resultWho, requestCode);
1205 }
1206
1207 final long origId = Binder.clearCallingIdentity();
1208 // TODO(b/64750076): Check if calling pid should really be -1.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001209 final int res = getActivityStartController()
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001210 .obtainStarter(intent, "startNextMatchingActivity")
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001211 .setCaller(r.app.getThread())
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001212 .setResolvedType(r.resolvedType)
1213 .setActivityInfo(aInfo)
1214 .setResultTo(resultTo != null ? resultTo.appToken : null)
1215 .setResultWho(resultWho)
1216 .setRequestCode(requestCode)
1217 .setCallingPid(-1)
1218 .setCallingUid(r.launchedFromUid)
1219 .setCallingPackage(r.launchedFromPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001220 .setCallingFeatureId(r.launchedFromFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001221 .setRealCallingPid(-1)
1222 .setRealCallingUid(r.launchedFromUid)
1223 .setActivityOptions(options)
1224 .execute();
1225 Binder.restoreCallingIdentity(origId);
1226
1227 r.finishing = wasFinishing;
1228 if (res != ActivityManager.START_SUCCESS) {
1229 return false;
1230 }
1231 return true;
1232 }
1233 }
1234
1235 @Override
Galia Peycheva6861e912019-08-21 10:20:23 +02001236 public boolean startDreamActivity(Intent intent) {
Galia Peycheva52e89222020-02-18 23:41:43 +01001237 final WindowProcessController process = mProcessMap.getProcess(Binder.getCallingPid());
1238 final long origId = Binder.clearCallingIdentity();
1239
1240 // The dream activity is only called for non-doze dreams.
1241 final ComponentName currentDream = LocalServices.getService(DreamManagerInternal.class)
1242 .getActiveDreamComponent(/* doze= */ false);
1243
1244 if (currentDream == null || currentDream.getPackageName() == null
1245 || !currentDream.getPackageName().equals(process.mInfo.packageName)) {
1246 Slog.e(TAG, "Calling package is not the current dream package. "
1247 + "Aborting startDreamActivity...");
1248 return false;
1249 }
1250
Galia Peycheva6861e912019-08-21 10:20:23 +02001251 final ActivityInfo a = new ActivityInfo();
1252 a.theme = com.android.internal.R.style.Theme_Dream;
1253 a.exported = true;
1254 a.name = DreamActivity.class.getName();
1255
Galia Peycheva6861e912019-08-21 10:20:23 +02001256
1257 a.packageName = process.mInfo.packageName;
1258 a.applicationInfo = process.mInfo;
1259 a.processName = process.mInfo.processName;
1260 a.uiOptions = process.mInfo.uiOptions;
1261 a.taskAffinity = "android:" + a.packageName + "/dream";
1262 a.enabled = true;
1263 a.launchMode = ActivityInfo.LAUNCH_SINGLE_INSTANCE;
1264
1265 a.persistableMode = ActivityInfo.PERSIST_NEVER;
1266 a.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
1267 a.colorMode = ActivityInfo.COLOR_MODE_DEFAULT;
1268 a.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS;
1269
Galia Peycheva6861e912019-08-21 10:20:23 +02001270 try {
1271 getActivityStartController().obtainStarter(intent, "dream")
1272 .setActivityInfo(a)
1273 .setIsDream(true)
1274 .execute();
1275 return true;
1276 } finally {
1277 Binder.restoreCallingIdentity(origId);
1278 }
1279 }
1280
1281 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001282 public final WaitResult startActivityAndWait(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001283 String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
1284 String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,
1285 Bundle bOptions, int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001286 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001287 final WaitResult res = new WaitResult();
Riddle Hsufd66d4d2019-11-14 10:35:55 +08001288 enforceNotIsolatedCaller("startActivityAndWait");
1289 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
1290 userId, "startActivityAndWait");
1291 // TODO: Switch to user app stacks here.
1292 getActivityStartController().obtainStarter(intent, "startActivityAndWait")
1293 .setCaller(caller)
1294 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001295 .setCallingFeatureId(callingFeatureId)
Riddle Hsufd66d4d2019-11-14 10:35:55 +08001296 .setResolvedType(resolvedType)
1297 .setResultTo(resultTo)
1298 .setResultWho(resultWho)
1299 .setRequestCode(requestCode)
1300 .setStartFlags(startFlags)
1301 .setActivityOptions(bOptions)
1302 .setUserId(userId)
1303 .setProfilerInfo(profilerInfo)
1304 .setWaitResult(res)
1305 .execute();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001306 return res;
1307 }
1308
1309 @Override
1310 public final int startActivityWithConfig(IApplicationThread caller, String callingPackage,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001311 String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,
1312 String resultWho, int requestCode, int startFlags, Configuration config,
1313 Bundle bOptions, int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001314 assertPackageMatchesCallingUid(callingPackage);
Riddle Hsufd66d4d2019-11-14 10:35:55 +08001315 enforceNotIsolatedCaller("startActivityWithConfig");
1316 userId = handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(), userId,
1317 "startActivityWithConfig");
1318 // TODO: Switch to user app stacks here.
1319 return getActivityStartController().obtainStarter(intent, "startActivityWithConfig")
1320 .setCaller(caller)
1321 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001322 .setCallingFeatureId(callingFeatureId)
Riddle Hsufd66d4d2019-11-14 10:35:55 +08001323 .setResolvedType(resolvedType)
1324 .setResultTo(resultTo)
1325 .setResultWho(resultWho)
1326 .setRequestCode(requestCode)
1327 .setStartFlags(startFlags)
1328 .setGlobalConfiguration(config)
1329 .setActivityOptions(bOptions)
1330 .setUserId(userId)
1331 .execute();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001332 }
1333
Robert Carr8a2f9132019-11-11 15:03:15 -08001334 @Override
Alison Cichowlas3e340502018-08-07 17:15:01 -04001335 public IBinder requestStartActivityPermissionToken(IBinder delegatorToken) {
1336 int callingUid = Binder.getCallingUid();
1337 if (UserHandle.getAppId(callingUid) != SYSTEM_UID) {
1338 throw new SecurityException("Only the system process can request a permission token, "
1339 + "received request from uid: " + callingUid);
1340 }
1341 IBinder permissionToken = new Binder();
1342 synchronized (mGlobalLock) {
1343 mStartActivitySources.put(permissionToken, delegatorToken);
1344 }
1345
1346 Message expireMsg = PooledLambda.obtainMessage(
1347 ActivityTaskManagerService::expireStartAsCallerTokenMsg, this, permissionToken);
1348 mUiHandler.sendMessageDelayed(expireMsg, START_AS_CALLER_TOKEN_TIMEOUT_IMPL);
1349
1350 Message forgetMsg = PooledLambda.obtainMessage(
1351 ActivityTaskManagerService::forgetStartAsCallerTokenMsg, this, permissionToken);
1352 mUiHandler.sendMessageDelayed(forgetMsg, START_AS_CALLER_TOKEN_EXPIRED_TIMEOUT);
1353
1354 return permissionToken;
1355 }
1356
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001357 @Override
1358 public final int startActivityAsCaller(IApplicationThread caller, String callingPackage,
1359 Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
Alison Cichowlas3e340502018-08-07 17:15:01 -04001360 int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, IBinder permissionToken,
1361 boolean ignoreTargetSecurity, int userId) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001362 // This is very dangerous -- it allows you to perform a start activity (including
Alison Cichowlas3e340502018-08-07 17:15:01 -04001363 // permission grants) as any app that may launch one of your own activities. So we only
1364 // allow this in two cases:
1365 // 1) The caller is an activity that is part of the core framework, and then only when it
1366 // is running as the system.
1367 // 2) The caller provides a valid permissionToken. Permission tokens are one-time use and
1368 // can only be requested by a system activity, which may then delegate this call to
1369 // another app.
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001370 final ActivityRecord sourceRecord;
1371 final int targetUid;
1372 final String targetPackage;
Philip P. Moltmannee295092020-02-10 08:46:26 -08001373 final String targetFeatureId;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001374 final boolean isResolver;
1375 synchronized (mGlobalLock) {
1376 if (resultTo == null) {
1377 throw new SecurityException("Must be called from an activity");
1378 }
Alison Cichowlas3e340502018-08-07 17:15:01 -04001379 final IBinder sourceToken;
1380 if (permissionToken != null) {
1381 // To even attempt to use a permissionToken, an app must also have this signature
1382 // permission.
1383 mAmInternal.enforceCallingPermission(
1384 android.Manifest.permission.START_ACTIVITY_AS_CALLER,
1385 "startActivityAsCaller");
1386 // If called with a permissionToken, we want the sourceRecord from the delegator
1387 // activity that requested this token.
1388 sourceToken = mStartActivitySources.remove(permissionToken);
1389 if (sourceToken == null) {
1390 // Invalid permissionToken, check if it recently expired.
1391 if (mExpiredStartAsCallerTokens.contains(permissionToken)) {
1392 throw new SecurityException("Called with expired permission token: "
1393 + permissionToken);
1394 } else {
1395 throw new SecurityException("Called with invalid permission token: "
1396 + permissionToken);
1397 }
1398 }
1399 } else {
1400 // This method was called directly by the source.
1401 sourceToken = resultTo;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001402 }
Alison Cichowlas3e340502018-08-07 17:15:01 -04001403
Louis Chang149d5c82019-12-30 09:47:39 +08001404 sourceRecord = mRootWindowContainer.isInAnyStack(sourceToken);
Alison Cichowlas3e340502018-08-07 17:15:01 -04001405 if (sourceRecord == null) {
1406 throw new SecurityException("Called with bad activity token: " + sourceToken);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001407 }
1408 if (sourceRecord.app == null) {
1409 throw new SecurityException("Called without a process attached to activity");
1410 }
Alison Cichowlas3e340502018-08-07 17:15:01 -04001411
1412 // Whether called directly or from a delegate, the source activity must be from the
1413 // android package.
1414 if (!sourceRecord.info.packageName.equals("android")) {
1415 throw new SecurityException("Must be called from an activity that is "
1416 + "declared in the android package");
1417 }
1418
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001419 if (UserHandle.getAppId(sourceRecord.app.mUid) != SYSTEM_UID) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001420 // This is still okay, as long as this activity is running under the
1421 // uid of the original calling activity.
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001422 if (sourceRecord.app.mUid != sourceRecord.launchedFromUid) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001423 throw new SecurityException(
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001424 "Calling activity in uid " + sourceRecord.app.mUid
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001425 + " must be system uid or original calling uid "
1426 + sourceRecord.launchedFromUid);
1427 }
1428 }
1429 if (ignoreTargetSecurity) {
1430 if (intent.getComponent() == null) {
1431 throw new SecurityException(
1432 "Component must be specified with ignoreTargetSecurity");
1433 }
1434 if (intent.getSelector() != null) {
1435 throw new SecurityException(
1436 "Selector not allowed with ignoreTargetSecurity");
1437 }
1438 }
1439 targetUid = sourceRecord.launchedFromUid;
1440 targetPackage = sourceRecord.launchedFromPackage;
Philip P. Moltmannee295092020-02-10 08:46:26 -08001441 targetFeatureId = sourceRecord.launchedFromFeatureId;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001442 isResolver = sourceRecord.isResolverOrChildActivity();
1443 }
1444
1445 if (userId == UserHandle.USER_NULL) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001446 userId = UserHandle.getUserId(sourceRecord.app.mUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001447 }
1448
1449 // TODO: Switch to user app stacks here.
1450 try {
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001451 return getActivityStartController().obtainStarter(intent, "startActivityAsCaller")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001452 .setCallingUid(targetUid)
1453 .setCallingPackage(targetPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001454 .setCallingFeatureId(targetFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001455 .setResolvedType(resolvedType)
1456 .setResultTo(resultTo)
1457 .setResultWho(resultWho)
1458 .setRequestCode(requestCode)
1459 .setStartFlags(startFlags)
1460 .setActivityOptions(bOptions)
Louis Chang54fbb052019-10-16 17:10:17 +08001461 .setUserId(userId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001462 .setIgnoreTargetSecurity(ignoreTargetSecurity)
1463 .setFilterCallingUid(isResolver ? 0 /* system */ : targetUid)
Alan Stokes2f4a4ed2019-05-08 16:56:45 +01001464 // The target may well be in the background, which would normally prevent it
1465 // from starting an activity. Here we definitely want the start to succeed.
1466 .setAllowBackgroundActivityStart(true)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001467 .execute();
1468 } catch (SecurityException e) {
1469 // XXX need to figure out how to propagate to original app.
1470 // A SecurityException here is generally actually a fault of the original
1471 // calling activity (such as a fairly granting permissions), so propagate it
1472 // back to them.
1473 /*
1474 StringBuilder msg = new StringBuilder();
1475 msg.append("While launching");
1476 msg.append(intent.toString());
1477 msg.append(": ");
1478 msg.append(e.getMessage());
1479 */
1480 throw e;
1481 }
1482 }
1483
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001484 int handleIncomingUser(int callingPid, int callingUid, int userId, String name) {
1485 return mAmInternal.handleIncomingUser(callingPid, callingUid, userId, false /* allowAll */,
Jonathan Scott92335342019-12-17 14:46:26 +00001486 ALLOW_NON_FULL, name, null /* callerPackage */);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001487 }
1488
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001489 @Override
Philip P. Moltmannee295092020-02-10 08:46:26 -08001490 public int startVoiceActivity(String callingPackage, String callingFeatureId, int callingPid,
1491 int callingUid, Intent intent, String resolvedType, IVoiceInteractionSession session,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001492 IVoiceInteractor interactor, int startFlags, ProfilerInfo profilerInfo,
1493 Bundle bOptions, int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001494 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001495 mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startVoiceActivity()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001496 if (session == null || interactor == null) {
1497 throw new NullPointerException("null session or interactor");
1498 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001499 userId = handleIncomingUser(callingPid, callingUid, userId, "startVoiceActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001500 // TODO: Switch to user app stacks here.
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001501 return getActivityStartController().obtainStarter(intent, "startVoiceActivity")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001502 .setCallingUid(callingUid)
1503 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001504 .setCallingFeatureId(callingFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001505 .setResolvedType(resolvedType)
1506 .setVoiceSession(session)
1507 .setVoiceInteractor(interactor)
1508 .setStartFlags(startFlags)
1509 .setProfilerInfo(profilerInfo)
1510 .setActivityOptions(bOptions)
Louis Chang54fbb052019-10-16 17:10:17 +08001511 .setUserId(userId)
Michal Karpinski85fa2022019-02-08 12:05:09 +00001512 .setAllowBackgroundActivityStart(true)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001513 .execute();
1514 }
1515
1516 @Override
Philip P. Moltmannee295092020-02-10 08:46:26 -08001517 public int startAssistantActivity(String callingPackage, @NonNull String callingFeatureId,
1518 int callingPid, int callingUid, Intent intent, String resolvedType, Bundle bOptions,
1519 int userId) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07001520 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001521 mAmInternal.enforceCallingPermission(BIND_VOICE_INTERACTION, "startAssistantActivity()");
1522 userId = handleIncomingUser(callingPid, callingUid, userId, "startAssistantActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001523
Wale Ogunwale5fa8a8c2018-05-08 13:43:21 -07001524 return getActivityStartController().obtainStarter(intent, "startAssistantActivity")
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001525 .setCallingUid(callingUid)
1526 .setCallingPackage(callingPackage)
Philip P. Moltmannee295092020-02-10 08:46:26 -08001527 .setCallingFeatureId(callingFeatureId)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001528 .setResolvedType(resolvedType)
1529 .setActivityOptions(bOptions)
Louis Chang54fbb052019-10-16 17:10:17 +08001530 .setUserId(userId)
Michal Karpinski85fa2022019-02-08 12:05:09 +00001531 .setAllowBackgroundActivityStart(true)
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001532 .execute();
1533 }
1534
Riddle Hsu609a8e22019-06-27 16:46:29 -06001535 /**
1536 * Start the recents activity to perform the recents animation.
1537 *
1538 * @param intent The intent to start the recents activity.
1539 * @param recentsAnimationRunner Pass {@code null} to only preload the activity.
1540 */
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001541 @Override
Riddle Hsu609a8e22019-06-27 16:46:29 -06001542 public void startRecentsActivity(Intent intent, @Deprecated IAssistDataReceiver unused,
1543 @Nullable IRecentsAnimationRunner recentsAnimationRunner) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001544 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "startRecentsActivity()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001545 final int callingPid = Binder.getCallingPid();
Jorim Jaggi589c5ba2019-07-30 16:50:13 +02001546 final int callingUid = Binder.getCallingUid();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001547 final long origId = Binder.clearCallingIdentity();
1548 try {
1549 synchronized (mGlobalLock) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07001550 final ComponentName recentsComponent = mRecentTasks.getRecentsComponent();
Philip P. Moltmannee295092020-02-10 08:46:26 -08001551 final String recentsFeatureId = mRecentTasks.getRecentsComponentFeatureId();
Wale Ogunwale16e505a2018-05-07 15:00:49 -07001552 final int recentsUid = mRecentTasks.getRecentsComponentUid();
Jorim Jaggi589c5ba2019-07-30 16:50:13 +02001553 final WindowProcessController caller = getProcessController(callingPid, callingUid);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001554
1555 // Start a new recents animation
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001556 final RecentsAnimation anim = new RecentsAnimation(this, mStackSupervisor,
Riddle Hsu609a8e22019-06-27 16:46:29 -06001557 getActivityStartController(), mWindowManager, intent, recentsComponent,
Philip P. Moltmannee295092020-02-10 08:46:26 -08001558 recentsFeatureId, recentsUid, caller);
Riddle Hsu609a8e22019-06-27 16:46:29 -06001559 if (recentsAnimationRunner == null) {
1560 anim.preloadRecentsActivity();
1561 } else {
1562 anim.startRecentsActivity(recentsAnimationRunner);
1563 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001564 }
1565 } finally {
1566 Binder.restoreCallingIdentity(origId);
1567 }
1568 }
1569
1570 @Override
1571 public final int startActivityFromRecents(int taskId, Bundle bOptions) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001572 enforceCallerIsRecentsOrHasPermission(START_TASKS_FROM_RECENTS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001573 "startActivityFromRecents()");
1574
1575 final int callingPid = Binder.getCallingPid();
1576 final int callingUid = Binder.getCallingUid();
1577 final SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(bOptions);
1578 final long origId = Binder.clearCallingIdentity();
1579 try {
1580 synchronized (mGlobalLock) {
1581 return mStackSupervisor.startActivityFromRecents(callingPid, callingUid, taskId,
1582 safeOptions);
1583 }
1584 } finally {
1585 Binder.restoreCallingIdentity(origId);
1586 }
1587 }
1588
1589 /**
Andrii Kulian2eb84b22018-12-13 18:18:54 -08001590 * Public API to check if the client is allowed to start an activity on specified display.
1591 *
1592 * If the target display is private or virtual, some restrictions will apply.
1593 *
1594 * @param displayId Target display id.
1595 * @param intent Intent used to launch the activity.
1596 * @param resolvedType The MIME type of the intent.
1597 * @param userId The id of the user for whom the call is made.
1598 * @return {@code true} if a call to start an activity on the target display should succeed and
1599 * no {@link SecurityException} will be thrown, {@code false} otherwise.
1600 */
1601 @Override
1602 public final boolean isActivityStartAllowedOnDisplay(int displayId, Intent intent,
1603 String resolvedType, int userId) {
1604 final int callingUid = Binder.getCallingUid();
1605 final int callingPid = Binder.getCallingPid();
1606 final long origId = Binder.clearCallingIdentity();
1607
1608 try {
1609 // Collect information about the target of the Intent.
1610 ActivityInfo aInfo = mStackSupervisor.resolveActivity(intent, resolvedType,
1611 0 /* startFlags */, null /* profilerInfo */, userId,
1612 ActivityStarter.computeResolveFilterUid(callingUid, callingUid,
1613 UserHandle.USER_NULL));
1614 aInfo = mAmInternal.getActivityInfoForUser(aInfo, userId);
1615
1616 synchronized (mGlobalLock) {
1617 return mStackSupervisor.canPlaceEntityOnDisplay(displayId, callingPid, callingUid,
1618 aInfo);
1619 }
1620 } finally {
1621 Binder.restoreCallingIdentity(origId);
1622 }
1623 }
1624
1625 /**
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001626 * This is the internal entry point for handling Activity.finish().
1627 *
1628 * @param token The Binder token referencing the Activity we want to finish.
1629 * @param resultCode Result code, if any, from this Activity.
1630 * @param resultData Result data (Intent), if any, from this Activity.
1631 * @param finishTask Whether to finish the task associated with this Activity.
1632 *
1633 * @return Returns true if the activity successfully finished, or false if it is still running.
1634 */
1635 @Override
1636 public final boolean finishActivity(IBinder token, int resultCode, Intent resultData,
1637 int finishTask) {
1638 // Refuse possible leaked file descriptors
1639 if (resultData != null && resultData.hasFileDescriptors()) {
1640 throw new IllegalArgumentException("File descriptors passed in Intent");
1641 }
1642
1643 synchronized (mGlobalLock) {
Andrii Kulian057a6512019-07-15 16:15:51 -07001644 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001645 if (r == null) {
1646 return true;
1647 }
1648 // Keep track of the root activity of the task before we finish it
Louis Changcdec0802019-11-11 11:45:07 +08001649 final Task tr = r.getTask();
Andrii Kulian057a6512019-07-15 16:15:51 -07001650 final ActivityRecord rootR = tr.getRootActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001651 if (rootR == null) {
1652 Slog.w(TAG, "Finishing task with all activities already finished");
1653 }
1654 // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps can
1655 // finish.
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07001656 if (getLockTaskController().activityBlockedFromFinish(r)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001657 return false;
1658 }
1659
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001660 // TODO: There is a dup. of this block of code in ActivityStack.navigateUpToLocked
1661 // We should consolidate.
1662 if (mController != null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001663 // Find the first activity that is not finishing.
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09001664 final ActivityRecord next =
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08001665 r.getRootTask().topRunningActivity(token, INVALID_TASK_ID);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001666 if (next != null) {
1667 // ask watcher if this is allowed
1668 boolean resumeOK = true;
1669 try {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001670 resumeOK = mController.activityResuming(next.packageName);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001671 } catch (RemoteException e) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001672 mController = null;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001673 Watchdog.getInstance().setActivityController(null);
1674 }
1675
1676 if (!resumeOK) {
1677 Slog.i(TAG, "Not finishing activity because controller resumed");
1678 return false;
1679 }
1680 }
1681 }
Michal Karpinskifc6872e2019-05-21 15:18:44 +01001682
1683 // note down that the process has finished an activity and is in background activity
1684 // starts grace period
1685 if (r.app != null) {
1686 r.app.setLastActivityFinishTimeIfNeeded(SystemClock.uptimeMillis());
1687 }
1688
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001689 final long origId = Binder.clearCallingIdentity();
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001690 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "finishActivity");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001691 try {
1692 boolean res;
1693 final boolean finishWithRootActivity =
1694 finishTask == Activity.FINISH_TASK_WITH_ROOT_ACTIVITY;
1695 if (finishTask == Activity.FINISH_TASK_WITH_ACTIVITY
1696 || (finishWithRootActivity && r == rootR)) {
1697 // If requested, remove the task that is associated to this activity only if it
1698 // was the root activity in the task. The result code and data is ignored
1699 // because we don't support returning them across task boundaries. Also, to
1700 // keep backwards compatibility we remove the task from recents when finishing
1701 // task with root activity.
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09001702 mStackSupervisor.removeTask(tr, false /*killProcess*/,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001703 finishWithRootActivity, "finish-activity");
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09001704 res = true;
Garfield Tan2746ab52018-07-25 12:33:01 -07001705 // Explicitly dismissing the activity so reset its relaunch flag.
Wale Ogunwale64258362018-10-16 15:13:37 -07001706 r.mRelaunchReason = RELAUNCH_REASON_NONE;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001707 } else {
Louis Chang7b03ad92019-08-21 12:32:33 +08001708 r.finishIfPossible(resultCode, resultData, "app-request", true /* oomAdj */);
Andrii Kulian40eda672019-07-30 15:05:57 -07001709 res = r.finishing;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001710 if (!res) {
1711 Slog.i(TAG, "Failed to finish by app-request");
1712 }
1713 }
1714 return res;
1715 } finally {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001716 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001717 Binder.restoreCallingIdentity(origId);
1718 }
1719 }
1720 }
1721
1722 @Override
1723 public boolean finishActivityAffinity(IBinder token) {
1724 synchronized (mGlobalLock) {
1725 final long origId = Binder.clearCallingIdentity();
1726 try {
1727 ActivityRecord r = ActivityRecord.isInStackLocked(token);
1728 if (r == null) {
1729 return false;
1730 }
1731
1732 // Do not allow task to finish if last task in lockTask mode. Launchable priv-apps
1733 // can finish.
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07001734 if (getLockTaskController().activityBlockedFromFinish(r)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001735 return false;
1736 }
Wale Ogunwalea38654f2019-11-17 20:37:15 -08001737
1738 final PooledFunction p = PooledLambda.obtainFunction(
1739 ActivityRecord::finishIfSameAffinity, r,
1740 PooledLambda.__(ActivityRecord.class));
1741 r.getTask().forAllActivities(
1742 p, r, true /*includeBoundary*/, true /*traverseTopToBottom*/);
1743 p.recycle();
1744
Andrii Kuliande93eff2019-07-12 12:21:27 -07001745 return true;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001746 } finally {
1747 Binder.restoreCallingIdentity(origId);
1748 }
1749 }
1750 }
1751
1752 @Override
1753 public final void activityIdle(IBinder token, Configuration config, boolean stopProfiling) {
1754 final long origId = Binder.clearCallingIdentity();
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001755 try {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001756 synchronized (mGlobalLock) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001757 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityIdle");
Riddle Hsufc8ab262019-12-31 15:31:24 +08001758 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
1759 if (r == null) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001760 return;
1761 }
Riddle Hsufc8ab262019-12-31 15:31:24 +08001762 mStackSupervisor.activityIdleInternal(r, false /* fromTimeout */,
1763 false /* processPausingActivities */, config);
1764 if (stopProfiling && r.hasProcess()) {
1765 r.app.clearProfilerIfNeeded();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001766 }
1767 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001768 } finally {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001769 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07001770 Binder.restoreCallingIdentity(origId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001771 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001772 }
1773
1774 @Override
1775 public final void activityResumed(IBinder token) {
1776 final long origId = Binder.clearCallingIdentity();
1777 synchronized (mGlobalLock) {
1778 ActivityRecord.activityResumedLocked(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001779 }
1780 Binder.restoreCallingIdentity(origId);
1781 }
1782
1783 @Override
Andrii Kulian86e70fc2019-02-12 11:04:10 +00001784 public final void activityTopResumedStateLost() {
1785 final long origId = Binder.clearCallingIdentity();
1786 synchronized (mGlobalLock) {
1787 mStackSupervisor.handleTopResumedStateReleased(false /* timeout */);
1788 }
1789 Binder.restoreCallingIdentity(origId);
1790 }
1791
1792 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001793 public final void activityPaused(IBinder token) {
1794 final long origId = Binder.clearCallingIdentity();
1795 synchronized (mGlobalLock) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001796 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityPaused");
Wale Ogunwale196db712019-12-27 15:35:39 +00001797 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
1798 if (r != null) {
1799 r.activityPaused(false);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001800 }
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001801 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001802 }
1803 Binder.restoreCallingIdentity(origId);
1804 }
1805
1806 @Override
1807 public final void activityStopped(IBinder token, Bundle icicle,
1808 PersistableBundle persistentState, CharSequence description) {
1809 if (DEBUG_ALL) Slog.v(TAG, "Activity stopped: token=" + token);
1810
1811 // Refuse possible leaked file descriptors
1812 if (icicle != null && icicle.hasFileDescriptors()) {
1813 throw new IllegalArgumentException("File descriptors passed in Bundle");
1814 }
1815
1816 final long origId = Binder.clearCallingIdentity();
1817
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001818 String restartingName = null;
1819 int restartingUid = 0;
1820 final ActivityRecord r;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001821 synchronized (mGlobalLock) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001822 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityStopped");
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001823 r = ActivityRecord.isInStackLocked(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001824 if (r != null) {
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001825 if (r.attachedToProcess()
1826 && r.isState(ActivityStack.ActivityState.RESTARTING_PROCESS)) {
1827 // The activity was requested to restart from
1828 // {@link #restartActivityProcessIfVisible}.
1829 restartingName = r.app.mName;
1830 restartingUid = r.app.mUid;
1831 }
Wale Ogunwale196db712019-12-27 15:35:39 +00001832 r.activityStopped(icicle, persistentState, description);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001833 }
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001834 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001835 }
1836
Riddle Hsu7b766fd2019-01-28 21:14:59 +08001837 if (restartingName != null) {
1838 // In order to let the foreground activity can be restarted with its saved state from
1839 // {@link android.app.Activity#onSaveInstanceState}, the kill operation is postponed
1840 // until the activity reports stopped with the state. And the activity record will be
1841 // kept because the record state is restarting, then the activity will be restarted
1842 // immediately if it is still the top one.
1843 mStackSupervisor.removeRestartTimeouts(r);
1844 mAmInternal.killProcess(restartingName, restartingUid, "restartActivityProcess");
1845 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001846 mAmInternal.trimApplications();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001847
1848 Binder.restoreCallingIdentity(origId);
1849 }
1850
1851 @Override
1852 public final void activityDestroyed(IBinder token) {
1853 if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "ACTIVITY DESTROYED: " + token);
1854 synchronized (mGlobalLock) {
Andrii Kulian79d67982019-08-19 11:56:16 -07001855 final long origId = Binder.clearCallingIdentity();
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001856 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "activityDestroyed");
Andrii Kulian79d67982019-08-19 11:56:16 -07001857 try {
1858 final ActivityRecord activity = ActivityRecord.forTokenLocked(token);
1859 if (activity != null) {
1860 activity.destroyed("activityDestroyed");
1861 }
1862 } finally {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08001863 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
Andrii Kulian79d67982019-08-19 11:56:16 -07001864 Binder.restoreCallingIdentity(origId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001865 }
1866 }
1867 }
1868
1869 @Override
1870 public final void activityRelaunched(IBinder token) {
1871 final long origId = Binder.clearCallingIdentity();
1872 synchronized (mGlobalLock) {
1873 mStackSupervisor.activityRelaunchedLocked(token);
1874 }
1875 Binder.restoreCallingIdentity(origId);
1876 }
1877
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001878 @Override
1879 public void setRequestedOrientation(IBinder token, int requestedOrientation) {
1880 synchronized (mGlobalLock) {
1881 ActivityRecord r = ActivityRecord.isInStackLocked(token);
1882 if (r == null) {
1883 return;
1884 }
1885 final long origId = Binder.clearCallingIdentity();
1886 try {
1887 r.setRequestedOrientation(requestedOrientation);
1888 } finally {
1889 Binder.restoreCallingIdentity(origId);
1890 }
1891 }
1892 }
1893
1894 @Override
1895 public int getRequestedOrientation(IBinder token) {
1896 synchronized (mGlobalLock) {
Wale Ogunwaleda8b8272018-11-29 19:37:37 -08001897 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1898 return (r != null)
1899 ? r.getRequestedOrientation() : ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001900 }
1901 }
1902
1903 @Override
1904 public void setImmersive(IBinder token, boolean immersive) {
1905 synchronized (mGlobalLock) {
1906 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1907 if (r == null) {
1908 throw new IllegalArgumentException();
1909 }
1910 r.immersive = immersive;
1911
1912 // update associated state if we're frontmost
Andrii Kulian52d255c2018-07-13 11:32:19 -07001913 if (r.isResumedActivityOnDisplay()) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001914 if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE, "Frontmost changed immersion: "+ r);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001915 applyUpdateLockStateLocked(r);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001916 }
1917 }
1918 }
1919
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001920 void applyUpdateLockStateLocked(ActivityRecord r) {
1921 // Modifications to the UpdateLock state are done on our handler, outside
1922 // the activity manager's locks. The new state is determined based on the
1923 // state *now* of the relevant activity record. The object is passed to
1924 // the handler solely for logging detail, not to be consulted/modified.
1925 final boolean nextState = r != null && r.immersive;
1926 mH.post(() -> {
1927 if (mUpdateLock.isHeld() != nextState) {
1928 if (DEBUG_IMMERSIVE) Slog.d(TAG_IMMERSIVE,
1929 "Applying new update lock state '" + nextState + "' for " + r);
1930 if (nextState) {
1931 mUpdateLock.acquire();
1932 } else {
1933 mUpdateLock.release();
1934 }
1935 }
1936 });
1937 }
1938
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001939 @Override
1940 public boolean isImmersive(IBinder token) {
1941 synchronized (mGlobalLock) {
1942 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
1943 if (r == null) {
1944 throw new IllegalArgumentException();
1945 }
1946 return r.immersive;
1947 }
1948 }
1949
1950 @Override
1951 public boolean isTopActivityImmersive() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001952 enforceNotIsolatedCaller("isTopActivityImmersive");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001953 synchronized (mGlobalLock) {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08001954 final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
1955 if (topFocusedStack == null) {
1956 return false;
1957 }
1958
1959 final ActivityRecord r = topFocusedStack.topRunningActivity();
1960 return r != null && r.immersive;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001961 }
1962 }
1963
1964 @Override
1965 public void overridePendingTransition(IBinder token, String packageName,
1966 int enterAnim, int exitAnim) {
1967 synchronized (mGlobalLock) {
1968 ActivityRecord self = ActivityRecord.isInStackLocked(token);
1969 if (self == null) {
1970 return;
1971 }
1972
1973 final long origId = Binder.clearCallingIdentity();
1974
1975 if (self.isState(
1976 ActivityStack.ActivityState.RESUMED, ActivityStack.ActivityState.PAUSING)) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08001977 self.getDisplay().mDisplayContent.mAppTransition.overridePendingAppTransition(
lumark588a3e82018-07-20 18:53:54 +08001978 packageName, enterAnim, exitAnim, null);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001979 }
1980
1981 Binder.restoreCallingIdentity(origId);
1982 }
1983 }
1984
1985 @Override
1986 public int getFrontActivityScreenCompatMode() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001987 enforceNotIsolatedCaller("getFrontActivityScreenCompatMode");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001988 synchronized (mGlobalLock) {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08001989 final ActivityStack stack = getTopDisplayFocusedStack();
1990 final ActivityRecord r = stack != null ? stack.topRunningActivity() : null;
Wale Ogunwalea6191b42018-05-09 07:41:32 -07001991 if (r == null) {
1992 return ActivityManager.COMPAT_MODE_UNKNOWN;
1993 }
Wale Ogunwale53783742018-09-16 10:21:51 -07001994 return mCompatModePackages.computeCompatModeLocked(r.info.applicationInfo);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07001995 }
1996 }
1997
1998 @Override
1999 public void setFrontActivityScreenCompatMode(int mode) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002000 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_SCREEN_COMPATIBILITY,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002001 "setFrontActivityScreenCompatMode");
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002002 ApplicationInfo ai;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002003 synchronized (mGlobalLock) {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08002004 final ActivityStack stack = getTopDisplayFocusedStack();
2005 final ActivityRecord r = stack != null ? stack.topRunningActivity() : null;
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002006 if (r == null) {
2007 Slog.w(TAG, "setFrontActivityScreenCompatMode failed: no top activity");
2008 return;
2009 }
2010 ai = r.info.applicationInfo;
Wale Ogunwale53783742018-09-16 10:21:51 -07002011 mCompatModePackages.setPackageScreenCompatModeLocked(ai, mode);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002012 }
2013 }
2014
2015 @Override
2016 public int getLaunchedFromUid(IBinder activityToken) {
2017 ActivityRecord srec;
2018 synchronized (mGlobalLock) {
2019 srec = ActivityRecord.forTokenLocked(activityToken);
2020 }
2021 if (srec == null) {
2022 return -1;
2023 }
2024 return srec.launchedFromUid;
2025 }
2026
2027 @Override
2028 public String getLaunchedFromPackage(IBinder activityToken) {
2029 ActivityRecord srec;
2030 synchronized (mGlobalLock) {
2031 srec = ActivityRecord.forTokenLocked(activityToken);
2032 }
2033 if (srec == null) {
2034 return null;
2035 }
2036 return srec.launchedFromPackage;
2037 }
2038
2039 @Override
2040 public boolean convertFromTranslucent(IBinder token) {
2041 final long origId = Binder.clearCallingIdentity();
2042 try {
2043 synchronized (mGlobalLock) {
2044 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
2045 if (r == null) {
2046 return false;
2047 }
Wale Ogunwale83b8a6b2019-06-27 20:15:15 -07002048 return r.setOccludesParent(true);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002049 }
2050 } finally {
2051 Binder.restoreCallingIdentity(origId);
2052 }
2053 }
2054
2055 @Override
2056 public boolean convertToTranslucent(IBinder token, Bundle options) {
2057 SafeActivityOptions safeOptions = SafeActivityOptions.fromBundle(options);
2058 final long origId = Binder.clearCallingIdentity();
2059 try {
2060 synchronized (mGlobalLock) {
2061 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
2062 if (r == null) {
2063 return false;
2064 }
Wale Ogunwalea38654f2019-11-17 20:37:15 -08002065 final ActivityRecord under = r.getTask().getActivityBelow(r);
2066 if (under != null) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002067 under.returningOptions = safeOptions != null ? safeOptions.getOptions(r) : null;
2068 }
Wale Ogunwale83b8a6b2019-06-27 20:15:15 -07002069 return r.setOccludesParent(false);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002070 }
2071 } finally {
2072 Binder.restoreCallingIdentity(origId);
2073 }
2074 }
2075
2076 @Override
2077 public void notifyActivityDrawn(IBinder token) {
2078 if (DEBUG_VISIBILITY) Slog.d(TAG_VISIBILITY, "notifyActivityDrawn: token=" + token);
2079 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002080 ActivityRecord r = mRootWindowContainer.isInAnyStack(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002081 if (r != null) {
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002082 r.getRootTask().notifyActivityDrawnLocked(r);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002083 }
2084 }
2085 }
2086
2087 @Override
2088 public void reportActivityFullyDrawn(IBinder token, boolean restoredFromBundle) {
2089 synchronized (mGlobalLock) {
2090 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2091 if (r == null) {
2092 return;
2093 }
2094 r.reportFullyDrawnLocked(restoredFromBundle);
2095 }
2096 }
2097
2098 @Override
Louis Chang677921f2019-12-06 16:44:24 +08002099 public int getDisplayId(IBinder activityToken) throws RemoteException {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002100 synchronized (mGlobalLock) {
2101 final ActivityStack stack = ActivityRecord.getStackLocked(activityToken);
Wale Ogunwale8f93b642019-12-26 12:10:52 -08002102 if (stack != null) {
2103 final int displayId = stack.getDisplayId();
2104 return displayId != INVALID_DISPLAY ? displayId : DEFAULT_DISPLAY;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002105 }
2106 return DEFAULT_DISPLAY;
2107 }
2108 }
2109
2110 @Override
2111 public ActivityManager.StackInfo getFocusedStackInfo() throws RemoteException {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002112 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "getStackInfo()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002113 long ident = Binder.clearCallingIdentity();
2114 try {
2115 synchronized (mGlobalLock) {
Andrii Kulian5f750bc2018-07-17 08:57:23 -07002116 ActivityStack focusedStack = getTopDisplayFocusedStack();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002117 if (focusedStack != null) {
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002118 return mRootWindowContainer.getStackInfo(focusedStack.mTaskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002119 }
2120 return null;
2121 }
2122 } finally {
2123 Binder.restoreCallingIdentity(ident);
2124 }
2125 }
2126
2127 @Override
2128 public void setFocusedStack(int stackId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002129 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedStack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002130 if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedStack: stackId=" + stackId);
2131 final long callingId = Binder.clearCallingIdentity();
2132 try {
2133 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002134 final ActivityStack stack = mRootWindowContainer.getStack(stackId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002135 if (stack == null) {
2136 Slog.w(TAG, "setFocusedStack: No stack with id=" + stackId);
2137 return;
2138 }
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09002139 final ActivityRecord r = stack.topRunningActivity();
Louis Chang19443452018-10-09 12:10:21 +08002140 if (r != null && r.moveFocusableActivityToTop("setFocusedStack")) {
Louis Chang149d5c82019-12-30 09:47:39 +08002141 mRootWindowContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002142 }
2143 }
2144 } finally {
2145 Binder.restoreCallingIdentity(callingId);
2146 }
2147 }
2148
2149 @Override
2150 public void setFocusedTask(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002151 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "setFocusedTask()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002152 if (DEBUG_FOCUS) Slog.d(TAG_FOCUS, "setFocusedTask: taskId=" + taskId);
2153 final long callingId = Binder.clearCallingIdentity();
2154 try {
2155 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002156 final Task task = mRootWindowContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002157 MATCH_TASK_IN_STACKS_ONLY);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002158 if (task == null) {
2159 return;
2160 }
2161 final ActivityRecord r = task.topRunningActivityLocked();
Louis Chang19443452018-10-09 12:10:21 +08002162 if (r != null && r.moveFocusableActivityToTop("setFocusedTask")) {
Louis Chang149d5c82019-12-30 09:47:39 +08002163 mRootWindowContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002164 }
2165 }
2166 } finally {
2167 Binder.restoreCallingIdentity(callingId);
2168 }
2169 }
2170
2171 @Override
Riddle Hsu7b766fd2019-01-28 21:14:59 +08002172 public void restartActivityProcessIfVisible(IBinder activityToken) {
2173 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "restartActivityProcess()");
2174 final long callingId = Binder.clearCallingIdentity();
2175 try {
2176 synchronized (mGlobalLock) {
2177 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
2178 if (r == null) {
2179 return;
2180 }
2181 r.restartProcessIfVisible();
2182 }
2183 } finally {
2184 Binder.restoreCallingIdentity(callingId);
2185 }
2186 }
2187
2188 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002189 public boolean removeTask(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002190 enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeTask()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002191 synchronized (mGlobalLock) {
2192 final long ident = Binder.clearCallingIdentity();
2193 try {
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09002194 return mStackSupervisor.removeTaskById(taskId, true, REMOVE_FROM_RECENTS,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002195 "remove-task");
2196 } finally {
2197 Binder.restoreCallingIdentity(ident);
2198 }
2199 }
2200 }
2201
2202 @Override
Winson Chunge6439102018-07-30 15:48:01 -07002203 public void removeAllVisibleRecentTasks() {
2204 enforceCallerIsRecentsOrHasPermission(REMOVE_TASKS, "removeAllVisibleRecentTasks()");
2205 synchronized (mGlobalLock) {
2206 final long ident = Binder.clearCallingIdentity();
2207 try {
Winson Chung42fa21f2019-04-02 16:23:46 -07002208 getRecentTasks().removeAllVisibleTasks(mAmInternal.getCurrentUserId());
Winson Chunge6439102018-07-30 15:48:01 -07002209 } finally {
2210 Binder.restoreCallingIdentity(ident);
2211 }
2212 }
2213 }
2214
2215 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002216 public boolean shouldUpRecreateTask(IBinder token, String destAffinity) {
2217 synchronized (mGlobalLock) {
2218 final ActivityRecord srec = ActivityRecord.forTokenLocked(token);
2219 if (srec != null) {
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002220 return srec.getRootTask().shouldUpRecreateTaskLocked(srec, destAffinity);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002221 }
2222 }
2223 return false;
2224 }
2225
2226 @Override
2227 public boolean navigateUpTo(IBinder token, Intent destIntent, int resultCode,
2228 Intent resultData) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002229
Jeff Sharkey344ce7c2019-05-29 14:52:59 -06002230 synchronized (mGlobalLock) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002231 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
2232 if (r != null) {
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002233 return r.getRootTask().navigateUpTo(
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002234 r, destIntent, resultCode, resultData);
Jeff Sharkey344ce7c2019-05-29 14:52:59 -06002235 }
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00002236 return false;
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002237 }
2238 }
2239
2240 /**
2241 * Attempts to move a task backwards in z-order (the order of activities within the task is
2242 * unchanged).
2243 *
2244 * There are several possible results of this call:
2245 * - if the task is locked, then we will show the lock toast
2246 * - if there is a task behind the provided task, then that task is made visible and resumed as
2247 * this task is moved to the back
2248 * - otherwise, if there are no other tasks in the stack:
2249 * - if this task is in the pinned stack, then we remove the stack completely, which will
2250 * have the effect of moving the task to the top or bottom of the fullscreen stack
2251 * (depending on whether it is visible)
2252 * - otherwise, we simply return home and hide this task
2253 *
2254 * @param token A reference to the activity we wish to move
2255 * @param nonRoot If false then this only works if the activity is the root
2256 * of a task; if true it will work for any activity in a task.
2257 * @return Returns true if the move completed, false if not.
2258 */
2259 @Override
2260 public boolean moveActivityTaskToBack(IBinder token, boolean nonRoot) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002261 enforceNotIsolatedCaller("moveActivityTaskToBack");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002262 synchronized (mGlobalLock) {
2263 final long origId = Binder.clearCallingIdentity();
2264 try {
2265 int taskId = ActivityRecord.getTaskForActivityLocked(token, !nonRoot);
Louis Chang149d5c82019-12-30 09:47:39 +08002266 final Task task = mRootWindowContainer.anyTaskForId(taskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002267 if (task != null) {
Wale Ogunwale85fb19a2019-12-05 10:41:05 +09002268 return ActivityRecord.getStackLocked(token).moveTaskToBack(task);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002269 }
2270 } finally {
2271 Binder.restoreCallingIdentity(origId);
2272 }
2273 }
2274 return false;
2275 }
2276
2277 @Override
2278 public Rect getTaskBounds(int taskId) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002279 mAmInternal.enforceCallingPermission(MANAGE_ACTIVITY_STACKS, "getTaskBounds()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002280 long ident = Binder.clearCallingIdentity();
2281 Rect rect = new Rect();
2282 try {
2283 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08002284 final Task task = mRootWindowContainer.anyTaskForId(taskId,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002285 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
2286 if (task == null) {
2287 Slog.w(TAG, "getTaskBounds: taskId=" + taskId + " not found");
2288 return rect;
2289 }
Wale Ogunwale2322bed2019-10-10 17:24:19 +02002290 if (task.getParent() != null) {
2291 rect.set(task.getBounds());
2292 } else if (task.mLastNonFullscreenBounds != null) {
2293 rect.set(task.mLastNonFullscreenBounds);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002294 }
2295 }
2296 } finally {
2297 Binder.restoreCallingIdentity(ident);
2298 }
2299 return rect;
2300 }
2301
2302 @Override
2303 public ActivityManager.TaskDescription getTaskDescription(int id) {
2304 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002305 enforceCallerIsRecentsOrHasPermission(
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002306 MANAGE_ACTIVITY_STACKS, "getTaskDescription()");
Louis Chang149d5c82019-12-30 09:47:39 +08002307 final Task tr = mRootWindowContainer.anyTaskForId(id,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002308 MATCH_TASK_IN_STACKS_OR_RECENT_TASKS);
2309 if (tr != null) {
Wale Ogunwale2322bed2019-10-10 17:24:19 +02002310 return tr.getTaskDescription();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002311 }
2312 }
2313 return null;
2314 }
2315
2316 @Override
Winson Chung7ccc6812020-01-23 16:15:10 -08002317 public boolean setTaskWindowingMode(int taskId, int windowingMode, boolean toTop) {
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002318 if (windowingMode == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
Evan Rosky73a7fe92019-11-18 18:28:01 -08002319 return setTaskWindowingModeSplitScreenPrimary(taskId, toTop);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002320 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002321 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "setTaskWindowingMode()");
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002322 synchronized (mGlobalLock) {
2323 final long ident = Binder.clearCallingIdentity();
2324 try {
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002325 if (WindowConfiguration.isSplitScreenWindowingMode(windowingMode)) {
2326 return setTaskWindowingModeSplitScreen(taskId, windowingMode, toTop);
2327 }
Louis Chang149d5c82019-12-30 09:47:39 +08002328 final Task task = mRootWindowContainer.anyTaskForId(taskId,
Riddle Hsu090ac6f2018-10-31 12:55:29 +08002329 MATCH_TASK_IN_STACKS_ONLY);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002330 if (task == null) {
2331 Slog.w(TAG, "setTaskWindowingMode: No task for id=" + taskId);
Winson Chung7ccc6812020-01-23 16:15:10 -08002332 return false;
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002333 }
2334
2335 if (DEBUG_STACK) Slog.d(TAG_STACK, "setTaskWindowingMode: moving task=" + taskId
2336 + " to windowingMode=" + windowingMode + " toTop=" + toTop);
2337
2338 if (!task.isActivityTypeStandardOrUndefined()) {
2339 throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
2340 + " non-standard task " + taskId + " to windowing mode="
2341 + windowingMode);
2342 }
2343
2344 final ActivityStack stack = task.getStack();
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002345 // Convert some windowing-mode changes into root-task reparents for split-screen.
2346 if (stack.getTile() != null) {
2347 stack.getDisplay().onSplitScreenModeDismissed();
2348 }
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002349 if (toTop) {
2350 stack.moveToFront("setTaskWindowingMode", task);
2351 }
2352 stack.setWindowingMode(windowingMode);
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002353 stack.getDisplay().ensureActivitiesVisible(null, 0, PRESERVE_WINDOWS,
2354 true /* notifyClients */);
Winson Chung7ccc6812020-01-23 16:15:10 -08002355 return true;
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002356 } finally {
2357 Binder.restoreCallingIdentity(ident);
2358 }
2359 }
2360 }
2361
2362 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002363 public String getCallingPackage(IBinder token) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002364 synchronized (mGlobalLock) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002365 ActivityRecord r = getCallingRecordLocked(token);
2366 return r != null ? r.info.packageName : null;
2367 }
2368 }
2369
2370 @Override
2371 public ComponentName getCallingActivity(IBinder token) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002372 synchronized (mGlobalLock) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002373 ActivityRecord r = getCallingRecordLocked(token);
2374 return r != null ? r.intent.getComponent() : null;
2375 }
2376 }
2377
2378 private ActivityRecord getCallingRecordLocked(IBinder token) {
2379 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2380 if (r == null) {
2381 return null;
2382 }
2383 return r.resultTo;
2384 }
2385
2386 @Override
2387 public void unhandledBack() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002388 mAmInternal.enforceCallingPermission(android.Manifest.permission.FORCE_BACK, "unhandledBack()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002389
2390 synchronized (mGlobalLock) {
2391 final long origId = Binder.clearCallingIdentity();
2392 try {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08002393 final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
2394 if (topFocusedStack != null) {
2395 topFocusedStack.unhandledBackLocked();
2396 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002397 } finally {
2398 Binder.restoreCallingIdentity(origId);
2399 }
2400 }
2401 }
2402
Mark Renouf446251d2019-04-26 10:22:41 -04002403 @Override
2404 public void onBackPressedOnTaskRoot(IBinder token, IRequestFinishCallback callback) {
2405 synchronized (mGlobalLock) {
2406 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2407 if (r == null) {
2408 return;
2409 }
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002410 ActivityStack stack = r.getRootTask();
Mark Renouf446251d2019-04-26 10:22:41 -04002411 if (stack != null && stack.isSingleTaskInstance()) {
2412 // Single-task stacks are used for activities which are presented in floating
2413 // windows above full screen activities. Instead of directly finishing the
2414 // task, a task change listener is used to notify SystemUI so the action can be
2415 // handled specially.
Louis Changcdec0802019-11-11 11:45:07 +08002416 final Task task = r.getTask();
Mark Renouf446251d2019-04-26 10:22:41 -04002417 mTaskChangeNotificationController
2418 .notifyBackPressedOnTaskRoot(task.getTaskInfo());
2419 } else {
2420 try {
2421 callback.requestFinish();
2422 } catch (RemoteException e) {
2423 Slog.e(TAG, "Failed to invoke request finish callback", e);
2424 }
2425 }
2426 }
2427 }
2428
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002429 /**
2430 * TODO: Add mController hook
2431 */
2432 @Override
Ricky Waiaca8a772019-04-04 16:01:06 +01002433 public void moveTaskToFront(IApplicationThread appThread, String callingPackage, int taskId,
2434 int flags, Bundle bOptions) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002435 mAmInternal.enforceCallingPermission(android.Manifest.permission.REORDER_TASKS, "moveTaskToFront()");
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002436
2437 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToFront: moving taskId=" + taskId);
2438 synchronized (mGlobalLock) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002439 moveTaskToFrontLocked(appThread, callingPackage, taskId, flags,
2440 SafeActivityOptions.fromBundle(bOptions), false /* fromRecents */);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002441 }
2442 }
2443
Ricky Waiaca8a772019-04-04 16:01:06 +01002444 void moveTaskToFrontLocked(@Nullable IApplicationThread appThread,
2445 @Nullable String callingPackage, int taskId, int flags, SafeActivityOptions options,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002446 boolean fromRecents) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002447 final int callingPid = Binder.getCallingPid();
2448 final int callingUid = Binder.getCallingUid();
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07002449 assertPackageMatchesCallingUid(callingPackage);
Ricky Waiaca8a772019-04-04 16:01:06 +01002450 if (!checkAppSwitchAllowedLocked(callingPid, callingUid, -1, -1, "Task to front")) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002451 SafeActivityOptions.abort(options);
2452 return;
2453 }
2454 final long origId = Binder.clearCallingIdentity();
Ricky Waiaca8a772019-04-04 16:01:06 +01002455 WindowProcessController callerApp = null;
2456 if (appThread != null) {
2457 callerApp = getProcessController(appThread);
2458 }
2459 final ActivityStarter starter = getActivityStartController().obtainStarter(
2460 null /* intent */, "moveTaskToFront");
2461 if (starter.shouldAbortBackgroundActivityStart(callingUid, callingPid, callingPackage, -1,
Galia Peycheva6861e912019-08-21 10:20:23 +02002462 -1, callerApp, null, false, false, null)) {
Alan Stokes9e245762019-05-21 14:54:28 +01002463 if (!isBackgroundActivityStartsEnabled()) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002464 return;
2465 }
2466 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002467 try {
Louis Chang149d5c82019-12-30 09:47:39 +08002468 final Task task = mRootWindowContainer.anyTaskForId(taskId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002469 if (task == null) {
2470 Slog.d(TAG, "Could not find task for id: "+ taskId);
Winson Chungd0243682018-09-25 18:11:54 -07002471 SafeActivityOptions.abort(options);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002472 return;
2473 }
Wale Ogunwaled95c06b2018-05-08 10:35:38 -07002474 if (getLockTaskController().isLockTaskModeViolation(task)) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002475 Slog.e(TAG, "moveTaskToFront: Attempt to violate Lock Task Mode");
Winson Chungd0243682018-09-25 18:11:54 -07002476 SafeActivityOptions.abort(options);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002477 return;
2478 }
2479 ActivityOptions realOptions = options != null
2480 ? options.getOptions(mStackSupervisor)
2481 : null;
2482 mStackSupervisor.findTaskToMoveToFront(task, flags, realOptions, "moveTaskToFront",
2483 false /* forceNonResizable */);
2484
Wale Ogunwale21e06482019-11-18 05:14:15 -08002485 final ActivityRecord topActivity = task.getTopNonFinishingActivity();
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002486 if (topActivity != null) {
2487
2488 // We are reshowing a task, use a starting window to hide the initial draw delay
2489 // so the transition can start earlier.
2490 topActivity.showStartingWindow(null /* prev */, false /* newTask */,
2491 true /* taskSwitch */, fromRecents);
2492 }
2493 } finally {
2494 Binder.restoreCallingIdentity(origId);
2495 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002496 }
2497
Ricky Waiaca8a772019-04-04 16:01:06 +01002498 /**
2499 * Return true if callingUid is system, or packageName belongs to that callingUid.
2500 */
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07002501 private boolean isSameApp(int callingUid, @Nullable String packageName) {
Ricky Waiaca8a772019-04-04 16:01:06 +01002502 try {
2503 if (callingUid != 0 && callingUid != SYSTEM_UID) {
2504 if (packageName == null) {
2505 return false;
2506 }
2507 final int uid = AppGlobals.getPackageManager().getPackageUid(packageName,
2508 PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
2509 UserHandle.getUserId(callingUid));
2510 return UserHandle.isSameApp(callingUid, uid);
2511 }
2512 } catch (RemoteException e) {
2513 // Should not happen
2514 }
2515 return true;
2516 }
2517
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07002518 /**
2519 * Checks that the provided package name matches the current calling UID, throws a security
2520 * exception if it doesn't.
2521 */
2522 void assertPackageMatchesCallingUid(@Nullable String packageName) {
2523 final int callingUid = Binder.getCallingUid();
2524 if (isSameApp(callingUid, packageName)) {
2525 return;
2526 }
2527 final String msg = "Permission Denial: package=" + packageName
2528 + " does not belong to uid=" + callingUid;
2529 Slog.w(TAG, msg);
2530 throw new SecurityException(msg);
2531 }
2532
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002533 boolean checkAppSwitchAllowedLocked(int sourcePid, int sourceUid,
2534 int callingPid, int callingUid, String name) {
2535 if (mAppSwitchesAllowedTime < SystemClock.uptimeMillis()) {
2536 return true;
2537 }
2538
2539 if (getRecentTasks().isCallerRecents(sourceUid)) {
2540 return true;
2541 }
2542
2543 int perm = checkComponentPermission(STOP_APP_SWITCHES, sourcePid, sourceUid, -1, true);
2544 if (perm == PackageManager.PERMISSION_GRANTED) {
2545 return true;
2546 }
2547 if (checkAllowAppSwitchUid(sourceUid)) {
2548 return true;
2549 }
2550
2551 // If the actual IPC caller is different from the logical source, then
2552 // also see if they are allowed to control app switches.
2553 if (callingUid != -1 && callingUid != sourceUid) {
2554 perm = checkComponentPermission(STOP_APP_SWITCHES, callingPid, callingUid, -1, true);
2555 if (perm == PackageManager.PERMISSION_GRANTED) {
2556 return true;
2557 }
2558 if (checkAllowAppSwitchUid(callingUid)) {
2559 return true;
2560 }
2561 }
2562
2563 Slog.w(TAG, name + " request from " + sourceUid + " stopped");
2564 return false;
2565 }
2566
2567 private boolean checkAllowAppSwitchUid(int uid) {
2568 ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(UserHandle.getUserId(uid));
2569 if (types != null) {
2570 for (int i = types.size() - 1; i >= 0; i--) {
2571 if (types.valueAt(i).intValue() == uid) {
2572 return true;
2573 }
2574 }
2575 }
2576 return false;
2577 }
2578
2579 @Override
2580 public void setActivityController(IActivityController controller, boolean imAMonkey) {
2581 mAmInternal.enforceCallingPermission(android.Manifest.permission.SET_ACTIVITY_WATCHER,
2582 "setActivityController()");
2583 synchronized (mGlobalLock) {
2584 mController = controller;
2585 mControllerIsAMonkey = imAMonkey;
2586 Watchdog.getInstance().setActivityController(controller);
2587 }
2588 }
2589
Wale Ogunwale387b34c2018-10-25 19:59:40 -07002590 public boolean isControllerAMonkey() {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002591 synchronized (mGlobalLock) {
2592 return mController != null && mControllerIsAMonkey;
2593 }
2594 }
2595
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002596 @Override
2597 public int getTaskForActivity(IBinder token, boolean onlyRoot) {
2598 synchronized (mGlobalLock) {
2599 return ActivityRecord.getTaskForActivityLocked(token, onlyRoot);
2600 }
2601 }
2602
2603 @Override
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002604 public List<ActivityManager.RunningTaskInfo> getTasks(int maxNum) {
2605 return getFilteredTasks(maxNum, ACTIVITY_TYPE_UNDEFINED, WINDOWING_MODE_UNDEFINED);
2606 }
2607
2608 @Override
2609 public List<ActivityManager.RunningTaskInfo> getFilteredTasks(int maxNum,
2610 @WindowConfiguration.ActivityType int ignoreActivityType,
2611 @WindowConfiguration.WindowingMode int ignoreWindowingMode) {
2612 final int callingUid = Binder.getCallingUid();
Nicholas Sauer0259e532019-08-30 08:24:55 -07002613 final int callingPid = Binder.getCallingPid();
2614 final boolean crossUser = isCrossUserAllowed(callingPid, callingUid);
Nicholas Sauer3f9249f2019-09-10 20:23:41 -07002615 final int[] profileIds = getUserManager().getProfileIds(
2616 UserHandle.getUserId(callingUid), true);
2617 ArraySet<Integer> callingProfileIds = new ArraySet<>();
2618 for (int i = 0; i < profileIds.length; i++) {
2619 callingProfileIds.add(profileIds[i]);
2620 }
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002621 ArrayList<ActivityManager.RunningTaskInfo> list = new ArrayList<>();
2622
2623 synchronized (mGlobalLock) {
2624 if (DEBUG_ALL) Slog.v(TAG, "getTasks: max=" + maxNum);
2625
Nicholas Sauer0259e532019-08-30 08:24:55 -07002626 final boolean allowed = isGetTasksAllowed("getTasks", callingPid, callingUid);
Louis Chang149d5c82019-12-30 09:47:39 +08002627 mRootWindowContainer.getRunningTasks(maxNum, list, ignoreActivityType,
Nicholas Sauer3f9249f2019-09-10 20:23:41 -07002628 ignoreWindowingMode, callingUid, allowed, crossUser, callingProfileIds);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002629 }
2630
2631 return list;
2632 }
2633
2634 @Override
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002635 public final void finishSubActivity(IBinder token, String resultWho, int requestCode) {
2636 synchronized (mGlobalLock) {
2637 final long origId = Binder.clearCallingIdentity();
Wale Ogunwalea38654f2019-11-17 20:37:15 -08002638 try {
2639 ActivityRecord r = ActivityRecord.isInStackLocked(token);
2640 if (r == null) return;
2641
2642 final PooledConsumer c = PooledLambda.obtainConsumer(
2643 ActivityRecord::finishIfSubActivity, PooledLambda.__(ActivityRecord.class),
2644 r, resultWho, requestCode);
2645 // TODO: This should probably only loop over the task since you need to be in the
2646 // same task to return results.
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08002647 r.getRootTask().forAllActivities(c);
Wale Ogunwalea38654f2019-11-17 20:37:15 -08002648 c.recycle();
2649
2650 updateOomAdj();
2651 } finally {
2652 Binder.restoreCallingIdentity(origId);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002653 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002654 }
2655 }
2656
2657 @Override
2658 public boolean willActivityBeVisible(IBinder token) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002659 synchronized (mGlobalLock) {
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002660 ActivityStack stack = ActivityRecord.getStackLocked(token);
2661 if (stack != null) {
Wale Ogunwalea38654f2019-11-17 20:37:15 -08002662 return stack.willActivityBeVisible(token);
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002663 }
2664 return false;
2665 }
2666 }
2667
2668 @Override
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002669 public void moveTaskToStack(int taskId, int stackId, boolean toTop) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002670 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS, "moveTaskToStack()");
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002671 synchronized (mGlobalLock) {
2672 final long ident = Binder.clearCallingIdentity();
2673 try {
Louis Chang149d5c82019-12-30 09:47:39 +08002674 final Task task = mRootWindowContainer.anyTaskForId(taskId);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002675 if (task == null) {
2676 Slog.w(TAG, "moveTaskToStack: No task for id=" + taskId);
2677 return;
2678 }
2679
2680 if (DEBUG_STACK) Slog.d(TAG_STACK, "moveTaskToStack: moving task=" + taskId
2681 + " to stackId=" + stackId + " toTop=" + toTop);
2682
Louis Chang149d5c82019-12-30 09:47:39 +08002683 final ActivityStack stack = mRootWindowContainer.getStack(stackId);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002684 if (stack == null) {
2685 throw new IllegalStateException(
2686 "moveTaskToStack: No stack for stackId=" + stackId);
2687 }
2688 if (!stack.isActivityTypeStandardOrUndefined()) {
2689 throw new IllegalArgumentException("moveTaskToStack: Attempt to move task "
2690 + taskId + " to stack " + stackId);
2691 }
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002692 task.reparent(stack, toTop, REPARENT_KEEP_STACK_AT_FRONT, ANIMATE, !DEFER_RESUME,
2693 "moveTaskToStack");
2694 } finally {
2695 Binder.restoreCallingIdentity(ident);
2696 }
2697 }
2698 }
2699
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002700 /**
2701 * Moves the specified task to the primary-split-screen stack.
2702 *
2703 * @param taskId Id of task to move.
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002704 * @param toTop If the task and stack should be moved to the top.
Winson Chung7ccc6812020-01-23 16:15:10 -08002705 * @return Whether the task was successfully put into splitscreen.
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002706 */
2707 @Override
Evan Rosky73a7fe92019-11-18 18:28:01 -08002708 public boolean setTaskWindowingModeSplitScreenPrimary(int taskId, boolean toTop) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002709 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002710 "setTaskWindowingModeSplitScreenPrimary()");
2711 synchronized (mGlobalLock) {
2712 final long ident = Binder.clearCallingIdentity();
2713 try {
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002714 return setTaskWindowingModeSplitScreen(taskId, WINDOWING_MODE_SPLIT_SCREEN_PRIMARY,
2715 toTop);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002716 } finally {
2717 Binder.restoreCallingIdentity(ident);
2718 }
2719 }
2720 }
2721
2722 /**
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002723 * Moves the specified task into a split-screen tile.
2724 */
2725 private boolean setTaskWindowingModeSplitScreen(int taskId, int windowingMode, boolean toTop) {
2726 if (!WindowConfiguration.isSplitScreenWindowingMode(windowingMode)) {
2727 throw new IllegalArgumentException("Calling setTaskWindowingModeSplitScreen with non"
2728 + "split-screen mode: " + windowingMode);
2729 }
2730 if (isInLockTaskMode()) {
2731 Slog.w(TAG, "setTaskWindowingModeSplitScreen: Is in lock task mode="
2732 + getLockTaskModeState());
2733 return false;
2734 }
2735
2736 final Task task = mRootWindowContainer.anyTaskForId(taskId,
2737 MATCH_TASK_IN_STACKS_ONLY);
2738 if (task == null) {
2739 Slog.w(TAG, "setTaskWindowingModeSplitScreenPrimary: No task for id=" + taskId);
2740 return false;
2741 }
2742 if (!task.isActivityTypeStandardOrUndefined()) {
2743 throw new IllegalArgumentException("setTaskWindowingMode: Attempt to move"
2744 + " non-standard task " + taskId + " to split-screen windowing mode");
2745 }
Wale Ogunwale0d465192020-01-23 19:14:44 -08002746 if (!task.supportsSplitScreenWindowingMode()) {
2747 return false;
2748 }
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002749
2750 final int prevMode = task.getWindowingMode();
Wale Ogunwale0d465192020-01-23 19:14:44 -08002751 moveTaskToSplitScreenPrimaryTile(task, toTop);
2752 return prevMode != task.getWindowingMode();
2753 }
2754
2755 void moveTaskToSplitScreenPrimaryTile(Task task, boolean toTop) {
2756 ActivityStack stack = task.getStack();
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002757 TaskTile tile = null;
2758 for (int i = stack.getDisplay().getStackCount() - 1; i >= 0; --i) {
2759 tile = stack.getDisplay().getStackAt(i).asTile();
2760 if (tile != null && tile.getWindowingMode() == WINDOWING_MODE_SPLIT_SCREEN_PRIMARY) {
2761 break;
2762 }
2763 }
2764 if (tile == null) {
2765 throw new IllegalStateException("Can't enter split without associated tile");
2766 }
2767 WindowContainerTransaction wct = new WindowContainerTransaction();
2768 wct.reparent(stack.mRemoteToken, tile.mRemoteToken, toTop);
2769 mTaskOrganizerController.applyContainerTransaction(wct, null);
Evan Roskyaf9f27c2020-02-18 18:58:35 +00002770 }
2771
2772 /**
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002773 * Removes stacks in the input windowing modes from the system if they are of activity type
2774 * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
2775 */
2776 @Override
2777 public void removeStacksInWindowingModes(int[] windowingModes) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002778 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002779 "removeStacksInWindowingModes()");
2780
2781 synchronized (mGlobalLock) {
2782 final long ident = Binder.clearCallingIdentity();
2783 try {
Louis Chang149d5c82019-12-30 09:47:39 +08002784 mRootWindowContainer.removeStacksInWindowingModes(windowingModes);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002785 } finally {
2786 Binder.restoreCallingIdentity(ident);
2787 }
2788 }
2789 }
2790
2791 @Override
2792 public void removeStacksWithActivityTypes(int[] activityTypes) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002793 enforceCallerIsRecentsOrHasPermission(MANAGE_ACTIVITY_STACKS,
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002794 "removeStacksWithActivityTypes()");
2795
2796 synchronized (mGlobalLock) {
2797 final long ident = Binder.clearCallingIdentity();
2798 try {
Louis Chang149d5c82019-12-30 09:47:39 +08002799 mRootWindowContainer.removeStacksWithActivityTypes(activityTypes);
Wale Ogunwale65ebd952018-04-25 15:41:44 -07002800 } finally {
2801 Binder.restoreCallingIdentity(ident);
2802 }
2803 }
2804 }
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002805
2806 @Override
2807 public ParceledListSlice<ActivityManager.RecentTaskInfo> getRecentTasks(int maxNum, int flags,
2808 int userId) {
2809 final int callingUid = Binder.getCallingUid();
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002810 userId = handleIncomingUser(Binder.getCallingPid(), callingUid, userId, "getRecentTasks");
2811 final boolean allowed = isGetTasksAllowed("getRecentTasks", Binder.getCallingPid(),
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002812 callingUid);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07002813 final boolean detailed = checkGetTasksPermission(
2814 android.Manifest.permission.GET_DETAILED_TASKS, Binder.getCallingPid(),
2815 UserHandle.getAppId(callingUid))
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002816 == PackageManager.PERMISSION_GRANTED;
2817
2818 synchronized (mGlobalLock) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07002819 return mRecentTasks.getRecentTasks(maxNum, flags, allowed, detailed, userId,
Wale Ogunwale04d9cb52018-04-30 13:55:07 -07002820 callingUid);
2821 }
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
Hai Zhangf4da9be2019-05-01 13:46:06 +08005874 PermissionPolicyInternal getPermissionPolicyInternal() {
5875 if (mPermissionPolicyInternal == null) {
5876 mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class);
5877 }
5878 return mPermissionPolicyInternal;
5879 }
5880
Wale Ogunwale008163e2018-07-23 23:11:08 -07005881 AppWarnings getAppWarningsLocked() {
5882 return mAppWarnings;
5883 }
5884
Wale Ogunwale214f3482018-10-04 11:00:47 -07005885 Intent getHomeIntent() {
5886 Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
5887 intent.setComponent(mTopComponent);
5888 intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
5889 if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
5890 intent.addCategory(Intent.CATEGORY_HOME);
5891 }
5892 return intent;
5893 }
5894
Chilun2ef71f72018-11-16 17:57:15 +08005895 /**
5896 * Return the intent set with {@link Intent#CATEGORY_SECONDARY_HOME} to resolve secondary home
5897 * activities.
5898 *
Chilun939b05c2020-02-19 14:50:59 +08005899 * @param preferredPackage Specify a preferred package name, otherwise use the package name
5900 * defined in config_secondaryHomePackage.
Chilun2ef71f72018-11-16 17:57:15 +08005901 * @return the intent set with {@link Intent#CATEGORY_SECONDARY_HOME}
5902 */
5903 Intent getSecondaryHomeIntent(String preferredPackage) {
5904 final Intent intent = new Intent(mTopAction, mTopData != null ? Uri.parse(mTopData) : null);
Keun young Park340546a2019-05-06 16:27:44 -07005905 final boolean useSystemProvidedLauncher = mContext.getResources().getBoolean(
5906 com.android.internal.R.bool.config_useSystemProvidedLauncherForSecondary);
5907 if (preferredPackage == null || useSystemProvidedLauncher) {
Chilun939b05c2020-02-19 14:50:59 +08005908 // Using the package name stored in config if no preferred package name or forced.
5909 final String secondaryHomePackage = mContext.getResources().getString(
5910 com.android.internal.R.string.config_secondaryHomePackage);
5911 intent.setPackage(secondaryHomePackage);
Chilun2ef71f72018-11-16 17:57:15 +08005912 } else {
5913 intent.setPackage(preferredPackage);
5914 }
5915 intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
5916 if (mFactoryTest != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
5917 intent.addCategory(Intent.CATEGORY_SECONDARY_HOME);
5918 }
5919 return intent;
5920 }
5921
Wale Ogunwale214f3482018-10-04 11:00:47 -07005922 ApplicationInfo getAppInfoForUser(ApplicationInfo info, int userId) {
5923 if (info == null) return null;
5924 ApplicationInfo newInfo = new ApplicationInfo(info);
5925 newInfo.initForUser(userId);
5926 return newInfo;
5927 }
5928
Wale Ogunwale9c103022018-10-18 07:44:54 -07005929 WindowProcessController getProcessController(String processName, int uid) {
Wale Ogunwale214f3482018-10-04 11:00:47 -07005930 if (uid == SYSTEM_UID) {
5931 // The system gets to run in any process. If there are multiple processes with the same
5932 // uid, just pick the first (this should never happen).
5933 final SparseArray<WindowProcessController> procs =
5934 mProcessNames.getMap().get(processName);
5935 if (procs == null) return null;
5936 final int procCount = procs.size();
5937 for (int i = 0; i < procCount; i++) {
5938 final int procUid = procs.keyAt(i);
5939 if (UserHandle.isApp(procUid) || !UserHandle.isSameUser(procUid, uid)) {
5940 // Don't use an app process or different user process for system component.
5941 continue;
5942 }
5943 return procs.valueAt(i);
5944 }
5945 }
5946
5947 return mProcessNames.get(processName, uid);
5948 }
5949
Wale Ogunwale342fbe92018-10-09 08:44:10 -07005950 WindowProcessController getProcessController(IApplicationThread thread) {
5951 if (thread == null) {
5952 return null;
5953 }
5954
5955 final IBinder threadBinder = thread.asBinder();
5956 final ArrayMap<String, SparseArray<WindowProcessController>> pmap = mProcessNames.getMap();
5957 for (int i = pmap.size()-1; i >= 0; i--) {
5958 final SparseArray<WindowProcessController> procs = pmap.valueAt(i);
5959 for (int j = procs.size() - 1; j >= 0; j--) {
5960 final WindowProcessController proc = procs.valueAt(j);
5961 if (proc.hasThread() && proc.getThread().asBinder() == threadBinder) {
5962 return proc;
5963 }
5964 }
5965 }
5966
5967 return null;
5968 }
5969
Michal Karpinski9cbb20b2019-02-05 17:31:50 +00005970 WindowProcessController getProcessController(int pid, int uid) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01005971 final WindowProcessController proc = mProcessMap.getProcess(pid);
Yunfan Chen8546b212019-04-01 15:34:44 +09005972 if (proc == null) return null;
5973 if (UserHandle.isApp(uid) && proc.mUid == uid) {
5974 return proc;
Michal Karpinski9cbb20b2019-02-05 17:31:50 +00005975 }
5976 return null;
5977 }
5978
Riddle Hsua0536432019-02-16 00:38:59 +08005979 int getUidState(int uid) {
5980 return mActiveUids.getUidState(uid);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07005981 }
5982
Michal Karpinskicc88d7e2019-01-24 15:32:12 +00005983 boolean isUidForeground(int uid) {
Alan Stokeseea8d3e2019-04-10 17:37:25 +01005984 // A uid is considered to be foreground if it has a visible non-toast window.
5985 return mWindowManager.mRoot.isAnyNonToastWindowVisibleForUid(uid);
Michal Karpinskicc88d7e2019-01-24 15:32:12 +00005986 }
5987
Ricky Wai96f5c352019-04-10 18:40:17 +01005988 boolean isDeviceOwner(int uid) {
5989 return uid >= 0 && mDeviceOwnerUid == uid;
Michal Karpinski4026cae2019-02-12 11:51:47 +00005990 }
5991
Ricky Wai96f5c352019-04-10 18:40:17 +01005992 void setDeviceOwnerUid(int uid) {
5993 mDeviceOwnerUid = uid;
Michal Karpinski4026cae2019-02-12 11:51:47 +00005994 }
5995
Wale Ogunwale9de19442018-10-18 19:05:03 -07005996 /**
5997 * @return whitelist tag for a uid from mPendingTempWhitelist, null if not currently on
5998 * the whitelist
5999 */
6000 String getPendingTempWhitelistTagForUidLocked(int uid) {
6001 return mPendingTempWhitelist.get(uid);
6002 }
6003
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006004 void logAppTooSlow(WindowProcessController app, long startTime, String msg) {
6005 if (true || Build.IS_USER) {
6006 return;
6007 }
6008
6009 StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads();
6010 StrictMode.allowThreadDiskWrites();
6011 try {
6012 File tracesDir = new File("/data/anr");
6013 File tracesFile = null;
6014 try {
6015 tracesFile = File.createTempFile("app_slow", null, tracesDir);
6016
6017 StringBuilder sb = new StringBuilder();
Neil Fuller97746812019-08-19 14:20:50 +01006018 String timeString =
6019 TimeMigrationUtils.formatMillisWithFixedFormat(System.currentTimeMillis());
6020 sb.append(timeString);
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006021 sb.append(": ");
6022 TimeUtils.formatDuration(SystemClock.uptimeMillis()-startTime, sb);
6023 sb.append(" since ");
6024 sb.append(msg);
6025 FileOutputStream fos = new FileOutputStream(tracesFile);
6026 fos.write(sb.toString().getBytes());
6027 if (app == null) {
6028 fos.write("\n*** No application process!".getBytes());
6029 }
6030 fos.close();
6031 FileUtils.setPermissions(tracesFile.getPath(), 0666, -1, -1); // -rw-rw-rw-
6032 } catch (IOException e) {
6033 Slog.w(TAG, "Unable to prepare slow app traces file: " + tracesFile, e);
6034 return;
6035 }
6036
6037 if (app != null && app.getPid() > 0) {
6038 ArrayList<Integer> firstPids = new ArrayList<Integer>();
6039 firstPids.add(app.getPid());
6040 dumpStackTraces(tracesFile.getAbsolutePath(), firstPids, null, null);
6041 }
6042
6043 File lastTracesFile = null;
6044 File curTracesFile = null;
6045 for (int i=9; i>=0; i--) {
6046 String name = String.format(Locale.US, "slow%02d.txt", i);
6047 curTracesFile = new File(tracesDir, name);
6048 if (curTracesFile.exists()) {
6049 if (lastTracesFile != null) {
6050 curTracesFile.renameTo(lastTracesFile);
6051 } else {
6052 curTracesFile.delete();
6053 }
6054 }
6055 lastTracesFile = curTracesFile;
6056 }
6057 tracesFile.renameTo(curTracesFile);
6058 } finally {
6059 StrictMode.setThreadPolicy(oldPolicy);
6060 }
6061 }
6062
Michal Karpinskida34cd42019-04-02 19:46:52 +01006063 boolean isAssociatedCompanionApp(int userId, int uid) {
6064 final Set<Integer> allUids = mCompanionAppUidsMap.get(userId);
6065 if (allUids == null) {
Ricky Wai2452e2d2019-03-18 19:19:08 +00006066 return false;
6067 }
Michal Karpinskida34cd42019-04-02 19:46:52 +01006068 return allUids.contains(uid);
Ricky Wai2452e2d2019-03-18 19:19:08 +00006069 }
6070
Issei Suzuki734bc942019-06-05 13:59:52 +02006071 void notifySingleTaskDisplayEmpty(int displayId) {
6072 mTaskChangeNotificationController.notifySingleTaskDisplayEmpty(displayId);
6073 }
6074
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006075 final class H extends Handler {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006076 static final int REPORT_TIME_TRACKER_MSG = 1;
Alison Cichowlas3e340502018-08-07 17:15:01 -04006077
6078
Wale Ogunwale98875612018-10-12 07:53:02 -07006079 static final int FIRST_ACTIVITY_STACK_MSG = 100;
6080 static final int FIRST_SUPERVISOR_STACK_MSG = 200;
Wale Ogunwalef6733932018-06-27 05:14:34 -07006081
Riddle Hsud93a6c42018-11-29 21:50:06 +08006082 H(Looper looper) {
6083 super(looper);
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006084 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07006085
6086 @Override
6087 public void handleMessage(Message msg) {
6088 switch (msg.what) {
6089 case REPORT_TIME_TRACKER_MSG: {
6090 AppTimeTracker tracker = (AppTimeTracker) msg.obj;
6091 tracker.deliverResult(mContext);
6092 } break;
6093 }
6094 }
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006095 }
6096
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006097 final class UiHandler extends Handler {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006098 static final int DISMISS_DIALOG_UI_MSG = 1;
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006099
6100 public UiHandler() {
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -08006101 super(UiThread.get().getLooper(), null, true);
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006102 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07006103
6104 @Override
6105 public void handleMessage(Message msg) {
6106 switch (msg.what) {
6107 case DISMISS_DIALOG_UI_MSG: {
6108 final Dialog d = (Dialog) msg.obj;
6109 d.dismiss();
6110 break;
6111 }
6112 }
6113 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006114 }
6115
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006116 final class LocalService extends ActivityTaskManagerInternal {
6117 @Override
6118 public SleepToken acquireSleepToken(String tag, int displayId) {
Daulet Zhanguzinc6c641f2020-01-02 17:18:30 +00006119 Objects.requireNonNull(tag);
Wale Ogunwalef6733932018-06-27 05:14:34 -07006120 return ActivityTaskManagerService.this.acquireSleepToken(tag, displayId);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006121 }
6122
6123 @Override
6124 public ComponentName getHomeActivityForUser(int userId) {
6125 synchronized (mGlobalLock) {
Wale Ogunwaled32da472018-11-16 07:19:28 -08006126 final ActivityRecord homeActivity =
Louis Chang149d5c82019-12-30 09:47:39 +08006127 mRootWindowContainer.getDefaultDisplayHomeActivityForUser(userId);
Wale Ogunwale8b19de92018-11-29 19:58:26 -08006128 return homeActivity == null ? null : homeActivity.mActivityComponent;
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006129 }
6130 }
6131
6132 @Override
6133 public void onLocalVoiceInteractionStarted(IBinder activity,
6134 IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
6135 synchronized (mGlobalLock) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006136 onLocalVoiceInteractionStartedLocked(activity, voiceSession, voiceInteractor);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006137 }
6138 }
6139
6140 @Override
Issei Suzukicac2a502019-04-16 16:52:50 +02006141 public void notifySingleTaskDisplayDrawn(int displayId) {
6142 mTaskChangeNotificationController.notifySingleTaskDisplayDrawn(displayId);
6143 }
6144
6145 @Override
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006146 public void notifyAppTransitionFinished() {
6147 synchronized (mGlobalLock) {
6148 mStackSupervisor.notifyAppTransitionDone();
6149 }
6150 }
6151
6152 @Override
6153 public void notifyAppTransitionCancelled() {
6154 synchronized (mGlobalLock) {
6155 mStackSupervisor.notifyAppTransitionDone();
6156 }
6157 }
6158
6159 @Override
6160 public List<IBinder> getTopVisibleActivities() {
6161 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006162 return mRootWindowContainer.getTopVisibleActivities();
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006163 }
6164 }
6165
6166 @Override
Philip P. Moltmannee295092020-02-10 08:46:26 -08006167 public int startActivitiesAsPackage(String packageName, @Nullable String featureId,
6168 int userId, Intent[] intents, Bundle bOptions) {
Daulet Zhanguzinc6c641f2020-01-02 17:18:30 +00006169 Objects.requireNonNull(intents, "intents");
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006170 final String[] resolvedTypes = new String[intents.length];
6171
6172 // UID of the package on user userId.
6173 // "= 0" is needed because otherwise catch(RemoteException) would make it look like
6174 // packageUid may not be initialized.
6175 int packageUid = 0;
6176 final long ident = Binder.clearCallingIdentity();
6177
6178 try {
6179 for (int i = 0; i < intents.length; i++) {
6180 resolvedTypes[i] =
6181 intents[i].resolveTypeIfNeeded(mContext.getContentResolver());
6182 }
6183
6184 packageUid = AppGlobals.getPackageManager().getPackageUid(
6185 packageName, PackageManager.MATCH_DEBUG_TRIAGED_MISSING, userId);
6186 } catch (RemoteException e) {
6187 // Shouldn't happen.
6188 } finally {
6189 Binder.restoreCallingIdentity(ident);
6190 }
6191
Riddle Hsu591bf612019-02-14 17:55:31 +08006192 return getActivityStartController().startActivitiesInPackage(
Philip P. Moltmannee295092020-02-10 08:46:26 -08006193 packageUid, packageName, featureId,
Riddle Hsu591bf612019-02-14 17:55:31 +08006194 intents, resolvedTypes, null /* resultTo */,
6195 SafeActivityOptions.fromBundle(bOptions), userId,
6196 false /* validateIncomingUser */, null /* originatingPendingIntent */,
6197 false /* allowBackgroundActivityStart */);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006198 }
6199
6200 @Override
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00006201 public int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006202 String callingPackage, @Nullable String callingFeatureId, Intent[] intents,
6203 String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId,
6204 boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent,
Michal Karpinskiac116df2018-12-10 17:51:42 +00006205 boolean allowBackgroundActivityStart) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07006206 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006207 synchronized (mGlobalLock) {
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00006208 return getActivityStartController().startActivitiesInPackage(uid, realCallingPid,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006209 realCallingUid, callingPackage, callingFeatureId, intents, resolvedTypes,
6210 resultTo, options, userId, validateIncomingUser, originatingPendingIntent,
Michal Karpinski84d9ebd2019-01-17 18:28:59 +00006211 allowBackgroundActivityStart);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006212 }
6213 }
6214
6215 @Override
6216 public int startActivityInPackage(int uid, int realCallingPid, int realCallingUid,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006217 String callingPackage, @Nullable String callingFeatureId, Intent intent,
6218 String resolvedType, IBinder resultTo, String resultWho, int requestCode,
6219 int startFlags, SafeActivityOptions options, int userId, Task inTask, String reason,
6220 boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent,
Michal Karpinskiac116df2018-12-10 17:51:42 +00006221 boolean allowBackgroundActivityStart) {
Andrii Kulianf9e5c9f2019-07-16 11:24:45 -07006222 assertPackageMatchesCallingUid(callingPackage);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006223 synchronized (mGlobalLock) {
6224 return getActivityStartController().startActivityInPackage(uid, realCallingPid,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006225 realCallingUid, callingPackage, callingFeatureId, intent, resolvedType,
6226 resultTo, resultWho, requestCode, startFlags, options, userId, inTask,
6227 reason, validateIncomingUser, originatingPendingIntent,
Michal Karpinskiac116df2018-12-10 17:51:42 +00006228 allowBackgroundActivityStart);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006229 }
6230 }
6231
6232 @Override
Philip P. Moltmannee295092020-02-10 08:46:26 -08006233 public int startActivityAsUser(IApplicationThread caller, String callerPackage,
Alex Kershaw16406c32020-02-17 12:28:53 +00006234 @Nullable String callerFeatureId, Intent intent, @Nullable IBinder resultTo,
6235 int startFlags, Bundle options, int userId) {
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006236 return ActivityTaskManagerService.this.startActivityAsUser(
Philip P. Moltmannee295092020-02-10 08:46:26 -08006237 caller, callerPackage, callerFeatureId, intent,
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006238 intent.resolveTypeIfNeeded(mContext.getContentResolver()),
Alex Kershaw16406c32020-02-17 12:28:53 +00006239 resultTo, null, 0, startFlags, null, options, userId,
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006240 false /*validateIncomingUser*/);
6241 }
6242
6243 @Override
lumark588a3e82018-07-20 18:53:54 +08006244 public void notifyKeyguardFlagsChanged(@Nullable Runnable callback, int displayId) {
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006245 synchronized (mGlobalLock) {
6246
6247 // We might change the visibilities here, so prepare an empty app transition which
6248 // might be overridden later if we actually change visibilities.
Louis Chang677921f2019-12-06 16:44:24 +08006249 final DisplayContent displayContent =
Louis Chang149d5c82019-12-30 09:47:39 +08006250 mRootWindowContainer.getDisplayContent(displayId);
Louis Chang677921f2019-12-06 16:44:24 +08006251 if (displayContent == null) {
lumark52ea28e2018-11-09 17:30:47 +08006252 return;
6253 }
Louis Chang677921f2019-12-06 16:44:24 +08006254 final DisplayContent dc = displayContent.mDisplayContent;
Wale Ogunwale3a256e62018-12-06 14:41:18 -08006255 final boolean wasTransitionSet =
6256 dc.mAppTransition.getAppTransition() != TRANSIT_NONE;
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006257 if (!wasTransitionSet) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08006258 dc.prepareAppTransition(TRANSIT_NONE, false /* alwaysKeepCurrent */);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006259 }
Louis Chang149d5c82019-12-30 09:47:39 +08006260 mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006261
6262 // If there was a transition set already we don't want to interfere with it as we
6263 // might be starting it too early.
6264 if (!wasTransitionSet) {
Wale Ogunwale3a256e62018-12-06 14:41:18 -08006265 dc.executeAppTransition();
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006266 }
6267 }
6268 if (callback != null) {
6269 callback.run();
6270 }
6271 }
6272
6273 @Override
6274 public void notifyKeyguardTrustedChanged() {
6275 synchronized (mGlobalLock) {
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006276 if (mKeyguardController.isKeyguardShowing(DEFAULT_DISPLAY)) {
Louis Chang149d5c82019-12-30 09:47:39 +08006277 mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006278 }
6279 }
6280 }
6281
6282 /**
6283 * Called after virtual display Id is updated by
6284 * {@link com.android.server.vr.Vr2dDisplay} with a specific
6285 * {@param vrVr2dDisplayId}.
6286 */
6287 @Override
6288 public void setVr2dDisplayId(int vr2dDisplayId) {
6289 if (DEBUG_STACK) Slog.d(TAG, "setVr2dDisplayId called for: " + vr2dDisplayId);
6290 synchronized (mGlobalLock) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006291 mVr2dDisplayId = vr2dDisplayId;
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006292 }
6293 }
6294
6295 @Override
6296 public void setFocusedActivity(IBinder token) {
6297 synchronized (mGlobalLock) {
6298 final ActivityRecord r = ActivityRecord.forTokenLocked(token);
6299 if (r == null) {
6300 throw new IllegalArgumentException(
6301 "setFocusedActivity: No activity record matching token=" + token);
6302 }
Louis Chang19443452018-10-09 12:10:21 +08006303 if (r.moveFocusableActivityToTop("setFocusedActivity")) {
Louis Chang149d5c82019-12-30 09:47:39 +08006304 mRootWindowContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006305 }
6306 }
6307 }
6308
6309 @Override
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006310 public void registerScreenObserver(ScreenObserver observer) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006311 mScreenObservers.add(observer);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006312 }
6313
6314 @Override
6315 public boolean isCallerRecents(int callingUid) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07006316 return getRecentTasks().isCallerRecents(callingUid);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006317 }
6318
6319 @Override
6320 public boolean isRecentsComponentHomeActivity(int userId) {
Wale Ogunwale16e505a2018-05-07 15:00:49 -07006321 return getRecentTasks().isRecentsComponentHomeActivity(userId);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006322 }
6323
6324 @Override
6325 public void cancelRecentsAnimation(boolean restoreHomeStackPosition) {
6326 ActivityTaskManagerService.this.cancelRecentsAnimation(restoreHomeStackPosition);
6327 }
6328
6329 @Override
6330 public void enforceCallerIsRecentsOrHasPermission(String permission, String func) {
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006331 ActivityTaskManagerService.this.enforceCallerIsRecentsOrHasPermission(permission, func);
Wale Ogunwale6767eae2018-05-03 15:52:51 -07006332 }
Wale Ogunwaled0412b32018-05-08 09:25:50 -07006333
6334 @Override
6335 public void notifyActiveVoiceInteractionServiceChanged(ComponentName component) {
6336 synchronized (mGlobalLock) {
6337 mActiveVoiceInteractionServiceComponent = component;
6338 }
6339 }
Wale Ogunwalea6191b42018-05-09 07:41:32 -07006340
6341 @Override
6342 public void setAllowAppSwitches(@NonNull String type, int uid, int userId) {
6343 if (!mAmInternal.isUserRunning(userId, ActivityManager.FLAG_OR_STOPPED)) {
6344 return;
6345 }
6346 synchronized (mGlobalLock) {
6347 ArrayMap<String, Integer> types = mAllowAppSwitchUids.get(userId);
6348 if (types == null) {
6349 if (uid < 0) {
6350 return;
6351 }
6352 types = new ArrayMap<>();
6353 mAllowAppSwitchUids.put(userId, types);
6354 }
6355 if (uid < 0) {
6356 types.remove(type);
6357 } else {
6358 types.put(type, uid);
6359 }
6360 }
6361 }
6362
6363 @Override
6364 public void onUserStopped(int userId) {
6365 synchronized (mGlobalLock) {
6366 getRecentTasks().unloadUserDataFromMemoryLocked(userId);
6367 mAllowAppSwitchUids.remove(userId);
6368 }
6369 }
6370
6371 @Override
6372 public boolean isGetTasksAllowed(String caller, int callingPid, int callingUid) {
6373 synchronized (mGlobalLock) {
6374 return ActivityTaskManagerService.this.isGetTasksAllowed(
6375 caller, callingPid, callingUid);
6376 }
6377 }
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006378
Riddle Hsua0536432019-02-16 00:38:59 +08006379 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006380 @Override
6381 public void onProcessAdded(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006382 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006383 mProcessNames.put(proc.mName, proc.mUid, proc);
6384 }
6385 }
6386
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 onProcessRemoved(String name, int uid) {
Riddle Hsua0536432019-02-16 00:38:59 +08006390 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006391 mProcessNames.remove(name, uid);
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 onCleanUpApplicationRecord(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006398 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9e4f3e02018-05-17 09:35:39 -07006399 if (proc == mHomeProcess) {
6400 mHomeProcess = null;
6401 }
6402 if (proc == mPreviousProcess) {
6403 mPreviousProcess = null;
6404 }
6405 }
6406 }
Wale Ogunwalef6733932018-06-27 05:14:34 -07006407
Riddle Hsua0536432019-02-16 00:38:59 +08006408 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalef6733932018-06-27 05:14:34 -07006409 @Override
6410 public int getTopProcessState() {
Riddle Hsua0536432019-02-16 00:38:59 +08006411 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006412 return mTopProcessState;
6413 }
6414 }
6415
Riddle Hsua0536432019-02-16 00:38:59 +08006416 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalef6733932018-06-27 05:14:34 -07006417 @Override
Wale Ogunwale53783742018-09-16 10:21:51 -07006418 public boolean isHeavyWeightProcess(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006419 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale53783742018-09-16 10:21:51 -07006420 return proc == mHeavyWeightProcess;
6421 }
6422 }
6423
Riddle Hsua0536432019-02-16 00:38:59 +08006424 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale53783742018-09-16 10:21:51 -07006425 @Override
6426 public void clearHeavyWeightProcessIfEquals(WindowProcessController proc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006427 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale53783742018-09-16 10:21:51 -07006428 ActivityTaskManagerService.this.clearHeavyWeightProcessIfEquals(proc);
6429 }
6430 }
6431
6432 @Override
6433 public void finishHeavyWeightApp() {
6434 synchronized (mGlobalLock) {
Sudheer Shankaee1da272018-10-20 20:11:44 -07006435 if (mHeavyWeightProcess != null) {
6436 mHeavyWeightProcess.finishActivities();
6437 }
Wale Ogunwale53783742018-09-16 10:21:51 -07006438 ActivityTaskManagerService.this.clearHeavyWeightProcessIfEquals(
6439 mHeavyWeightProcess);
6440 }
6441 }
6442
Riddle Hsua0536432019-02-16 00:38:59 +08006443 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwale53783742018-09-16 10:21:51 -07006444 @Override
Wale Ogunwalef6733932018-06-27 05:14:34 -07006445 public boolean isSleeping() {
Riddle Hsua0536432019-02-16 00:38:59 +08006446 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwalef6733932018-06-27 05:14:34 -07006447 return isSleepingLocked();
6448 }
6449 }
6450
6451 @Override
6452 public boolean isShuttingDown() {
6453 synchronized (mGlobalLock) {
6454 return mShuttingDown;
6455 }
6456 }
6457
6458 @Override
6459 public boolean shuttingDown(boolean booted, int timeout) {
6460 synchronized (mGlobalLock) {
6461 mShuttingDown = true;
Louis Chang149d5c82019-12-30 09:47:39 +08006462 mRootWindowContainer.prepareForShutdown();
Wale Ogunwalef6733932018-06-27 05:14:34 -07006463 updateEventDispatchingLocked(booted);
Wale Ogunwaled4d67d02018-10-25 18:09:39 -07006464 notifyTaskPersisterLocked(null, true);
Wale Ogunwalef6733932018-06-27 05:14:34 -07006465 return mStackSupervisor.shutdownLocked(timeout);
6466 }
6467 }
6468
6469 @Override
6470 public void enableScreenAfterBoot(boolean booted) {
6471 synchronized (mGlobalLock) {
Jeff Changd136e772019-11-05 20:33:52 +08006472 writeBootProgressEnableScreen(SystemClock.uptimeMillis());
Wale Ogunwalef6733932018-06-27 05:14:34 -07006473 mWindowManager.enableScreenAfterBoot();
6474 updateEventDispatchingLocked(booted);
6475 }
6476 }
6477
6478 @Override
6479 public boolean showStrictModeViolationDialog() {
6480 synchronized (mGlobalLock) {
6481 return mShowDialogs && !mSleeping && !mShuttingDown;
6482 }
6483 }
6484
6485 @Override
6486 public void showSystemReadyErrorDialogsIfNeeded() {
6487 synchronized (mGlobalLock) {
6488 try {
6489 if (AppGlobals.getPackageManager().hasSystemUidErrors()) {
6490 Slog.e(TAG, "UIDs on the system are inconsistent, you need to wipe your"
6491 + " data partition or your device will be unstable.");
6492 mUiHandler.post(() -> {
6493 if (mShowDialogs) {
6494 AlertDialog d = new BaseErrorDialog(mUiContext);
6495 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
6496 d.setCancelable(false);
6497 d.setTitle(mUiContext.getText(R.string.android_system_label));
6498 d.setMessage(mUiContext.getText(R.string.system_error_wipe_data));
6499 d.setButton(DialogInterface.BUTTON_POSITIVE,
6500 mUiContext.getText(R.string.ok),
6501 mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
6502 d.show();
6503 }
6504 });
6505 }
6506 } catch (RemoteException e) {
6507 }
6508
6509 if (!Build.isBuildConsistent()) {
6510 Slog.e(TAG, "Build fingerprint is not consistent, warning user");
6511 mUiHandler.post(() -> {
6512 if (mShowDialogs) {
6513 AlertDialog d = new BaseErrorDialog(mUiContext);
6514 d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
6515 d.setCancelable(false);
6516 d.setTitle(mUiContext.getText(R.string.android_system_label));
6517 d.setMessage(mUiContext.getText(R.string.system_error_manufacturer));
6518 d.setButton(DialogInterface.BUTTON_POSITIVE,
6519 mUiContext.getText(R.string.ok),
6520 mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
6521 d.show();
6522 }
6523 });
6524 }
6525 }
6526 }
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006527
6528 @Override
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006529 public void onProcessMapped(int pid, WindowProcessController proc) {
6530 synchronized (mGlobalLock) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006531 mProcessMap.put(pid, proc);
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006532 }
6533 }
6534
6535 @Override
6536 public void onProcessUnMapped(int pid) {
6537 synchronized (mGlobalLock) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006538 mProcessMap.remove(pid);
Wale Ogunwale906f9c62018-07-23 11:23:44 -07006539 }
6540 }
Wale Ogunwale008163e2018-07-23 23:11:08 -07006541
6542 @Override
6543 public void onPackageDataCleared(String name) {
6544 synchronized (mGlobalLock) {
Wale Ogunwale53783742018-09-16 10:21:51 -07006545 mCompatModePackages.handlePackageDataClearedLocked(name);
Wale Ogunwale008163e2018-07-23 23:11:08 -07006546 mAppWarnings.onPackageDataCleared(name);
6547 }
6548 }
6549
6550 @Override
6551 public void onPackageUninstalled(String name) {
6552 synchronized (mGlobalLock) {
6553 mAppWarnings.onPackageUninstalled(name);
Wale Ogunwale53783742018-09-16 10:21:51 -07006554 mCompatModePackages.handlePackageUninstalledLocked(name);
Wale Ogunwale008163e2018-07-23 23:11:08 -07006555 }
6556 }
Wale Ogunwale53783742018-09-16 10:21:51 -07006557
6558 @Override
6559 public void onPackageAdded(String name, boolean replacing) {
6560 synchronized (mGlobalLock) {
6561 mCompatModePackages.handlePackageAddedLocked(name, replacing);
6562 }
6563 }
6564
6565 @Override
Wale Ogunwale31913b52018-10-13 08:29:31 -07006566 public void onPackageReplaced(ApplicationInfo aInfo) {
6567 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006568 mRootWindowContainer.updateActivityApplicationInfo(aInfo);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006569 }
6570 }
6571
6572 @Override
Wale Ogunwale53783742018-09-16 10:21:51 -07006573 public CompatibilityInfo compatibilityInfoForPackage(ApplicationInfo ai) {
6574 synchronized (mGlobalLock) {
6575 return compatibilityInfoForPackageLocked(ai);
6576 }
6577 }
6578
Yunfan Chen75157d72018-07-27 14:47:21 +09006579 /**
6580 * Set the corresponding display information for the process global configuration. To be
6581 * called when we need to show IME on a different display.
6582 *
6583 * @param pid The process id associated with the IME window.
6584 * @param displayId The ID of the display showing the IME.
6585 */
6586 @Override
Yunfan Chen79b96062018-10-17 12:45:23 -07006587 public void onImeWindowSetOnDisplay(final int pid, final int displayId) {
lumark48973532019-04-12 20:18:15 +08006588 // Don't update process-level configuration for Multi-Client IME process since other
6589 // IMEs on other displays will also receive this configuration change due to IME
6590 // services use the same application config/context.
6591 if (InputMethodSystemProperty.MULTI_CLIENT_IME_ENABLED) return;
lumark5df49512019-04-02 14:56:46 +08006592
Yunfan Chen75157d72018-07-27 14:47:21 +09006593 if (pid == MY_PID || pid < 0) {
6594 if (DEBUG_CONFIGURATION) {
6595 Slog.w(TAG,
6596 "Trying to update display configuration for system/invalid process.");
6597 }
6598 return;
6599 }
Yunfan Chencafc7062019-01-22 17:21:32 +09006600 synchronized (mGlobalLock) {
Louis Chang677921f2019-12-06 16:44:24 +08006601 final DisplayContent displayContent =
Louis Chang149d5c82019-12-30 09:47:39 +08006602 mRootWindowContainer.getDisplayContent(displayId);
Louis Chang677921f2019-12-06 16:44:24 +08006603 if (displayContent == null) {
Yunfan Chencafc7062019-01-22 17:21:32 +09006604 // Call might come when display is not yet added or has been removed.
6605 if (DEBUG_CONFIGURATION) {
6606 Slog.w(TAG, "Trying to update display configuration for non-existing "
6607 + "displayId=" + displayId);
Yunfan Chen75157d72018-07-27 14:47:21 +09006608 }
Yunfan Chencafc7062019-01-22 17:21:32 +09006609 return;
Yunfan Chen75157d72018-07-27 14:47:21 +09006610 }
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006611 final WindowProcessController process = mProcessMap.getProcess(pid);
Yunfan Chencafc7062019-01-22 17:21:32 +09006612 if (process == null) {
6613 if (DEBUG_CONFIGURATION) {
6614 Slog.w(TAG, "Trying to update display configuration for invalid "
6615 + "process, pid=" + pid);
6616 }
6617 return;
6618 }
lumarkddc77fb2019-06-27 22:22:23 +08006619 process.mIsImeProcess = true;
Andrii Kulianfa23a9e2019-10-10 15:15:36 -07006620 process.registerDisplayConfigurationListener(displayContent);
Yunfan Chencafc7062019-01-22 17:21:32 +09006621 }
Yunfan Chen75157d72018-07-27 14:47:21 +09006622 }
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006623
6624 @Override
6625 public void sendActivityResult(int callingUid, IBinder activityToken, String resultWho,
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00006626 int requestCode, int resultCode, Intent data) {
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006627 synchronized (mGlobalLock) {
Wale Ogunwale586a8ee2019-06-04 13:44:14 +00006628 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
Wale Ogunwale1ebcd8e2020-01-21 11:27:03 -08006629 if (r != null && r.getRootTask() != null) {
Andrii Kulian79d67982019-08-19 11:56:16 -07006630 r.sendResult(callingUid, resultWho, requestCode, resultCode, data);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006631 }
6632 }
6633 }
6634
6635 @Override
6636 public void clearPendingResultForActivity(IBinder activityToken,
6637 WeakReference<PendingIntentRecord> pir) {
6638 synchronized (mGlobalLock) {
6639 final ActivityRecord r = ActivityRecord.isInStackLocked(activityToken);
6640 if (r != null && r.pendingResults != null) {
6641 r.pendingResults.remove(pir);
6642 }
6643 }
6644 }
6645
6646 @Override
Sunny Goyald40c3452019-03-20 12:46:55 -07006647 public ActivityTokens getTopActivityForTask(int taskId) {
6648 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006649 final Task task = mRootWindowContainer.anyTaskForId(taskId);
Louis Changcdec0802019-11-11 11:45:07 +08006650 if (task == null) {
Sunny Goyald40c3452019-03-20 12:46:55 -07006651 Slog.w(TAG, "getApplicationThreadForTopActivity failed:"
6652 + " Requested task not found");
6653 return null;
6654 }
Wale Ogunwale21e06482019-11-18 05:14:15 -08006655 final ActivityRecord activity = task.getTopNonFinishingActivity();
Sunny Goyald40c3452019-03-20 12:46:55 -07006656 if (activity == null) {
6657 Slog.w(TAG, "getApplicationThreadForTopActivity failed:"
6658 + " Requested activity not found");
6659 return null;
6660 }
6661 if (!activity.attachedToProcess()) {
6662 Slog.w(TAG, "getApplicationThreadForTopActivity failed: No process for "
6663 + activity);
6664 return null;
6665 }
6666 return new ActivityTokens(activity.appToken, activity.assistToken,
6667 activity.app.getThread());
6668 }
6669 }
6670
6671 @Override
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006672 public IIntentSender getIntentSender(int type, String packageName,
Philip P. Moltmannee295092020-02-10 08:46:26 -08006673 @Nullable String featureId, int callingUid, int userId, IBinder token,
6674 String resultWho, int requestCode, Intent[] intents, String[] resolvedTypes,
6675 int flags, Bundle bOptions) {
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006676 synchronized (mGlobalLock) {
Philip P. Moltmannee295092020-02-10 08:46:26 -08006677 return getIntentSenderLocked(type, packageName, featureId, callingUid, userId,
6678 token, resultWho, requestCode, intents, resolvedTypes, flags, bOptions);
Wale Ogunwaleee6eca12018-09-19 20:37:53 -07006679 }
6680 }
Wale Ogunwalec4e63a42018-10-02 13:19:54 -07006681
6682 @Override
6683 public ActivityServiceConnectionsHolder getServiceConnectionsHolder(IBinder token) {
6684 synchronized (mGlobalLock) {
6685 final ActivityRecord r = ActivityRecord.isInStackLocked(token);
6686 if (r == null) {
6687 return null;
6688 }
6689 if (r.mServiceConnectionsHolder == null) {
6690 r.mServiceConnectionsHolder = new ActivityServiceConnectionsHolder(
6691 ActivityTaskManagerService.this, r);
6692 }
6693
6694 return r.mServiceConnectionsHolder;
6695 }
6696 }
Wale Ogunwale214f3482018-10-04 11:00:47 -07006697
6698 @Override
6699 public Intent getHomeIntent() {
6700 synchronized (mGlobalLock) {
6701 return ActivityTaskManagerService.this.getHomeIntent();
6702 }
6703 }
6704
6705 @Override
6706 public boolean startHomeActivity(int userId, String reason) {
6707 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006708 return mRootWindowContainer.startHomeOnDisplay(userId, reason, DEFAULT_DISPLAY);
Louis Chang89f43fc2018-10-05 10:59:14 +08006709 }
6710 }
6711
6712 @Override
Chilun8b1f1be2019-03-13 17:14:36 +08006713 public boolean startHomeOnDisplay(int userId, String reason, int displayId,
Chilun39232092019-03-22 14:41:30 +08006714 boolean allowInstrumenting, boolean fromHomeKey) {
Chilun5fd56542019-03-21 19:51:37 +08006715 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006716 return mRootWindowContainer.startHomeOnDisplay(userId, reason, displayId,
Chilun39232092019-03-22 14:41:30 +08006717 allowInstrumenting, fromHomeKey);
Chilun5fd56542019-03-21 19:51:37 +08006718 }
Chilun8b1f1be2019-03-13 17:14:36 +08006719 }
6720
6721 @Override
Louis Chang89f43fc2018-10-05 10:59:14 +08006722 public boolean startHomeOnAllDisplays(int userId, String reason) {
6723 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006724 return mRootWindowContainer.startHomeOnAllDisplays(userId, reason);
Wale Ogunwale214f3482018-10-04 11:00:47 -07006725 }
6726 }
6727
Riddle Hsua0536432019-02-16 00:38:59 +08006728 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale214f3482018-10-04 11:00:47 -07006729 @Override
6730 public boolean isFactoryTestProcess(WindowProcessController wpc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006731 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale214f3482018-10-04 11:00:47 -07006732 if (mFactoryTest == FACTORY_TEST_OFF) {
6733 return false;
6734 }
6735 if (mFactoryTest == FACTORY_TEST_LOW_LEVEL && mTopComponent != null
6736 && wpc.mName.equals(mTopComponent.getPackageName())) {
6737 return true;
6738 }
6739 return mFactoryTest == FACTORY_TEST_HIGH_LEVEL
6740 && (wpc.mInfo.flags & FLAG_FACTORY_TEST) != 0;
6741 }
6742 }
6743
6744 @Override
6745 public void updateTopComponentForFactoryTest() {
6746 synchronized (mGlobalLock) {
6747 if (mFactoryTest != FACTORY_TEST_LOW_LEVEL) {
6748 return;
6749 }
6750 final ResolveInfo ri = mContext.getPackageManager()
6751 .resolveActivity(new Intent(Intent.ACTION_FACTORY_TEST), STOCK_PM_FLAGS);
6752 final CharSequence errorMsg;
6753 if (ri != null) {
6754 final ActivityInfo ai = ri.activityInfo;
6755 final ApplicationInfo app = ai.applicationInfo;
6756 if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
6757 mTopAction = Intent.ACTION_FACTORY_TEST;
6758 mTopData = null;
6759 mTopComponent = new ComponentName(app.packageName, ai.name);
6760 errorMsg = null;
6761 } else {
6762 errorMsg = mContext.getResources().getText(
6763 com.android.internal.R.string.factorytest_not_system);
6764 }
6765 } else {
6766 errorMsg = mContext.getResources().getText(
6767 com.android.internal.R.string.factorytest_no_action);
6768 }
6769 if (errorMsg == null) {
6770 return;
6771 }
6772
6773 mTopAction = null;
6774 mTopData = null;
6775 mTopComponent = null;
6776 mUiHandler.post(() -> {
6777 Dialog d = new FactoryErrorDialog(mUiContext, errorMsg);
6778 d.show();
Wale Ogunwale342fbe92018-10-09 08:44:10 -07006779 mAmInternal.ensureBootCompleted();
Wale Ogunwale214f3482018-10-04 11:00:47 -07006780 });
6781 }
6782 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006783
Riddle Hsua0536432019-02-16 00:38:59 +08006784 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale31913b52018-10-13 08:29:31 -07006785 @Override
6786 public void handleAppDied(WindowProcessController wpc, boolean restarting,
6787 Runnable finishInstrumentationCallback) {
Riddle Hsua0536432019-02-16 00:38:59 +08006788 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07006789 // Remove this application's activities from active lists.
Louis Chang149d5c82019-12-30 09:47:39 +08006790 boolean hasVisibleActivities = mRootWindowContainer.handleAppDied(wpc);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006791
6792 wpc.clearRecentTasks();
6793 wpc.clearActivities();
6794
6795 if (wpc.isInstrumenting()) {
6796 finishInstrumentationCallback.run();
6797 }
6798
Jorim Jaggid0752812018-10-16 16:07:20 +02006799 if (!restarting && hasVisibleActivities) {
Riddle Hsua0022cd2019-09-09 21:12:41 +08006800 deferWindowLayout();
Jorim Jaggid0752812018-10-16 16:07:20 +02006801 try {
Louis Chang149d5c82019-12-30 09:47:39 +08006802 if (!mRootWindowContainer.resumeFocusedStacksTopActivities()) {
Jorim Jaggid0752812018-10-16 16:07:20 +02006803 // If there was nothing to resume, and we are not already restarting
6804 // this process, but there is a visible activity that is hosted by the
6805 // process...then make sure all visible activities are running, taking
6806 // care of restarting this process.
Louis Chang149d5c82019-12-30 09:47:39 +08006807 mRootWindowContainer.ensureActivitiesVisible(null, 0,
Jorim Jaggid0752812018-10-16 16:07:20 +02006808 !PRESERVE_WINDOWS);
6809 }
6810 } finally {
Riddle Hsua0022cd2019-09-09 21:12:41 +08006811 continueWindowLayout();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006812 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006813 }
6814 }
6815 }
6816
6817 @Override
6818 public void closeSystemDialogs(String reason) {
6819 enforceNotIsolatedCaller("closeSystemDialogs");
6820
6821 final int pid = Binder.getCallingPid();
6822 final int uid = Binder.getCallingUid();
6823 final long origId = Binder.clearCallingIdentity();
6824 try {
6825 synchronized (mGlobalLock) {
6826 // Only allow this from foreground processes, so that background
6827 // applications can't abuse it to prevent system UI from being shown.
6828 if (uid >= FIRST_APPLICATION_UID) {
Michal Karpinski2e0aad22019-04-12 16:22:55 +01006829 final WindowProcessController proc = mProcessMap.getProcess(pid);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006830 if (!proc.isPerceptible()) {
6831 Slog.w(TAG, "Ignoring closeSystemDialogs " + reason
6832 + " from background process " + proc);
6833 return;
6834 }
6835 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006836 mWindowManager.closeSystemDialogs(reason);
6837
Louis Chang149d5c82019-12-30 09:47:39 +08006838 mRootWindowContainer.closeSystemDialogs();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006839 }
Wale Ogunwale2ea36d42018-10-18 10:27:31 -07006840 // Call into AM outside the synchronized block.
6841 mAmInternal.broadcastCloseSystemDialogs(reason);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006842 } finally {
6843 Binder.restoreCallingIdentity(origId);
6844 }
6845 }
6846
6847 @Override
6848 public void cleanupDisabledPackageComponents(
6849 String packageName, Set<String> disabledClasses, int userId, boolean booted) {
6850 synchronized (mGlobalLock) {
6851 // Clean-up disabled activities.
Louis Chang149d5c82019-12-30 09:47:39 +08006852 if (mRootWindowContainer.finishDisabledPackageActivities(
Wale Ogunwale31913b52018-10-13 08:29:31 -07006853 packageName, disabledClasses, true, false, userId) && booted) {
Louis Chang149d5c82019-12-30 09:47:39 +08006854 mRootWindowContainer.resumeFocusedStacksTopActivities();
Riddle Hsufc8ab262019-12-31 15:31:24 +08006855 mStackSupervisor.scheduleIdle();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006856 }
6857
6858 // Clean-up disabled tasks
6859 getRecentTasks().cleanupDisabledPackageTasksLocked(
6860 packageName, disabledClasses, userId);
6861 }
6862 }
6863
6864 @Override
6865 public boolean onForceStopPackage(String packageName, boolean doit, boolean evenPersistent,
6866 int userId) {
6867 synchronized (mGlobalLock) {
6868
6869 boolean didSomething =
6870 getActivityStartController().clearPendingActivityLaunches(packageName);
Louis Chang149d5c82019-12-30 09:47:39 +08006871 didSomething |= mRootWindowContainer.finishDisabledPackageActivities(packageName,
Wale Ogunwale31913b52018-10-13 08:29:31 -07006872 null, doit, evenPersistent, userId);
6873 return didSomething;
6874 }
6875 }
6876
6877 @Override
6878 public void resumeTopActivities(boolean scheduleIdle) {
6879 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08006880 mRootWindowContainer.resumeFocusedStacksTopActivities();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006881 if (scheduleIdle) {
Riddle Hsufc8ab262019-12-31 15:31:24 +08006882 mStackSupervisor.scheduleIdle();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006883 }
6884 }
6885 }
6886
Riddle Hsua0536432019-02-16 00:38:59 +08006887 @HotPath(caller = HotPath.PROCESS_CHANGE)
Wale Ogunwale31913b52018-10-13 08:29:31 -07006888 @Override
6889 public void preBindApplication(WindowProcessController wpc) {
Riddle Hsua0536432019-02-16 00:38:59 +08006890 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07006891 mStackSupervisor.getActivityMetricsLogger().notifyBindApplication(wpc.mInfo);
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 boolean attachApplication(WindowProcessController wpc) throws RemoteException {
Riddle Hsua0536432019-02-16 00:38:59 +08006898 synchronized (mGlobalLockWithoutBoost) {
Riddle Hsu2ca561b2019-10-08 21:58:58 +08006899 if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) {
6900 Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "attachApplication:" + wpc.mName);
6901 }
6902 try {
Louis Chang149d5c82019-12-30 09:47:39 +08006903 return mRootWindowContainer.attachApplication(wpc);
Riddle Hsu2ca561b2019-10-08 21:58:58 +08006904 } finally {
6905 Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
6906 }
Wale Ogunwale31913b52018-10-13 08:29:31 -07006907 }
6908 }
6909
6910 @Override
6911 public void notifyLockedProfile(@UserIdInt int userId, int currentUserId) {
6912 try {
6913 if (!AppGlobals.getPackageManager().isUidPrivileged(Binder.getCallingUid())) {
6914 throw new SecurityException("Only privileged app can call notifyLockedProfile");
6915 }
6916 } catch (RemoteException ex) {
6917 throw new SecurityException("Fail to check is caller a privileged app", ex);
6918 }
6919
6920 synchronized (mGlobalLock) {
6921 final long ident = Binder.clearCallingIdentity();
6922 try {
6923 if (mAmInternal.shouldConfirmCredentials(userId)) {
6924 if (mKeyguardController.isKeyguardLocked()) {
6925 // Showing launcher to avoid user entering credential twice.
6926 startHomeActivity(currentUserId, "notifyLockedProfile");
6927 }
Louis Chang149d5c82019-12-30 09:47:39 +08006928 mRootWindowContainer.lockAllProfileTasks(userId);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006929 }
6930 } finally {
6931 Binder.restoreCallingIdentity(ident);
6932 }
6933 }
6934 }
6935
6936 @Override
6937 public void startConfirmDeviceCredentialIntent(Intent intent, Bundle options) {
6938 mAmInternal.enforceCallingPermission(
6939 MANAGE_ACTIVITY_STACKS, "startConfirmDeviceCredentialIntent");
6940
6941 synchronized (mGlobalLock) {
6942 final long ident = Binder.clearCallingIdentity();
6943 try {
Pavel Grafovc0fe0a02019-05-13 18:19:33 +01006944 intent.addFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
6945 final ActivityOptions activityOptions = options != null
Wale Ogunwale31913b52018-10-13 08:29:31 -07006946 ? new ActivityOptions(options) : ActivityOptions.makeBasic();
Wale Ogunwale31913b52018-10-13 08:29:31 -07006947 mContext.startActivityAsUser(intent, activityOptions.toBundle(),
6948 UserHandle.CURRENT);
6949 } finally {
6950 Binder.restoreCallingIdentity(ident);
6951 }
6952 }
6953 }
6954
6955 @Override
6956 public void writeActivitiesToProto(ProtoOutputStream proto) {
6957 synchronized (mGlobalLock) {
6958 // The output proto of "activity --proto activities"
Wale Ogunwalef342f062020-01-27 07:34:13 -08006959 mRootWindowContainer.dumpDebug(
6960 proto, ROOT_WINDOW_CONTAINER, WindowTraceLogLevel.ALL);
Wale Ogunwale31913b52018-10-13 08:29:31 -07006961 }
6962 }
6963
6964 @Override
6965 public void saveANRState(String reason) {
6966 synchronized (mGlobalLock) {
6967 final StringWriter sw = new StringWriter();
6968 final PrintWriter pw = new FastPrintWriter(sw, false, 1024);
6969 pw.println(" ANR time: " + DateFormat.getDateTimeInstance().format(new Date()));
6970 if (reason != null) {
6971 pw.println(" Reason: " + reason);
6972 }
6973 pw.println();
6974 getActivityStartController().dump(pw, " ", null);
6975 pw.println();
6976 pw.println("-------------------------------------------------------------------------------");
6977 dumpActivitiesLocked(null /* fd */, pw, null /* args */, 0 /* opti */,
6978 true /* dumpAll */, false /* dumpClient */, null /* dumpPackage */,
6979 "" /* header */);
6980 pw.println();
6981 pw.close();
6982
6983 mLastANRState = sw.toString();
6984 }
6985 }
6986
6987 @Override
6988 public void clearSavedANRState() {
6989 synchronized (mGlobalLock) {
6990 mLastANRState = null;
6991 }
6992 }
6993
6994 @Override
6995 public void dump(String cmd, FileDescriptor fd, PrintWriter pw, String[] args, int opti,
6996 boolean dumpAll, boolean dumpClient, String dumpPackage) {
6997 synchronized (mGlobalLock) {
6998 if (DUMP_ACTIVITIES_CMD.equals(cmd) || DUMP_ACTIVITIES_SHORT_CMD.equals(cmd)) {
6999 dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
7000 } else if (DUMP_LASTANR_CMD.equals(cmd)) {
7001 dumpLastANRLocked(pw);
7002 } else if (DUMP_LASTANR_TRACES_CMD.equals(cmd)) {
7003 dumpLastANRTracesLocked(pw);
7004 } else if (DUMP_STARTER_CMD.equals(cmd)) {
7005 dumpActivityStarterLocked(pw, dumpPackage);
7006 } else if (DUMP_CONTAINERS_CMD.equals(cmd)) {
7007 dumpActivityContainersLocked(pw);
7008 } else if (DUMP_RECENTS_CMD.equals(cmd) || DUMP_RECENTS_SHORT_CMD.equals(cmd)) {
7009 if (getRecentTasks() != null) {
7010 getRecentTasks().dump(pw, dumpAll, dumpPackage);
7011 }
7012 }
7013 }
7014 }
7015
7016 @Override
7017 public boolean dumpForProcesses(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
7018 String dumpPackage, int dumpAppId, boolean needSep, boolean testPssMode,
7019 int wakefulness) {
7020 synchronized (mGlobalLock) {
7021 if (mHomeProcess != null && (dumpPackage == null
7022 || mHomeProcess.mPkgList.contains(dumpPackage))) {
7023 if (needSep) {
7024 pw.println();
7025 needSep = false;
7026 }
7027 pw.println(" mHomeProcess: " + mHomeProcess);
7028 }
7029 if (mPreviousProcess != null && (dumpPackage == null
7030 || mPreviousProcess.mPkgList.contains(dumpPackage))) {
7031 if (needSep) {
7032 pw.println();
7033 needSep = false;
7034 }
7035 pw.println(" mPreviousProcess: " + mPreviousProcess);
7036 }
7037 if (dumpAll && (mPreviousProcess == null || dumpPackage == null
7038 || mPreviousProcess.mPkgList.contains(dumpPackage))) {
7039 StringBuilder sb = new StringBuilder(128);
7040 sb.append(" mPreviousProcessVisibleTime: ");
7041 TimeUtils.formatDuration(mPreviousProcessVisibleTime, sb);
7042 pw.println(sb);
7043 }
7044 if (mHeavyWeightProcess != null && (dumpPackage == null
7045 || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
7046 if (needSep) {
7047 pw.println();
7048 needSep = false;
7049 }
7050 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
7051 }
7052 if (dumpPackage == null) {
7053 pw.println(" mGlobalConfiguration: " + getGlobalConfiguration());
Louis Chang149d5c82019-12-30 09:47:39 +08007054 mRootWindowContainer.dumpDisplayConfigs(pw, " ");
Wale Ogunwale31913b52018-10-13 08:29:31 -07007055 }
7056 if (dumpAll) {
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08007057 final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
7058 if (dumpPackage == null && topFocusedStack != null) {
7059 pw.println(" mConfigWillChange: " + topFocusedStack.mConfigWillChange);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007060 }
7061 if (mCompatModePackages.getPackages().size() > 0) {
7062 boolean printed = false;
7063 for (Map.Entry<String, Integer> entry
7064 : mCompatModePackages.getPackages().entrySet()) {
7065 String pkg = entry.getKey();
7066 int mode = entry.getValue();
7067 if (dumpPackage != null && !dumpPackage.equals(pkg)) {
7068 continue;
7069 }
7070 if (!printed) {
7071 pw.println(" mScreenCompatPackages:");
7072 printed = true;
7073 }
7074 pw.println(" " + pkg + ": " + mode);
7075 }
7076 }
7077 }
7078
7079 if (dumpPackage == null) {
7080 pw.println(" mWakefulness="
7081 + PowerManagerInternal.wakefulnessToString(wakefulness));
Louis Chang149d5c82019-12-30 09:47:39 +08007082 pw.println(" mSleepTokens=" + mRootWindowContainer.mSleepTokens);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007083 if (mRunningVoice != null) {
7084 pw.println(" mRunningVoice=" + mRunningVoice);
7085 pw.println(" mVoiceWakeLock" + mVoiceWakeLock);
7086 }
7087 pw.println(" mSleeping=" + mSleeping);
7088 pw.println(" mShuttingDown=" + mShuttingDown + " mTestPssMode=" + testPssMode);
7089 pw.println(" mVrController=" + mVrController);
7090 }
7091 if (mCurAppTimeTracker != null) {
7092 mCurAppTimeTracker.dumpWithHeader(pw, " ", true);
7093 }
7094 if (mAllowAppSwitchUids.size() > 0) {
7095 boolean printed = false;
7096 for (int i = 0; i < mAllowAppSwitchUids.size(); i++) {
7097 ArrayMap<String, Integer> types = mAllowAppSwitchUids.valueAt(i);
7098 for (int j = 0; j < types.size(); j++) {
7099 if (dumpPackage == null ||
7100 UserHandle.getAppId(types.valueAt(j).intValue()) == dumpAppId) {
7101 if (needSep) {
7102 pw.println();
7103 needSep = false;
7104 }
7105 if (!printed) {
7106 pw.println(" mAllowAppSwitchUids:");
7107 printed = true;
7108 }
7109 pw.print(" User ");
7110 pw.print(mAllowAppSwitchUids.keyAt(i));
7111 pw.print(": Type ");
7112 pw.print(types.keyAt(j));
7113 pw.print(" = ");
7114 UserHandle.formatUid(pw, types.valueAt(j).intValue());
7115 pw.println();
7116 }
7117 }
7118 }
7119 }
7120 if (dumpPackage == null) {
7121 if (mController != null) {
7122 pw.println(" mController=" + mController
7123 + " mControllerIsAMonkey=" + mControllerIsAMonkey);
7124 }
Andrii Kulianc598b2d2019-02-07 17:16:38 -08007125 pw.println(" mGoingToSleepWakeLock=" + mStackSupervisor.mGoingToSleepWakeLock);
7126 pw.println(" mLaunchingActivityWakeLock="
7127 + mStackSupervisor.mLaunchingActivityWakeLock);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007128 }
7129
7130 return needSep;
7131 }
7132 }
7133
7134 @Override
sanryhuang498e77e2018-12-06 14:57:01 +08007135 public void writeProcessesToProto(ProtoOutputStream proto, String dumpPackage,
7136 int wakeFullness, boolean testPssMode) {
Wale Ogunwale31913b52018-10-13 08:29:31 -07007137 synchronized (mGlobalLock) {
7138 if (dumpPackage == null) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007139 getGlobalConfiguration().dumpDebug(proto, GLOBAL_CONFIGURATION);
Darryl L Johnson1e3885c2020-02-27 17:38:13 -08007140 final ActivityStack topFocusedStack = getTopDisplayFocusedStack();
7141 if (topFocusedStack != null) {
7142 proto.write(CONFIG_WILL_CHANGE, topFocusedStack.mConfigWillChange);
7143 }
sanryhuang498e77e2018-12-06 14:57:01 +08007144 writeSleepStateToProto(proto, wakeFullness, testPssMode);
7145 if (mRunningVoice != null) {
7146 final long vrToken = proto.start(
7147 ActivityManagerServiceDumpProcessesProto.RUNNING_VOICE);
7148 proto.write(ActivityManagerServiceDumpProcessesProto.Voice.SESSION,
7149 mRunningVoice.toString());
Jeffrey Huangcb782852019-12-05 11:28:11 -08007150 mVoiceWakeLock.dumpDebug(
sanryhuang498e77e2018-12-06 14:57:01 +08007151 proto, ActivityManagerServiceDumpProcessesProto.Voice.WAKELOCK);
7152 proto.end(vrToken);
7153 }
Jeffrey Huangcb782852019-12-05 11:28:11 -08007154 mVrController.dumpDebug(proto,
sanryhuang498e77e2018-12-06 14:57:01 +08007155 ActivityManagerServiceDumpProcessesProto.VR_CONTROLLER);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007156 if (mController != null) {
7157 final long token = proto.start(CONTROLLER);
Wally Yau0eb29f62020-01-08 10:16:43 -08007158 proto.write(ActivityManagerServiceDumpProcessesProto.Controller.CONTROLLER,
7159 mController.toString());
Wale Ogunwale31913b52018-10-13 08:29:31 -07007160 proto.write(IS_A_MONKEY, mControllerIsAMonkey);
7161 proto.end(token);
7162 }
Jeffrey Huangcb782852019-12-05 11:28:11 -08007163 mStackSupervisor.mGoingToSleepWakeLock.dumpDebug(proto, GOING_TO_SLEEP);
7164 mStackSupervisor.mLaunchingActivityWakeLock.dumpDebug(proto,
Andrii Kulianc598b2d2019-02-07 17:16:38 -08007165 LAUNCHING_ACTIVITY);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007166 }
7167
7168 if (mHomeProcess != null && (dumpPackage == null
7169 || mHomeProcess.mPkgList.contains(dumpPackage))) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007170 mHomeProcess.dumpDebug(proto, HOME_PROC);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007171 }
7172
7173 if (mPreviousProcess != null && (dumpPackage == null
7174 || mPreviousProcess.mPkgList.contains(dumpPackage))) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007175 mPreviousProcess.dumpDebug(proto, PREVIOUS_PROC);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007176 proto.write(PREVIOUS_PROC_VISIBLE_TIME_MS, mPreviousProcessVisibleTime);
7177 }
7178
7179 if (mHeavyWeightProcess != null && (dumpPackage == null
7180 || mHeavyWeightProcess.mPkgList.contains(dumpPackage))) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007181 mHeavyWeightProcess.dumpDebug(proto, HEAVY_WEIGHT_PROC);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007182 }
7183
7184 for (Map.Entry<String, Integer> entry
7185 : mCompatModePackages.getPackages().entrySet()) {
7186 String pkg = entry.getKey();
7187 int mode = entry.getValue();
7188 if (dumpPackage == null || dumpPackage.equals(pkg)) {
7189 long compatToken = proto.start(SCREEN_COMPAT_PACKAGES);
7190 proto.write(PACKAGE, pkg);
7191 proto.write(MODE, mode);
7192 proto.end(compatToken);
7193 }
7194 }
7195
7196 if (mCurAppTimeTracker != null) {
Jeffrey Huangcb782852019-12-05 11:28:11 -08007197 mCurAppTimeTracker.dumpDebug(proto, CURRENT_TRACKER, true);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007198 }
7199
7200 }
7201 }
7202
7203 @Override
7204 public boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name,
7205 String[] args, int opti, boolean dumpAll, boolean dumpVisibleStacksOnly,
7206 boolean dumpFocusedStackOnly) {
Riddle Hsud7cd8ed2019-07-16 18:19:01 +08007207 return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti, dumpAll,
7208 dumpVisibleStacksOnly, dumpFocusedStackOnly);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007209 }
7210
7211 @Override
Wale Ogunwaled4d67d02018-10-25 18:09:39 -07007212 public void dumpForOom(PrintWriter pw) {
7213 synchronized (mGlobalLock) {
7214 pw.println(" mHomeProcess: " + mHomeProcess);
7215 pw.println(" mPreviousProcess: " + mPreviousProcess);
7216 if (mHeavyWeightProcess != null) {
7217 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
7218 }
7219 }
7220 }
7221
7222 @Override
Wale Ogunwale31913b52018-10-13 08:29:31 -07007223 public boolean canGcNow() {
7224 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007225 return isSleeping() || mRootWindowContainer.allResumedActivitiesIdle();
Wale Ogunwale31913b52018-10-13 08:29:31 -07007226 }
7227 }
7228
Riddle Hsua0536432019-02-16 00:38:59 +08007229 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwale31913b52018-10-13 08:29:31 -07007230 @Override
7231 public WindowProcessController getTopApp() {
Riddle Hsud7088f82019-01-30 13:04:50 +08007232 synchronized (mGlobalLockWithoutBoost) {
Louis Chang149d5c82019-12-30 09:47:39 +08007233 if (mRootWindowContainer == null) {
7234 // Return null if mRootWindowContainer not yet initialize, while update
Louis Chang3ff72a82019-12-17 12:12:59 +08007235 // oomadj after AMS created.
7236 return null;
7237 }
Louis Chang149d5c82019-12-30 09:47:39 +08007238 final ActivityRecord top = mRootWindowContainer.getTopResumedActivity();
Wale Ogunwale31913b52018-10-13 08:29:31 -07007239 return top != null ? top.app : null;
7240 }
7241 }
7242
Riddle Hsua0536432019-02-16 00:38:59 +08007243 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwale31913b52018-10-13 08:29:31 -07007244 @Override
7245 public void rankTaskLayersIfNeeded() {
Riddle Hsud7088f82019-01-30 13:04:50 +08007246 synchronized (mGlobalLockWithoutBoost) {
Louis Chang149d5c82019-12-30 09:47:39 +08007247 if (mRootWindowContainer != null) {
7248 mRootWindowContainer.rankTaskLayersIfNeeded();
Wale Ogunwale31913b52018-10-13 08:29:31 -07007249 }
7250 }
7251 }
7252
7253 @Override
7254 public void scheduleDestroyAllActivities(String reason) {
7255 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007256 mRootWindowContainer.scheduleDestroyAllActivities(reason);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007257 }
7258 }
7259
7260 @Override
7261 public void removeUser(int userId) {
7262 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007263 mRootWindowContainer.removeUser(userId);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007264 }
7265 }
7266
7267 @Override
7268 public boolean switchUser(int userId, UserState userState) {
7269 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007270 return mRootWindowContainer.switchUser(userId, userState);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007271 }
7272 }
7273
7274 @Override
7275 public void onHandleAppCrash(WindowProcessController wpc) {
7276 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007277 mRootWindowContainer.handleAppCrash(wpc);
Wale Ogunwale31913b52018-10-13 08:29:31 -07007278 }
7279 }
Wale Ogunwale64258362018-10-16 15:13:37 -07007280
7281 @Override
7282 public int finishTopCrashedActivities(WindowProcessController crashedApp, String reason) {
7283 synchronized (mGlobalLock) {
Louis Chang149d5c82019-12-30 09:47:39 +08007284 return mRootWindowContainer.finishTopCrashedActivities(crashedApp, reason);
Wale Ogunwale64258362018-10-16 15:13:37 -07007285 }
7286 }
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007287
Riddle Hsua0536432019-02-16 00:38:59 +08007288 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007289 @Override
7290 public void onUidActive(int uid, int procState) {
Riddle Hsua0536432019-02-16 00:38:59 +08007291 mActiveUids.onUidActive(uid, procState);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007292 }
7293
Riddle Hsua0536432019-02-16 00:38:59 +08007294 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007295 @Override
7296 public void onUidInactive(int uid) {
Riddle Hsua0536432019-02-16 00:38:59 +08007297 mActiveUids.onUidInactive(uid);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007298 }
7299
Riddle Hsua0536432019-02-16 00:38:59 +08007300 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007301 @Override
7302 public void onActiveUidsCleared() {
Riddle Hsua0536432019-02-16 00:38:59 +08007303 mActiveUids.onActiveUidsCleared();
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007304 }
7305
Riddle Hsua0536432019-02-16 00:38:59 +08007306 @HotPath(caller = HotPath.OOM_ADJUSTMENT)
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007307 @Override
7308 public void onUidProcStateChanged(int uid, int procState) {
Riddle Hsua0536432019-02-16 00:38:59 +08007309 mActiveUids.onUidProcStateChanged(uid, procState);
Wale Ogunwalebff2df42018-10-18 17:09:19 -07007310 }
Wale Ogunwale9de19442018-10-18 19:05:03 -07007311
7312 @Override
7313 public void onUidAddedToPendingTempWhitelist(int uid, String tag) {
Riddle Hsud7088f82019-01-30 13:04:50 +08007314 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9de19442018-10-18 19:05:03 -07007315 mPendingTempWhitelist.put(uid, tag);
7316 }
7317 }
7318
7319 @Override
7320 public void onUidRemovedFromPendingTempWhitelist(int uid) {
Riddle Hsud7088f82019-01-30 13:04:50 +08007321 synchronized (mGlobalLockWithoutBoost) {
Wale Ogunwale9de19442018-10-18 19:05:03 -07007322 mPendingTempWhitelist.remove(uid);
7323 }
7324 }
Wale Ogunwalee2172292018-10-25 10:11:10 -07007325
7326 @Override
7327 public boolean handleAppCrashInActivityController(String processName, int pid,
7328 String shortMsg, String longMsg, long timeMillis, String stackTrace,
7329 Runnable killCrashingAppCallback) {
7330 synchronized (mGlobalLock) {
7331 if (mController == null) {
7332 return false;
7333 }
7334
7335 try {
7336 if (!mController.appCrashed(processName, pid, shortMsg, longMsg, timeMillis,
7337 stackTrace)) {
7338 killCrashingAppCallback.run();
7339 return true;
7340 }
7341 } catch (RemoteException e) {
7342 mController = null;
7343 Watchdog.getInstance().setActivityController(null);
7344 }
7345 return false;
7346 }
7347 }
Wale Ogunwaled7889f52018-10-25 11:03:20 -07007348
7349 @Override
7350 public void removeRecentTasksByPackageName(String packageName, int userId) {
7351 synchronized (mGlobalLock) {
7352 mRecentTasks.removeTasksByPackageName(packageName, userId);
7353 }
7354 }
7355
7356 @Override
7357 public void cleanupRecentTasksForUser(int userId) {
7358 synchronized (mGlobalLock) {
7359 mRecentTasks.cleanupLocked(userId);
7360 }
7361 }
7362
7363 @Override
7364 public void loadRecentTasksForUser(int userId) {
7365 synchronized (mGlobalLock) {
7366 mRecentTasks.loadUserRecentsLocked(userId);
7367 }
7368 }
7369
7370 @Override
7371 public void onPackagesSuspendedChanged(String[] packages, boolean suspended, int userId) {
7372 synchronized (mGlobalLock) {
7373 mRecentTasks.onPackagesSuspendedChanged(packages, suspended, userId);
7374 }
7375 }
7376
7377 @Override
7378 public void flushRecentTasks() {
7379 mRecentTasks.flush();
7380 }
Wale Ogunwaled4d67d02018-10-25 18:09:39 -07007381
7382 @Override
7383 public WindowProcessController getHomeProcess() {
7384 synchronized (mGlobalLock) {
7385 return mHomeProcess;
7386 }
7387 }
7388
7389 @Override
7390 public WindowProcessController getPreviousProcess() {
7391 synchronized (mGlobalLock) {
7392 return mPreviousProcess;
7393 }
7394 }
Wale Ogunwale27c48ae2018-10-25 19:01:01 -07007395
7396 @Override
7397 public void clearLockedTasks(String reason) {
7398 synchronized (mGlobalLock) {
7399 getLockTaskController().clearLockedTasks(reason);
7400 }
7401 }
7402
7403 @Override
7404 public void updateUserConfiguration() {
7405 synchronized (mGlobalLock) {
7406 final Configuration configuration = new Configuration(getGlobalConfiguration());
7407 final int currentUserId = mAmInternal.getCurrentUserId();
7408 Settings.System.adjustConfigurationForUser(mContext.getContentResolver(),
7409 configuration, currentUserId, Settings.System.canWrite(mContext));
7410 updateConfigurationLocked(configuration, null /* starting */,
7411 false /* initLocale */, false /* persistent */, currentUserId,
7412 false /* deferResume */);
7413 }
7414 }
Wale Ogunwale387b34c2018-10-25 19:59:40 -07007415
7416 @Override
7417 public boolean canShowErrorDialogs() {
7418 synchronized (mGlobalLock) {
7419 return mShowDialogs && !mSleeping && !mShuttingDown
7420 && !mKeyguardController.isKeyguardOrAodShowing(DEFAULT_DISPLAY)
7421 && !hasUserRestriction(UserManager.DISALLOW_SYSTEM_ERROR_DIALOGS,
7422 mAmInternal.getCurrentUserId())
7423 && !(UserManager.isDeviceInDemoMode(mContext)
7424 && mAmInternal.getCurrentUser().isDemo());
7425 }
7426 }
Wale Ogunwale1f5e53d2018-11-05 05:12:46 -08007427
7428 @Override
7429 public void setProfileApp(String profileApp) {
7430 synchronized (mGlobalLock) {
7431 mProfileApp = profileApp;
7432 }
7433 }
7434
7435 @Override
7436 public void setProfileProc(WindowProcessController wpc) {
7437 synchronized (mGlobalLock) {
7438 mProfileProc = wpc;
7439 }
7440 }
7441
7442 @Override
7443 public void setProfilerInfo(ProfilerInfo profilerInfo) {
7444 synchronized (mGlobalLock) {
7445 mProfilerInfo = profilerInfo;
7446 }
7447 }
Igor Murashkinc0b47e42018-11-07 15:54:18 -08007448
7449 @Override
7450 public ActivityMetricsLaunchObserverRegistry getLaunchObserverRegistry() {
7451 synchronized (mGlobalLock) {
7452 return mStackSupervisor.getActivityMetricsLogger().getLaunchObserverRegistry();
7453 }
7454 }
Winson Chung3fb0f252019-01-08 17:41:55 -08007455
7456 @Override
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02007457 public ActivityManager.TaskSnapshot getTaskSnapshotNoRestore(int taskId,
Peter Kalauskas4dc04602020-02-12 18:49:03 -08007458 boolean isLowResolution) {
7459 return ActivityTaskManagerService.this.getTaskSnapshot(taskId, isLowResolution,
Jorim Jaggi925bb3c2019-06-04 19:51:45 +02007460 false /* restoreFromDisk */);
Winson Chung3fb0f252019-01-08 17:41:55 -08007461 }
Michal Karpinskicc88d7e2019-01-24 15:32:12 +00007462
7463 @Override
7464 public boolean isUidForeground(int uid) {
7465 synchronized (mGlobalLock) {
7466 return ActivityTaskManagerService.this.isUidForeground(uid);
7467 }
7468 }
Michal Karpinski4026cae2019-02-12 11:51:47 +00007469
7470 @Override
Ricky Wai96f5c352019-04-10 18:40:17 +01007471 public void setDeviceOwnerUid(int uid) {
Michal Karpinski4026cae2019-02-12 11:51:47 +00007472 synchronized (mGlobalLock) {
Ricky Wai96f5c352019-04-10 18:40:17 +01007473 ActivityTaskManagerService.this.setDeviceOwnerUid(uid);
Michal Karpinski4026cae2019-02-12 11:51:47 +00007474 }
7475 }
Ricky Wai2452e2d2019-03-18 19:19:08 +00007476
7477 @Override
7478 public void setCompanionAppPackages(int userId, Set<String> companionAppPackages) {
Michal Karpinskida34cd42019-04-02 19:46:52 +01007479 // Translate package names into UIDs
7480 final Set<Integer> result = new HashSet<>();
Ricky Wai2452e2d2019-03-18 19:19:08 +00007481 for (String pkg : companionAppPackages) {
Michal Karpinskida34cd42019-04-02 19:46:52 +01007482 final int uid = getPackageManagerInternalLocked().getPackageUid(pkg, 0, userId);
7483 if (uid >= 0) {
7484 result.add(uid);
7485 }
Ricky Wai2452e2d2019-03-18 19:19:08 +00007486 }
7487 synchronized (mGlobalLock) {
Michal Karpinskida34cd42019-04-02 19:46:52 +01007488 mCompanionAppUidsMap.put(userId, result);
Ricky Wai2452e2d2019-03-18 19:19:08 +00007489 }
7490 }
Wale Ogunwale6767eae2018-05-03 15:52:51 -07007491 }
Wale Ogunwaleb73f3962018-11-20 07:58:22 -08007492}